Skip to content

Instantly share code, notes, and snippets.

@NikitaIT
Last active July 7, 2020 21:37
Show Gist options
  • Save NikitaIT/ab18651361b01fe1416b6f0f6571600f to your computer and use it in GitHub Desktop.
Save NikitaIT/ab18651361b01fe1416b6f0f6571600f to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
// Available variables:
// - Machine
// - interpret
// - assign
// - send
// - sendParent
// - spawn
// - raise
// - actions
// - XState (all XState exports)
const state = {
idle: 'idle',
autobinding: 'autobinding',
success: 'success',
failure: 'failure',
onAutobinding: 'onAutobinding',
offAutobinding: 'offAutobinding',
cpc: 'cpc',
cpm: 'cpm',
maxView: 'maxView',
maxClick: 'maxClick'
};
const tt = `рекламных форматов в ленте новостей`;
const tt1 = `содержащих ссылку/кнопку/сниппет, за исключением записей со статьями и опросами.`;
const tt3 = `с оплатой за 1000 показов (CPM)`;
const tt4 = `рекламных форматов в ленте новостей, а также для рекламы в Историях.`;
const cpm = '30 < _ < 1000 rub';
const cpmMax = '30 < _ < 1000 rub';
const cpcMax = '0.10 < _ < 150 rub';
const reqMax = '0.10 < _ < 10000 rub';
// reqMax day_limit = [100..1000000000]
// reqMax только autobind (на обуч?)
// goal_type 3 cost_type 3 ad_format 9?
// что значит в вк редактировать форму?
const req = 'только для формата Сбор заявок';
const subscribtion = `только для формата Запись с кнопкой. Доступные кнопки: Вступить, Подписаться, Я пойду. И сообщество, от лица которого создано объявление. И Изменить/удалить кнопку или ссылку в ней нельзя. И Сообщество, от имени которого создано объявление, по-умолчанию находится в исключениях настроек объявления, убрать его нельзя.`;
const subMax = '1 < _ < 500 rub';
const cpc = '0.10 < _ < 150 rub';
const upAutobinding = updateSingle('autobidding');
const fetchMachine = Machine({
id: 'fetch',
initial: state.cpm,
context: {
retries: 0,
goal_type: 1,
cost_type: 1,
cpm: 5564,
autobidding_max_cost: 1,
autobidding: 0
},
states: {
// [state.idle]: {
// on: {
// FETCH: state.loading,
// a: {
// target: state.loading,
// actions: assign({
// goal_type: (context, event) => context.goal_type = 2
// })
// },
// }
// },
[state.cpm]: {
on: {
update: {
target: state.cpm,
cond: { type: cpm }
},
onAutobinding: {
target: state.onAutobinding,
actions: upAutobinding(1)
}
}
},
[state.cpc]: {
on: {
update: {
target: state.cpc,
cond: { type: cpc }
},
cpm: state.cpm,
activities: ['activateCrosswalkLight'],
}
},
[state.onAutobinding]: {
on: {
view: [
{
target: state.maxView,
cond: { type: tt3 }
},
{
target: state.maxView,
cond: { type: tt4 }
},
],
click: [
{
target: state.maxClick,
cond: { type: tt }
},
{
target: state.maxClick,
cond: { type: tt1 }
},
],
'вступления': {
target: 'за вступления',
cond: { type: subscribtion },
},
'заявки': {
target: 'за заявки',
cond: { type: req },
},
day_limit: state.onAutobinding,
off: {
target: state.offAutobinding,
actions: upAutobinding(0)
}
}
},
'за вступления': { // подписки
on: {
// cpm = auto
// платишь за cpm
// период обучения?
// у их dl для выхода из локального максимума
// нужно добавить 1-5 rub
// у их dl функция максимизации, по этому
// надо ставить ниже желаемой
next: state.onAutobinding,
update: [
{
target: 'за вступления',
cond: { type: subMax }
}
],
},
},
'за заявки': {
// cpm = auto
// платишь за cpm
// период обучения?
on: {
next: state.onAutobinding,
update: [
{
target: 'за заявки',
cond: { type: reqMax }
}
],
},
},
[state.maxView]: {
on: {
next: state.onAutobinding,
update: [
{
target: state.maxView,
cond: { type: cpmMax }
}
],
},
},
[state.maxClick]: {
// платишь за cpm
on: {
next: state.onAutobinding,
update: [
{
target: state.maxClick,
cond: { type: cpcMax }
}
],
},
},
[state.offAutobinding]: {
on: {
cpm: state.cpm,
cpc: state.cpc,
on: {
target: state.onAutobinding,
actions: upAutobinding(1)
}
}
},
// [state.success]: {
// type: 'final'
// },
}
},
{
guards: {
[tt]: (context, event) => true,
[tt1]: (context, event) => true,
[cpm]: (context, event) => true,
[cpc]: (context, event) => true,
[cpmMax]: (context, event) => true,
[cpcMax]: (context, event) => true,
[req]: (context, event) => true,
[reqMax]: (context, event) => true,
[subscribtion]: (context, event) => true,
[subMax]: (context, event) => true,
}
});
function updateSingle(prop) {
return (value) => assign({
[prop]: (context, event) => context[prop] = value
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment