1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

Исправление даты окончения бана при автохосте

Тема в разделе 'Кодинг/Собственные решения', создана пользователем 2man, 11 май 2011.

  1. 2man Ньюфаг

    Сообщения:
    10
    Спасибы:
    0
    Столкнулся с такой проблемой, что при автобане в БД MySQL записывается только дата создания бана, а поле срока его действия expiredate остается пустым, и базу приходится периодически чистить от истекших банов.
    причем при выдаче бана в ручном режиме командой !ban все нормально.
    Решение:
    \ghost\ghostdbmysql.cpp
    Строка 1235-1237:
    Код:
    		Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "','' )";
    		if (expiredaytime>0)
    		Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(), INTERVAL "+EscExpireDayTime +" DAY))";
    Тут видно, что сначала заносится запись в БД, а только потом проверяется какой срок бана.
    Исправить можно либо закомментировав строки 1235-12366, либо выставить условие:
    Код:
    		if (expiredaytime>0)
    Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(), INTERVAL "+EscExpireDayTime +" DAY))";
    		else
    		Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "','' )";
    
    Строка 1248-1250 аналогично.
    В конце надо скомпилить бота
  2. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Шото поменяЛ, но нехочет...
    Теперь попробую закоментить :spy:
  3. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Хз, в БД всеравно нету даты окончания...
    Делал и так и так :stenka:
  4. 2man Ньюфаг

    Сообщения:
    10
    Спасибы:
    0
    Заметил косяк: в базу в поле expiredate записывается не дата окончания бана, а дата когда был выдан. Т.е. DATE_ADD(CURDATE(), INTERVAL "+EscExpireDayTime +" DAY) заносит в БД только CURDATE(), т.е. переменная EscExpireDayTime не считывает конфиг, хотя должна.
    В ФАКе mysql'а есть несколько методов работы с датой: http://dev.mysql.com/doc/refman/5.5/en/ ... tions.html
    Я пока у себя сделал так: DATE_ADD(CURDATE(), INTERVAL 3 DAY), но это хреново тем, что при изменении времени бана придется заново компилить
  5. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Но в колонку про окончиние бана, чтото записеут??
    Если так зделать то бан хоть небудет вечным? Окончание появитсо?
  6. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Хммм.. и это несработало...
  7. 2man Ньюфаг

    Сообщения:
    10
    Спасибы:
    0
    Если правильно все сделал, то должно записываться.
    Я вот сегодня проверил, срок окончания бана выставляется как сегодняшнее число + 3 дня. Все верно
  8. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Кинь всеь код ghostdbmysql.cpp
  9. 2man Ньюфаг

    Сообщения:
    10
    Спасибы:
    0
    Выкладываю функцию с автобаном целиком:
    Код:
    bool MySQLBanAdd( void *conn, string *error, uint32_t botid, string server, string user, string ip, string gamename, string admin, string reason, uint32_t expiredaytime, uint32_t warn )
    {
    	transform( user.begin( ), user.end( ), user.begin( ), (int(*)(int))tolower );
    	string EscUser = MySQLEscapeString( conn, user );
    
    	uint32_t NumOfGames = 0;
    	string Query3 = "SELECT COUNT(*) FROM gameplayers WHERE name='" + EscUser + "'";
    
    	if( mysql_real_query( (MYSQL *)conn, Query3.c_str( ), Query3.size( ) ) != 0 )
    		*error = mysql_error( (MYSQL *)conn );
    	else
    	{
    		MYSQL_RES *Result = mysql_store_result( (MYSQL *)conn );
    
    		if( Result )
    		{
    			vector<string> Row = MySQLFetchRow( Result );
    
    			if( Row.size( ) == 1 )
    				NumOfGames = UTIL_ToUInt32( Row[0] );
    			else
    				*error = "error counting player games [" + user + "] - row doesn't have 1 column";
    
    			mysql_free_result( Result );
    		}
    		else
    			*error = mysql_error( (MYSQL *)conn );
    	}
    	string EscServer = MySQLEscapeString( conn, server );
    	string EscIP = MySQLEscapeString( conn, ip );
    // don't ban people on GArena by ip
    	if (ip == "127.0.0.1")
    		EscIP = MySQLEscapeString( conn, string() );
    	string EscGameName = MySQLEscapeString( conn, gamename );
    	string EscAdmin = MySQLEscapeString( conn, admin );
    	string EscReason = MySQLEscapeString( conn, reason );
    	string EscWarn = MySQLEscapeString( conn, UTIL_ToString(warn));
    //	string EscExpireDayTime = MySQLEscapeString( conn, UTIL_ToString(expiredaytime));
    	string EscExpireDayTime = UTIL_ToString(expiredaytime);
    	string EscGameCount = MySQLEscapeString( conn, UTIL_ToString(NumOfGames));
    	bool Success = false;
    	vector<string> ips;
    
    // if we don't know the ip, search for this name in gameplayers
    	if (false)
    	if (ip==string())
    	{
    		string Query2 = "SELECT distinct ip from gameplayers where name='"+EscUser+"' AND spoofedrealm='"+EscServer+"'";
    		if( mysql_real_query( (MYSQL *)conn, Query2.c_str( ), Query2.size( ) ) != 0 )
    			*error = mysql_error( (MYSQL *)conn );
    		else
    		{
    			MYSQL_RES *Result = mysql_store_result( (MYSQL *)conn );
    
    			if( Result )
    			{
    				vector<string> Row = MySQLFetchRow( Result );
    
    				while( Row.size( ) == 1 )
    				{
    					ips.push_back( Row[0] );
    					Row = MySQLFetchRow( Result );
    				}
    				mysql_free_result( Result );
    			}
    			else
    				*error = mysql_error( (MYSQL *)conn );
    		}				
    	}
    	string Query = string();
    	if (ips.size()!=0 && warn!=0)
    		EscIP = MySQLEscapeString( conn, ips[0] );
    	if (ips.size()==0 || warn!=0)	
    	{
    		//Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "','' )";
    		//if (expiredaytime>0)
    		//Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(),INTERVAL '"+EscExpireDayTime+"' DAY))"; 
    		Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(), INTERVAL 3 DAY) )"; 
    
    		if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
    			*error = mysql_error( (MYSQL *)conn );
    		else
    			Success = true;
    	} else
    	{
    		for (uint32_t i=0;i<ips.size();i++)
    		{
    			EscIP = MySQLEscapeString( conn, ips[i] );
    //			Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "' )";
    			//Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "','' )";
    			//if (expiredaytime>0)
    			//Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(), INTERVAL '"+EscExpireDayTime+"' DAY))";
    			Query = "INSERT INTO bans ( botid, server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate  ) VALUES ( " + UTIL_ToString( botid ) +", '" + EscServer + "', '" + EscUser + "', '" + EscIP + "', CURDATE( ), '" + EscGameName + "', '" + EscAdmin + "', '" + EscReason + "', '" + EscWarn + "', '" + EscGameCount + "', DATE_ADD(CURDATE(), INTERVAL 3 DAY) )"; 
    			if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
    				*error = mysql_error( (MYSQL *)conn );
    			else
    				Success = true;			
    		}
    	}
    	return Success;
    }
  10. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Все норм думаю будет у мну так же... но бывает трабла с компилем, подкрадывыается незаметно, ты компилиь а оно незаменяет или неработатет. Тачку реснул щас проверю, но думаю все будет работать. Такое раньше было :lol: :lol:
  11. Mefix Наш человек

    Сообщения:
    114
    Спасибы:
    3
    Моё решение было по другому реализовано. И мне кажется более правильно.

    Строки указаны в скобках примерно. Там + - и найдёте пока будете в коде рыться.

    Код:
    Изменил:
    в конфиге дописал параметр:
    bot_autobanexpiredaytime = 14
    в ghost.h(строка 132) обозначил переменную:
    uint32_t m_AutoBanExpireDayTime; // Expire day time
    в ghost.cpp (строка 2466) сказал откуда брать для неё параметр:
    m_AutoBanExpireDayTime = CFG->GetInt( "bot_autobanexpiredaytime", 14 );
    в game.cpp(107) объявил переменную, и сказал откуда брать данные:
    uint32_t AutoBanExpireDayTime = m_GHost->m_AutoBanExpireDayTime;
    в game.cpp(120) исправил
    m_GHost->m_Callables.push_back( m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, 0, 0 ))
    на
    m_GHost->m_Callables.push_back( m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, AutoBanExpireDayTime, 0 ))
    Inhuman нравится это.
  12. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Просто и со вкусом.
  13. Military Парнишка с небывалым умом

    Сообщения:
    133
    Спасибы:
    2
    Сборка бота GHost:
    ghost++
    Дата начала использования бота:
    12.12.2012
    Skype:
    Мой статус
    Код:
    1>.\ghost.cpp(2466) : error C2065: CFG: необъявленный идентификатор
    1>.\ghost.cpp(2466) : error C2227: выражение слева от "->GetInt" должно указывать на тип класса, структуры или объединения либо на универсальный тип
    1>        тип: 'unknown-type'
    вот что после этих изменений
  14. Inhuman Пил пиво с админом

    Сообщения:
    147
    Спасибы:
    6
    Сборка бота GHost:
    BrtGhost rev 1.81
    Дата начала использования бота:
    15.09.2010
    всё работает с вышеприведенными изменениями
  15. Military Парнишка с небывалым умом

    Сообщения:
    133
    Спасибы:
    2
    Сборка бота GHost:
    ghost++
    Дата начала использования бота:
    12.12.2012
    Skype:
    Мой статус
    у меня не компилит тогда почему?
  16. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Накосячил в коде. В приватом методе мб объявил.
  17. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    или просто не та версия гхоста, и строки не совпадают
  18. Military Парнишка с небывалым умом

    Сообщения:
    133
    Спасибы:
    2
    Сборка бота GHost:
    ghost++
    Дата начала использования бота:
    12.12.2012
    Skype:
    Мой статус
    код не менял, всё копировал по инструкции
  19. Military Парнишка с небывалым умом

    Сообщения:
    133
    Спасибы:
    2
    Сборка бота GHost:
    ghost++
    Дата начала использования бота:
    12.12.2012
    Skype:
    Мой статус
    Всё настроил идёт отлично)