Перейти до

Дисконект юзера по окончании предоплаченного трафика


Рекомендованные сообщения

Делал ли кто либо такую связку, реализовывал ли такую возможность при таковой ситуации?

Т.е. - проплатил пользователь 300 грн, при тарифном плане 50 грн/мес, абонплата снялась согласно тарифному плану, остаток на счету 250 грн и при достижении своего порога (например 5 Гб) интернет отключался.

 

ЗЫ: не очень удобно выходит, когда после достижения порога интернет считается по иному (помегабайтному) тарифу.

Ссылка на сообщение
Поделиться на других сайтах

Подключение абонентов каким способом происходит?

 

Если например все абоненты пользуются авторизатором, тогда можно в скрипт ОнКоннект добавить проверку -

Если текущий трафик меньше 5 Гб, тогда проводить подключение, иначе выдать сообщение в авторизатор - Вы превысили лимит трафика.

 

А, читать трафик можно из файла stat, если у вас БД на файлах.

 

Если же например у вас реализовано через СУБД - тогда читать из базы этот параметр.

 

Ну и еще следить за трафиком, когда юзер в это время онлайн и он превысил лимит - пока такого ничего в голову не приходит, может еще товарищ madf посоветует.

Ссылка на сообщение
Поделиться на других сайтах

Хз, я для такого просто при достижении конкретного порога в Х% от номинала тарифа засовываю пользователей в отдельную табличку (что там будет - динай или хитрый пайп уже не суть важно). Ровно три с половиной квериза.

 

А вобще писанины включая дебаг и вылизывание с распитием спиртных напитков - там на час.

 

Всего-то складировать куда-надо кроном SELECT `ip` from `users` WHERE `tariff`='xxxxx' AND `D0`+`U0`>yyyy

Ссылка на сообщение
Поделиться на других сайтах

Вроде ничего не придумывается кроме как по крону опрашивать список на предмет отсутствия FreeMB и делать им disable.

 

Ну еще можно подпатчить метод IsInetable в файле user.cpp чтобы он срабатывал по этому признаку.

Ссылка на сообщение
Поделиться на других сайтах

Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

Ссылка на сообщение
Поделиться на других сайтах

Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя.

но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"?

 

ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают.

Ссылка на сообщение
Поделиться на других сайтах
Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

При методе коллекции нетфловом сессии тоже не все одновременно експайрятся и пишутся в базу.

 

Если стартовать скрипт скажем сразу после StatWritePeriod = 10 то при скорости 1 мбит у пользователя может набежать аж 76 мег. Быстрее чем StatWritePeriod всеравно не будет поскольку банально неоткуда будет брать изменение трафика за период.

 

. т.е. все (или большинство) просто продают трафик помегабайтно

нет, все давно продают анлимы :o

 

а сверх лимита очень быстро деньги убегают.

а кто у вас на кого работает?

 

Ну выставьте цену послепороговую в 0 если так о неконтролирующих себя пользователях печетесь и отламываейте их скриптом как указано выше сразу после StatWrite героически жертвуя своими 76 мб :o

 

Конечно можно писать детальную стату и раз в минуту но это бред.

Ссылка на сообщение
Поделиться на других сайтах

Если вешать скрипт на крон, тогда точности в 5 Гб, не достигнуть, между запусками скрипта, юзер может перевалить за 5 Гб.

возникла мысль find-ом лазить в файл stat пользователя (БД - файловая). при достижении величины больше тарифного плана, то отключать пользователя.

но как поступать, когда несколько тарифных планов с разной "абонплатой/объём трафика"?

 

ЗЫ: я так понимаю ни у кого такой задачи не стояло. т.е. все (или большинство) просто продают трафик помегабайтно. у нас просто схема предоплаты 1го числа за определенный объём, а сверх лимита очень быстро деньги убегают.

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

Ссылка на сообщение
Поделиться на других сайтах
Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

а, кстати да - что-то ступил :o

 

А у анлимов часом не всегда 0? Ну тогда <0, да?

 

Ну тобишь так SELECT `ip` from `users` WHERE `FreeMb`<0 ?

Ссылка на сообщение
Поделиться на других сайтах

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

 

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

 

Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя.

Ссылка на сообщение
Поделиться на других сайтах
Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

можно, в чем проблема? только что-то мне подсказывает что вы зае....сь реалтайм траффик мониторить :o

Ссылка на сообщение
Поделиться на других сайтах

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat? и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию?

Ссылка на сообщение
Поделиться на других сайтах
действительно ли этот StatWritePeriod параметр отвечает за периодичность записи в файл stat?

[sarcasm]нет блин, он чисто по приколу рассматривает этот параметр[/sarcasm]

 

и как будет вести себя СТГ при 500 пользователях постоянно записывая эту информацию?

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

Ссылка на сообщение
Поделиться на других сайтах

Для реалтайма надо установить нотификатор на изменения property.freeMb и при переходе через 0 выполнять действия. Но это значительное вмешательство в код.

И да, он действительно пишет в соответстсвии со StatWritePeriod. И на 500 нормально, и на 6000 нормально. В т.ч. нормально на файловой базе и на PostgreSQL. По MySQL у меня данных нет, но думаю что и там нормально.

Ссылка на сообщение
Поделиться на других сайтах

