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

GhostOne Настройка autoban

Тема в разделе 'Запуск и Поддержка', создана пользователем pulsar, 9 мар 2012.

  1. pulsar Наш человек

    Сообщения:
    23
    Спасибы:
    0
    Сборка бота GHost:
    Ghost One 1.7.266
    Здравствуйте, уважаемые господа.
    Не могли бы вы мне помочь настроить длительность автобана?
    Бот GHost One 1.7.266 у меня полностью настроен. Вот только при автобанах он банит на прижизненно. Хотелось бы изменить на пару дней. Подскажите где и что менять?
  2. barraka Ньюфаг

    Сообщения:
    14
    Спасибы:
    0
    Принцип действия.
    Длительность автобана будем устанавливать в файле конфигурации ghost.cfg, далее оно будет использовано при выдаче автобанов.

    Реализация.
    Добавить в ghost.cfg в любую строку. Число 1 - это время бана в ДНЯХ, если поставить 0, то будет перманентный (постоянный) бан.
    Код:
    bot_autobantime = 1
    Добавить в ghost.h, строка ~100
    Код:
    uint32_t m_AutoBanTime;
    Добавить в ghost.cpp, строка ~3746
    Код:
    m_AutoBanTime = CFG->GetInt( "bot_autobantime", 1 );
    В game.cpp, строка ~123, надо заменить
    Код:
    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, m_GHost->m_AutoBanTime, 0 ));
    Должно быть примерно так
    Код:
    if (endtime>timehasleft+m_GHost->m_AutoBanGameEndMins*60) 
    { 
    	string Reason = CustomReason( timehasleft, string(), (*i)->GetName() );
    	Reason = "Autobanned"+Reason;
    	CONSOLE_Print( "[AUTOBAN: " + m_GameName + "] Autobanning " + (*i)->GetName( ) + " (" + Reason +")" );
    	
    	m_GHost->m_Callables.push_back( m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, m_GHost->m_AutoBanTime, 0 ));
    }
    P.S. Всё это дело должно быть скомпилировано.
  3. KradaBash Гуру

    Сообщения:
    275
    Спасибы:
    6
    Дата начала использования бота:
    12.12.12
    Не работает, проверено :)
  4. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    это в ghost++ так? в one подобное же значит дни, но никак не секунды.
  5. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    вот кусок из games.cpp

    Код:
     uint32_t BanTime = m_GHost->m_BanTime;
     
     
     
    if (Matches == 1)
     
    m_PairedBanAdds.push_back( PairedBanAdd( User, m_GHost->m_DB->ThreadedBanAdd( LastMatch->GetJoinedRealm( ), LastMatch->GetName( ), LastMatch->GetExternalIPString( ), m_GameName, User, Reason, BanTime, 0 ) ) );
     
    else
     
    m_PairedBanAdds.push_back( PairedBanAdd( User, m_GHost->m_DB->ThreadedBanAdd( m_Server, Victim, "", m_GameName, User, Reason, BanTime, 0 ) ) );
    
    хочешь сказать в конфиге время указывали в секундах?
    и в базу льется так

    Код:
     bool CGHostDBSQLite :: BanAdd( string server, string user, string ip, string gamename, string admin, string reason, uint32_t expiredaytime, uint32_t warn )
    {
    uint32_t NumOfGames = CountPlayerGames( user );
    if (warn >0 && m_GameClockToForgetAWarn)
    NumOfGames = CountPlayerDurationGames( user );
    transform( user.begin( ), user.end( ), user.begin( ), (int(*)(int))tolower );
    bool Success = false;
    sqlite3_stmt *Statement;
    // don't ban people on GArena by ip
    if (ip=="127.0.0.1")
    ip = "";
    string Query = "INSERT INTO bans ( server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate ) VALUES ( ?, ?, ?, date('now'), ?, ?, ?, ?, ?,'' )";
    if(expiredaytime > 0) // means the ban is not intended to be permanent
    Query = "INSERT INTO bans ( server, name, ip, date, gamename, admin, reason, warn, gamecount, expiredate ) VALUES ( ?, ?, ?, date('now'), ?, ?, ?, ?, ?, date(julianday('now') + ?))";
    m_DB->Prepare( Query, (void **)&Statement );
     
    if( Statement )
    {
    sqlite3_bind_text( Statement, 1, server.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_text( Statement, 2, user.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_text( Statement, 3, ip.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_text( Statement, 4, gamename.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_text( Statement, 5, admin.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_text( Statement, 6, reason.c_str( ), -1, SQLITE_TRANSIENT );
    sqlite3_bind_int( Statement, 7, warn );
    sqlite3_bind_int( Statement, 8, NumOfGames );
    if(expiredaytime > 0)
    sqlite3_bind_int( Statement, 9, expiredaytime );
     
    int RC = m_DB->Step( Statement );
     
    if( RC == SQLITE_DONE )
    Success = true;
    else if( RC == SQLITE_ERROR )
    CONSOLE_Print( "[SQLITE3] error adding ban [" + server + " : " + user + " : " + ip + " : " + gamename + " : " + admin + " : " + reason + "] - " + m_DB->GetError( ) );
     
    m_DB->Finalize( Statement );
    }
    else
    CONSOLE_Print( "[SQLITE3] prepare error adding ban [" + server + " : " + user + " : " + ip + " : " + gamename + " : " + admin + " : " + reason + "] - " + m_DB->GetError( ) );
     
    return Success;
    }
    
    где
    Код:
     date(julianday('now') + ?) 
    работает по дням


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

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    потому что это не так, я отредактировал свой пост но ты успел раньше ответить
    не надо заливать, ты попробуй выполнить sql запрос
    Код:
     date(julianday('now') + ?) 
    где вместо вопроса секунды, и посмотри что будет
  7. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
  8. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    мож он вообще не включается?
    у себя нарыл такое, очевидно это из чистого one, т.к я такой функцией не пользовался и не трогал её
    Код:
    m_GHost->m_Callables.push_back( m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, 1, 0 ));
    насчет банов, я думаю что они все же работают, но не так как хотели, тут только записывается в базу, а пока бот не преечитает бан лист, забаненый игрок сможет входить в игру, возможно должно было быть что то типа

    Код:
    m_PairedBanAdds.push_back( PairedBanAdd( (*i)->GetName( ), m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, 1, 0 )));
                
    чтобы сработало то о чем ты так яростно пытаешься доказать, а именно перевести в секунды, прибавить к текущим и получить дату в нужном формате, чтобы затем дать боту знать что этот игрок забанен на такой то срок.
  9. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    мы же спорим как указывается время бана? я говорю в днях, ты в секундах, запрос как раз доказывает в чем указывается время бана.
    В общем мы про разное спорим и оба не признаем мнение другого, на этом и закончим.
  10. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    ты от темы отошел, какие прямые запросы?


    наша тема спора вот. Все так же думаешь что там надо указывать в секундах? Тут и прямой запрос в базу, который и был здесь. Сейчас ты просто пытаешься обвинить меня в что я неправильно делаю, даже отрицать не буду. Работает оно ил нет, не суть, разговор был в днях или в секундах и не надо пытаться отойти от темы, что все должно не так быть. Дальнейший спор не имеет смысла.
  11. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    что это? в one не сохраняется время, только дата, мы еще и про разные боты говорили???

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

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    :facepalm:
  13. Max5 Старожила

    Сообщения:
    360
    Спасибы:
    68
    Сборка бота GHost:
    GhostOne 1.7.266
    Дата начала использования бота:
    14.05.2013
    а что толку с тобой спорить, все равно ты на своей волне
    Suicider нравится это.
  14. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    В общем шло время. Я по большей части вспомнил функционал бота.
    Покопался в ghostdb~. Хочу публично извиниться перед Max5 за спор в котором он был прав на 150%.
    На момент спора я не понял его, а решил всё по своему.

    Ответ:
    Использую сбор информации с бота в базу MySQL:

    ghostdbmysql.cpp
    В теле
    Код:
    bool MySQLBanAdd( ... )
    заменить CURDATE() на NOW()

    В теле
    Код:
    CDBBan *MySQLBanCheck( ... )
    и
    Код:
    vector<CDBBan *> MySQLBanList( ... )
    Заменить DATE(date) на date

    bnet.cpp/game.cpp
    В векторе внесения банов
    В теле
    Код:
    for( vector<PairedBanAdd> :: iterator i = m_PairedBanAdds.begin( ); i != m_PairedBanAdds.end( ); )
    Заменить/добавить "%d-%m-%Y" на "%Y-%m-%d %H:%M:%S"


    По сабжу: добавить вектор в автобан (game.cpp)
    у меня он выглядит примерно так (мой немного переделан под личный банлист, этот под дефолтного изменен)
    Код:
            if (IsAutoBanned((*i)->GetName()))
            {
                timehasleft = (*i)->GetLeavingTime();
                if (endtime>timehasleft+m_GHost->m_AutoBanGameEndMins*60)
                {
                    uint32_t sBanTime = m_GHost->m_AutoBanTime;
                    string Reason = CustomReason( timehasleft, string(), (*i)->GetName() );
                    Reason = "Autobanned"+Reason;
                    CONSOLE_Print( "[AUTOBAN: " + m_GameName + "] Autobanning " + (*i)->GetName( ) + " (" + Reason +")" );
     
                    for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
                    {
                        if ((*j)->GetServer() == m_Server)
                        {
                            string sTDate = string();
                            string sDate = string();
                            struct tm * timeinfo;
                            char buffer [80];
                            time_t Now = time( NULL );
                            timeinfo = localtime( &Now );
                            strftime (buffer,80,"%Y-%m-%d",timeinfo);
                            sTDate = buffer;
                            if (sBanTime>0)
                            {
                                Now += 3600*24*sBanTime;
                                timeinfo = localtime( &Now );
                                strftime (buffer,80,"%Y-%m-%d",timeinfo);
                                sDate = buffer;
                            }
                            (*j)->AddBan((*i)->GetName( ), (*i)->GetIP(), sTDate, m_GameName, "AUTOBAN", Reason, sDate);
                        }
                    }
     
                    m_GHost->m_Callables.push_back( m_GHost->m_DB->ThreadedBanAdd( (*i)->GetSpoofedRealm(), (*i)->GetName( ), (*i)->GetIP(), m_GameName, "AUTOBAN", Reason, sBanTime, 0 ));
                }
            }
    P.S. Стыдно, за то, что я такой агро школоло :palevo:
    Max5 нравится это.