Exemple #1
0
	Date operator +(const Date& date, const Days& days)
	{
		return detail::EpochDaysToDate(detail::DateToEpochDays(date) + days.count());
	}
Exemple #2
0
	inline void Formatter(FormatData& formatData, const Days& days)
	{
		Formatter(formatData, days.count());

		formatData.string.push_back(U'd');
	}
Exemple #3
0
int main () {

  auto system_start = chrono::system_clock::now();

  /** Durations */

  chrono::duration<int> twentySeconds(20);  // Базова ЕИ - секунда
  cout << twentySeconds.count() << endl;

  /** Используем рациональные числа, с целью представления значений duration в других ЕИ времени */
  chrono::duration<double,ratio<60>> halfAMinute(0.5);    // 0.5 * ratio<60,1>
  cout << halfAMinute.count() << endl;

  chrono::duration<long,ratio<1,1000>> oneMillisecond(1);
  cout << oneMillisecond.count() << endl;

  // Вывод: 29999 ms
  cout << "diff: " << (halfAMinute - oneMillisecond).count() << " ms" << endl;


  /** По аналогии опредеены и типы пространства имен chrono */
  /** Например: typedef duration<signed int-type>=29 bits, ratio<60>> minutes; */
  chrono::minutes threeHours(180);  // Три часа
  cout << chrono::duration_cast<chrono::hours>(threeHours).count() << "hours" << endl;

  // Выполняем печать с помощью перегруженной функции
  chrono::hours hh = chrono::duration_cast<chrono::hours>(threeHours);
  cout << "180 minutes is = " << hh << endl;

  /** Приведение вещественных значенией интервала */
  chrono::seconds ss = chrono::duration_cast<chrono::seconds>(halfAMinute);
  cout << "half a minute is " << halfAMinute << endl;

  /** Разложение интервала на hh::mm::ss */
  chrono::milliseconds ms(7255101);

  chrono::hours h1 = chrono::duration_cast<chrono::hours>(ms);
  chrono::minutes m1 = chrono::duration_cast<chrono::minutes>(ms % chrono::hours(1));
  chrono::seconds s1 = chrono::duration_cast<chrono::seconds>(ms % chrono::minutes(1));
  chrono::milliseconds ms1 = chrono::duration_cast<chrono::milliseconds>(ms % chrono::seconds(1));

  cout << ms.count() << " ms is " << setfill('0')
       << setw(2) << h1.count() << "::"
       << setw(2) << m1.count() << "::"
       << setw(2) << s1.count() << "::"
       << setw(3) << ms1.count() << endl;



  /** Clocks and timepoints */
  cout << endl;
  cout << "\nsystem_clock: " << endl;
  printClockData<chrono::system_clock>();
  cout << "\nhigh_resolution_clock: " << endl;
  printClockData<chrono::high_resolution_clock>();
  cout << "\nsteady_clock: " << endl;
  printClockData<chrono::steady_clock>();


  // Даем нагрузку
  for (int i = 0; i < 10000000; i++) {
    continue;
  }


  // Время провдолжительности работы программы
  auto diff = chrono::system_clock::now() - system_start;
  auto sec = chrono::duration_cast<chrono::milliseconds>(diff);

  cout << "Program runs: " << sec.count() << " ms" << endl;


  /** Timepoints */

  // Печатаем начало времен для системных часов
  chrono::system_clock::time_point tp;
  cout << "epoch: " << asString(tp) << endl;

  // Печатаем текущее время
  tp = chrono::system_clock::now();
  cout << "now: " << asString(tp) << endl;

  // Печатаем предел слева для часов системного времени
  tp = chrono::system_clock::time_point::min();
  cout << "min: " << asString(tp) << endl;

  // Печатаем предел справа для часов системного времени
  tp = chrono::system_clock::time_point::max();
  cout << "max: " << asString(tp) << endl;

  /** Timepoint arithmetics */

  // Определяем период равный одному дню
  typedef chrono::duration<int,ratio<24*3600>> Days;

  // Определяем значение времени по системным часам
  chrono::time_point<chrono::system_clock> tp_1; // Эквивалентно system_clock::time_point
  cout << "epoch: " << asString(tp_1) << endl;

  // Добавляем один день 23 часа и 55 миут
  tp_1 += Days(1) + chrono::hours(23) + chrono::minutes(55);
  cout << "later: "<< asString(tp_1) << endl;

  // Вычисляем разницу в минутах и днях
  diff = tp_1 - chrono::system_clock::time_point();
  cout << "diff: "
       << chrono::duration_cast<chrono::minutes>(diff).count()
       << " minutes." << endl;
  // Преобразуем относительно введенного нами типа данных
  Days days = chrono::duration_cast<Days>(diff);
  cout << "diff: " << days.count() << "day(s)" << endl;

  // Вычитаем один год (предположительно вычитаемый год является высокосным)
  tp_1 -= chrono::hours(24*365);
  cout << "-1 year: " << asString(tp_1) << endl;

  // Вычисляем 50 лет (утрируем и считаем год равным 365 дням)
  tp_1 -= chrono::duration<int,ratio<3600*24*365>>(50);
  cout << "-50 years: " << asString(tp_1) << endl;

  // Еще раз вычитаем 50 лет
  tp_1 -= chrono::duration<int,ratio<3600*24*365>>(50);
  cout << "-50 years: " << asString(tp_1) << endl;

  /** timepoint/calendar conversion */
  auto tp_m1 = makeTimePoint(2010,01,01,00,00);
  cout << "Make timepoint(1): " << asString(tp_m1) << endl;

  auto tp_m2 = makeTimePoint(2011,05,23,13,44);
  cout << "Make timepoint(2):" << asString(tp_m2) << endl;

  // Добавляем 50 лет к созданной точке времени
  tp_m1 += chrono::duration<int,ratio<3600*24*365>>(50);
  cout << "Add to timepoint(1) 50 years: " << asString(tp_m1) << endl;

  exit(EXIT_SUCCESS);

}
bool ProtocolLogin::parseFirstPacket(NetworkMessage& msg)
{
	if(server.game().getGameState() == GAME_STATE_SHUTDOWN)
	{
		getConnection()->close();
		return false;
	}

	uint32_t clientIp = getConnection()->getIP();
	/*uint16_t operatingSystem = msg.GetU16();*/msg.SkipBytes(2);
	uint16_t version = msg.GetU16();

	msg.SkipBytes(12);
	if(!RSA_decrypt(msg))
	{
		getConnection()->close();
		return false;
	}

	uint32_t key[4] = {msg.GetU32(), msg.GetU32(), msg.GetU32(), msg.GetU32()};
	enableXTEAEncryption();
	setXTEAKey(key);

	std::string name = msg.GetString(), password = msg.GetString();
	if(name.empty())
	{
		if(!server.configManager().getBool(ConfigManager::ACCOUNT_MANAGER))
		{
			disconnectClient(0x0A, "Invalid account name.");
			return false;
		}

		name = "1";
		password = "******";
	}

	if(version < CLIENT_VERSION_MIN || version > CLIENT_VERSION_MAX)
	{
		disconnectClient(0x0A, CLIENT_VERSION_STRING);
		return false;
	}

	if(server.game().getGameState() < GAME_STATE_NORMAL)
	{
		disconnectClient(0x0A, "Server is just starting up, please wait.");
		return false;
	}

	if(server.game().getGameState() == GAME_STATE_MAINTAIN)
	{
		disconnectClient(0x0A, "Server is under maintenance, please re-connect in a while.");
		return false;
	}

	if(ConnectionManager::getInstance()->isDisabled(clientIp, protocolId))
	{
		disconnectClient(0x0A, "Too many connections attempts from your IP address, please try again later.");
		return false;
	}

	if(IOBan::getInstance()->isIpBanished(clientIp))
	{
		disconnectClient(0x0A, "Your IP is banished!");
		return false;
	}

	uint32_t id = 1;
	if(!IOLoginData::getInstance()->getAccountId(name, id))
	{
		ConnectionManager::getInstance()->addAttempt(clientIp, protocolId, false);
		disconnectClient(0x0A, "Invalid account name.");
		return false;
	}

	AccountP account = IOLoginData::getInstance()->loadAccount(id);
	if (account == nullptr) {
		disconnectClient(0x0A, "Invalid account name.");
		return false;
	}

	if(!encryptTest(password, account->getPassword()))
	{
		ConnectionManager::getInstance()->addAttempt(clientIp, protocolId, false);
		disconnectClient(0x0A, "Invalid password.");
		return false;
	}

	Ban ban;
	ban.value = account->getId();

	ban.type = BAN_ACCOUNT;
	if(IOBan::getInstance()->getData(ban) && !IOLoginData::getInstance()->hasFlag(account->getId(), PlayerFlag_CannotBeBanned))
	{
		bool deletion = ban.expires < 0;
		std::string name_ = "Automatic ";
		if(!ban.adminId)
			name_ += (deletion ? "deletion" : "banishment");
		else
			IOLoginData::getInstance()->getNameByGuid(ban.adminId, name_, true);

		char buffer[500 + ban.comment.length()];
		sprintf(buffer, "Your account has been %s at:\n%s by: %s,\nfor the following reason:\n%s.\nThe action taken was:\n%s.\nThe comment given was:\n%s.\nYour %s%s.",
			(deletion ? "deleted" : "banished"), formatDateShort(ban.added).c_str(), name_.c_str(),
			getReason(ban.reason).c_str(), getAction(ban.action, false).c_str(), ban.comment.c_str(),
			(deletion ? "account won't be undeleted" : "banishment will be lifted at:\n"),
			(deletion ? "." : formatDateShort(ban.expires, true).c_str()));

		disconnectClient(0x0A, buffer);
		return false;
	}

	const Account::Characters& characters = account->getCharacters();
	if(!server.configManager().getBool(ConfigManager::ACCOUNT_MANAGER) && characters.empty())
	{
		disconnectClient(0x0A, std::string("This account does not contain any character yet.\nCreate a new character on the "
			+ server.configManager().getString(ConfigManager::SERVER_NAME) + " website at " + server.configManager().getString(ConfigManager::URL) + ".").c_str());
		return false;
	}

	ConnectionManager::getInstance()->addAttempt(clientIp, protocolId, true);
	if(OutputMessage_ptr output = OutputMessagePool::getInstance()->getOutputMessage(this, false))
	{
		TRACK_MESSAGE(output);
		output->AddByte(0x14);

		char motd[1300];
		sprintf(motd, "%d\n%s", server.game().getMotdId(), server.configManager().getString(ConfigManager::MOTD).c_str());
		output->AddString(motd);

		uint32_t serverIp = serverIps[0].first;
		for(IpList::iterator it = serverIps.begin(); it != serverIps.end(); ++it)
		{
			if((it->first & it->second) != (clientIp & it->second))
				continue;

			serverIp = it->first;
			break;
		}

		//Add char list
		output->AddByte(0x64);
		if(server.configManager().getBool(ConfigManager::ACCOUNT_MANAGER) && id != 1)
		{
			output->AddByte(characters.size() + 1);
			output->AddString("Account Manager");
			output->AddString(server.configManager().getString(ConfigManager::SERVER_NAME));
			output->AddU32(serverIp);
			output->AddU16(server.configManager().getNumber(ConfigManager::GAME_PORT));
		}
		else
			output->AddByte((uint8_t)characters.size());

		for (auto it = characters.cbegin(); it != characters.cend(); ++it) {
			auto& character = *it;

#ifndef __LOGIN_SERVER__
			output->AddString(character->getName());
			output->AddString(character->getType());
			output->AddU32(serverIp);
			output->AddU16(server.configManager().getNumber(ConfigManager::GAME_PORT));
#else
			if(version < it->second->getVersionMin() || version > it->second->getVersionMax())
				continue;

			output->AddString(it->first);
			output->AddString(it->second->getName());
			output->AddU32(it->second->getAddress());
			output->AddU16(it->second->getPort());
#endif
		}

		Days premiumDays = account->getPremiumDays();
		if (premiumDays.count() >= std::numeric_limits<uint16_t>::max()) {
			output->AddU16(std::numeric_limits<uint16_t>::max());
		}
		else {
			output->AddU16(static_cast<uint16_t>(premiumDays.count()));
		}

		OutputMessagePool::getInstance()->send(output);
	}

	getConnection()->close();
	return true;
}