Зачем так сложно? В stat есть поле FreeMb. Сравниваем его с нулем и принимаем решение.

 

Очень даже логично - и тогда это решает вопрос с тем, что порог у тарифных планах разные.

Но, вот как для красоты сделать, чтобы четко рубало при достижении порога.

 

madf, если я не ошибаюсь, стж изначально держит трафик в памяти, потом при записи в стату - память обнуляется?

 

Идея - но для этого нужно реализовывать отдельный процесс, которые будет всегда следить за трафиком - и этот же процесс будет рубать пользователя.

Держит в памяти и не обнуляет при записи. Обнуляет в момент перехода через полночь или при отключении авторизатора. И то - только за сессию. Месачный обнуляется при переходе через месяц.

Зачем отдельный? Stargazer и так следит за трафиком.

Ссылка на сообщение
Поделиться на других сайтах

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

 

:) Ну, это конечно гон уже писать раз в минуту стату.

 

madf, не могли бы вы немного рассказать как СТЖ держит в памяти данные о трафике, и как можно было бы эти данные вытянуть - чисто для личного развития.

Ссылка на сообщение
Поделиться на других сайтах
Ну, это конечно гон уже писать раз в минуту стату.

извините, тег sarcasm закрыл не там где надо :)

 

и как можно было бы эти данные вытянуть - чисто для личного развития.

подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором.

 

Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть.

Ссылка на сообщение
Поделиться на других сайтах

точно так же как и при любом другом количестве - будет молотить UPDATE-ами раз в период, а что - собрались раз в минуту траффик дампить?

 

:) Ну, это конечно гон уже писать раз в минуту стату.

 

madf, не могли бы вы немного рассказать как СТЖ держит в памяти данные о трафике, и как можно было бы эти данные вытянуть - чисто для личного развития.

Отчего ж не рассказать, раскажу. Очень просто держит. В приватных членах класса USER - шаблонных переменных типа USER_PROPERTY<тип> (см. user_property.h). Из методов класса USER (см. user.h) доступ можно получить непосредственно по именам, как это, например, сделано в методе записи статистики:

int USER::WriteStat()                                                                   
{                                                                                       
STG_LOCKER lock(&mutex, __FILE__, __LINE__);                                            
USER_STAT us;                                                                           

us.up = up;                                                                             
us.down = down;                                                                         
us.cash = cash;                                                                         
us.freeMb = freeMb;                                                                     
us.lastCashAdd = lastCashAdd;                                                           
us.lastCashAddTime = lastCashAddTime;                                                   
us.passiveTime = passiveTime;                                                           
us.lastActivityTime = lastActivityTime;                                                 

printfd(__FILE__, "USER::WriteStat()\n");                                               

if (store->SaveUserStat(us, login))                                                     
   {                                                                                   
   WriteServLog("Cannot write stat for user %s.", login.c_str());                      
   WriteServLog("%s", store->GetStrError().c_str());                                   
   printfd(__FILE__, "Cannot write stat for user %s.\n", login.c_str());               
   printfd(__FILE__, "%s\n", store->GetStrError().c_str());                            
   return -1;                                                                          
   }                                                                                   

lastWriteStat = stgTime;                                                                

return 0;                                                                               
}          

(перемнные up, down, cash. freeMb, и т.д.). "Снаружи", из методов других классов доступ можно получить через публичный член класса property (см. user_property.h), используя методы Get и Set. Например:

user_iter u;

if (users->FindByName("vasya_pupkin", &u))
   {
   return -1;
   }

double cash = u->property.cash.Get();
u->property.freeMb.Set(100, currAdmin, "vasya_pupkin", store, "100 грн на шару!");

currAdmin - указатель на переменную типа ADMIN (см. admin.h), описывающую админа который получил доступ к системе.

store - указатель на переменную класса BASE_STORE (см. base_store.h), предоставляющую интерфейс к БД.

Последний параметр у Set - текстовый комментарий к изменению.

Добавлю, что данные о трафике (up и down) представлены типами DIR_TRAFF (см. user_traff.h), представляющими собой класс-обертку над массивом типа uint64_t[DIR_NUM], где DIR_NUM - максимальное количество направлений тарификации в системе.

Ссылка на сообщение
Поделиться на других сайтах
и как можно было бы эти данные вытянуть - чисто для личного развития.

подозреваю что увидеть их можно только при помощи sgconfxml либо нативным конфигуратором.

 

Есть чувствие что --d0 берет данные не из базы, хотя нада сорц посмотреть.

Не из базы. Из памяти. Это ж данные за сессию, а не месячные.

Ссылка на сообщение
Поделиться на других сайтах

Можно тупо написать плагин в котором поставить нотификаторы на изменение freeMb и отключать/включать юзера. К стати очень простой плагин, даже без внутреннего потока. Буквально 2-3 функции. И будет вам реалтаймовость и все такое.

Ссылка на сообщение
Поделиться на других сайтах

А, вообще можно по-интересоваться у автора темы, для чего такое делать. Все известные мне провайдеры, самопальные локалки и т.д. пытаются заработать как можно больше денег, и того как бы продать по-больше трафика = больше продал - больше заработал. Почему не давать юзеру, чтобы он дальше пользовался инэтом, пусть просто платит больше денег - и того больше прибыль.

 

ЗЫ:

madf, благодарю за лекцию.

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...