#include "stg/admin.h"
#include "user_impl.h"
#include "settings_impl.h"
+#include "stg_timer.h"
#ifdef USE_ABSTRACT_SETTINGS
USER_IMPL::USER_IMPL(const SETTINGS * s,
const TARIFFS * t,
const ADMIN * a,
const USERS * u)
- : users(u),
+ : USER(),
+ users(u),
property(s->GetScriptsDir()),
WriteServLog(GetStgLogger()),
login(),
sysAdmin(a),
store(st),
tariffs(t),
- tariff(tariffs->GetNoTariff()),
+ tariff(NULL),
cash(property.cash),
up(property.up),
down(property.down),
password = "*_EMPTY_PASSWORD_*";
tariffName = NO_TARIFF_NAME;
connected = 0;
-tariff = tariffs->GetNoTariff();
ips = StrToIPS("*");
deleted = false;
lastWriteStat = stgTime + random() % settings->GetStatWritePeriod();
const TARIFFS * t,
const ADMIN * a,
const USERS * u)
- : users(u),
+ : USER(),
+ users(u),
property(s->GetScriptsDir()),
WriteServLog(GetStgLogger()),
login(),
sysAdmin(a),
store(st),
tariffs(t),
- tariff(tariffs->GetNoTariff()),
+ tariff(NULL),
cash(property.cash),
up(property.up),
down(property.down),
password = "*_EMPTY_PASSWORD_*";
tariffName = NO_TARIFF_NAME;
connected = 0;
-tariff = tariffs->GetNoTariff();
ips = StrToIPS("*");
deleted = false;
lastWriteStat = stgTime + random() % settings->GetStatWritePeriod();
#endif
//-----------------------------------------------------------------------------
USER_IMPL::USER_IMPL(const USER_IMPL & u)
- : users(u.users),
+ : USER(),
+ users(u.users),
property(u.settings->GetScriptsDir()),
WriteServLog(GetStgLogger()),
login(u.login),
return true;
}
-if (settings->GetShowFeeInCash())
+if (settings->GetShowFeeInCash() || tariff == NULL)
{
return (cash >= -credit);
}
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-if (!connected)
+if (!connected || tariff == NULL)
return;
double cost = 0;
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-if (!connected)
+if (!connected || tariff == NULL)
return;
double cost = 0;
else
{
property.tariffName.Set(nextTariff, sysAdmin, login, store);
- tariff = nt;
+ //tariff = nt;
}
ResetNextTariff();
WriteConf();
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-if (passive.ConstData())
+if (passive.ConstData() || tariff == NULL)
return;
double fee = tariff->GetFee() / DaysInCurrentMonth();
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+if (tariff == NULL)
+ return;
+
double passiveTimePart = 1.0;
if (!settings->GetFullFee())
{
ResetPassiveTime();
if (fee == 0.0)
+ {
+ SetPrepaidTraff();
return;
+ }
double c = cash;
printfd(__FILE__, "login: %8s Fee=%f PassiveTimePart=%f fee=%f\n",
{
case 0:
property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ SetPrepaidTraff();
break;
case 1:
if (c > 0)
+ {
property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ SetPrepaidTraff();
+ }
break;
case 2:
if (c > fee)
+ {
property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ SetPrepaidTraff();
+ }
break;
}
}
//-----------------------------------------------------------------------------
void USER_IMPL::SetPrepaidTraff()
{
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-
-property.freeMb.Set(tariff->GetFree(), sysAdmin, login, store, "Prepaid traffic");
+if (tariff != NULL)
+ property.freeMb.Set(tariff->GetFree(), sysAdmin, login, store, "Prepaid traffic");
}
//-----------------------------------------------------------------------------
int USER_IMPL::AddMessage(STG_MSG * msg)
//-----------------------------------------------------------------------------
void CHG_PASSIVE_NOTIFIER::Notify(const int & oldPassive, const int & newPassive)
{
-if (newPassive && !oldPassive)
+if (newPassive && !oldPassive && user->tariff != NULL)
user->property.cash.Set(user->cash - user->tariff->GetPassiveCost(),
user->sysAdmin,
user->login,
//-----------------------------------------------------------------------------
void CHG_TARIFF_NOTIFIER::Notify(const string &, const string & newTariff)
{
+if (user->settings->GetReconnectOnTariffChange() && user->connected)
+ user->Disconnect(false, "Change tariff");
user->tariff = user->tariffs->FindByName(newTariff);
+if (user->settings->GetReconnectOnTariffChange() &&
+ !user->authorizedBy.empty() &&
+ user->IsInetable())
+ user->Connect(false);
}
//-----------------------------------------------------------------------------
void CHG_CASH_NOTIFIER::Notify(const double & oldCash, const double & newCash)
{
printfd(__FILE__, "Change IP from '%s' to '%s'\n", from.GetIpStr().c_str(), to.GetIpStr().c_str());
if (user->connected)
- user->Disconnect(true, "Change IP");
- if (user->IsInetable())
- user->Connect(true);
+ user->Disconnect(false, "Change IP");
+ if (!user->authorizedBy.empty() && user->IsInetable())
+ user->Connect(false);
}
//-----------------------------------------------------------------------------