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

Help Добавить к команде проверку на Safelist

Тема в разделе 'Кодинг/Собственные решения', создана пользователем TyMaH, 23 окт 2012.

  1. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    Хочу реализовать возможность, использование команд, safelist'у.
    Подскажите пожалуйста на примере этой команды, куда здесь добавить проверку Safelist'a.

    Код !Swap из games.cpp
    Код:
    if( Command == "swap" && !Payload.empty( ) && !m_GameLoading && !m_GameLoaded )
                {
                    if (!CMDCheck(CMD_swap, AdminAccess))
                    {
                        SendChat(player->GetPID(), m_GHost->m_Language->YouDontHaveAccessToThatCommand( ));
                        return HideCommand;
                    }
                    uint32_t SID1;
                    uint32_t SID2;
                    stringstream SS;
                    SS << Payload;
                    SS >> SID1;
     
                    if( SS.fail( ) )
                        CONSOLE_Print( "[GAME: " + m_GameName + "] bad input #1 to swap command" );
                    else
                    {
                        if( SS.eof( ) )
                            CONSOLE_Print( "[GAME: " + m_GameName + "] missing input #2 to swap command" );
                        else
                        {
                            SS >> SID2;
     
                            if( SS.fail( ) )
                                CONSOLE_Print( "[GAME: " + m_GameName + "] bad input #2 to swap command" );
                            else
                            {
                                bool isAdmin = false;
                                bool isRootAdmin = false;
                                bool sameteam = false;
                                if (SID1-1<m_Slots.size() && SID2-1<m_Slots.size())
                                    sameteam = m_Slots[SID1-1].GetTeam() == m_Slots[SID2-1].GetTeam();
                                CGamePlayer *Player = GetPlayerFromSID( SID1 - 1 );
                                CGamePlayer *Player2 = GetPlayerFromSID( SID2 - 1 );
                                if (Player)
                                    if (Player->GetName()!=User)
                                        if (IsRootAdmin(Player->GetName()))
                                            isRootAdmin = true;
                                if (Player2)
                                    if (Player2->GetName()!=User)
                                        if (IsRootAdmin(Player2->GetName()))
                                            isRootAdmin = true;
                                if (m_GHost->m_onlyownerscanswapadmins && !sameteam)
                                {
                                    CGamePlayer *Player = GetPlayerFromSID( SID1 - 1 );
                                    CGamePlayer *Player2 = GetPlayerFromSID( SID2 - 1 );
                                    if (Player)
                                    {
                                        if (IsAdmin(Player->GetName()) || IsRootAdmin(Player->GetName()))
                                        if (Player->GetName()!=User)
                                            isAdmin = true;
                                    }
                                    if (Player2)
                                    {
                                        if (IsAdmin(Player2->GetName()) || IsRootAdmin(Player2->GetName()))
                                        if (Player2->GetName()!=User)
                                            isAdmin = true;
                                    }
                                }
     
                                if (isRootAdmin)
                                {
                                    SendChat( player->GetPID(), "You can't swap a rootadmin!");
                                    return HideCommand;
                                }
     
                                if (isAdmin && !(IsOwner(User) || RootAdminCheck))
                                {
                                    SendChat( player->GetPID(), "You can't swap an admin!");
                                    return HideCommand;
                                } else
                                SwapSlots( (unsigned char)( SID1 - 1 ), (unsigned char)( SID2 - 1 ) );
                            }
                        }
                    }
                }
  2. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Засунь ее в НОН-АДМИН КОМАНДС и начало команды такое
    Код:
    if( Command == "swap" && !Payload.empty( ) && !m_GameLoading && !m_GameLoaded )
                {
                    if (!IsSafeList(User))
                    {
                        SendChat(player->GetPID(), "Ты не из сейф листа, так что - отсекайся!");
                        return HideCommand;
                    }
    TyMaH нравится это.
  3. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Путь In(непростой):
    1. вынести swap из блока комманд для админов, в NON ADMIN COMMANDS.
    2. ввести bool переменную, в нее записывать результат проверки на нахождение в safelist'e
    3. в условия swap добавить проверку на рута, админа, сейфлист, овнер( побочный эффект переноса swap из админ комманд в NON ADMIN )
    4. Profit
    Путь In(сложный):
    1. сделать отдельно секцию для safelist
    2. в нее закинуть(скопирастить) те команды, которые ты хочешь им дать(свап и др).
    3. Profit
    Путь In( хитрый и пока только в теории, мб я бред несу ):
    1. ввести bool переменную, в нее записывать результат проверки на нахождение в safelist'e
    2. Если имеем игрока из сейфлиста, то прогонять туже самую команду с теми же командами, но как бы от имени админа
    3. Profit
    Путей In много, всех не перечислишь

    Путь Yan(единственный и безвариантный):
    1. Оформить заявку тут
    2. Нажать спасибо тут
    3. Заплатить Yan дань, озвученную в п.1
    4. Profit
    Выбор за вами...
  4. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Для ознакомления ссылка на тему:
    Тыкни меня
    Была найдена за 1 поиковой запрос и 8 кликов мышки.
  5. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Это намек на нашу беспомощность? Ты за это огребешь!
  6. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    Я ее в первую очередь нашел. Пытаюсь вникнуть.
  7. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    Код:
    1>.\game.cpp(5649) : error C3861: IsSafeList: идентификатор не найден
  8. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Сор мой косяк...
    IsSafe(User)

    Плюс для адм защиту влепи, вобщем начало такое:
    Код:
    if( Command == "swap" && !Payload.empty( ) && !m_GameLoading && !m_GameLoaded && !IsAdmin(User) && !IsRootAdmin(User))
                {
                    if (!IsSafe(User))
                    {
                        SendChat(player->GetPID(), "Ты не из сейф листа, так что - отсекайся!");
                        return HideCommand;
                    }
    TyMaH нравится это.
  9. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    вырезать из game.cpp и переносить в секцию non admin , или можно скопировать?
  10. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Скопировать. ТАм будет для АДМ, а тут для сейфлиста. Не вырезай ничего, то потом запутаешься.
    TyMaH нравится это.
  11. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    Все спасиб, Rost, все получилось :) GJ.
  12. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
  13. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    А с Warn'ом такая замена пройдет? Просто там код немного отличается и команда сама немного по серьезнее.
    Код:
    if( ( (Command == "warn") || (m_GHost->m_ReplaceBanWithWarn && (Command == "ban" || Command == "addban" || Command == "b") )) && !Payload.empty( ) && !m_GHost->m_BNETs.empty( ) )
                {
                    if (!CMDCheck(CMD_ban, AdminAccess))
                    {
                        SendChat(player->GetPID(), m_GHost->m_Language->YouDontHaveAccessToThatCommand( ));
                        return HideCommand;
                    }
    К примеру я сделаю так (уберу еще replacebanwarn, ибо он мне не нужен):
    Код:
     
    if( Command == "warn" && !Payload.empty( ) && !m_GHost->m_BNETs.empty( ) && !IsAdmin(User) && !IsRootAdmin(User) )
                {
                  if (!IsSafe(User))
                {
                        SendChat(player->GetPID(), "Ты не из сейф листа, так что - отсекайся!");
                        return HideCommand;
                    }
     
    
    Будет ли работать такая замена? Компиляция ошибок не дала.
  14. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
  15. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    как-то не понятно... это противоречит этому
  16. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    4-й пункт означает Profit для Yan, кто сказал что работа будет сделана? Никаких противоречий, он чисто бабки загребет, Yan такой Yan
  17. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Тебе не понять величайшего смысла нашей армии, презренный.
    evilmaker и rost нравится это.
  18. Doterok Старожила

    Сообщения:
    923
    Спасибы:
    171
    Сборка бота GHost:
    Ghost ++ 17.2
    Дата начала использования бота:
    2011
    Грамм спайса поможет придти к обоюдному согласию :D
  19. evilmaker Старожила

    Сообщения:
    321
    Спасибы:
    28
    Сборка бота GHost:
    brtghost rev.185
    Дата начала использования бота:
    07.07.9999
    Skype:
    Мой статус
    нах тебе химия? кури натурпокоспродукт):D
  20. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    Возникла трабла с командой warn для safelist.
    Варнить то варнит, но после 1го варна, сразу идет в бан)) Хотя в конфиге установленно число варнов для бана - 3. Если варнит админ, то предупреждение вешается, но не банит. В чем может быть трабла? вот код собсно Warn'a с проверкой на Safe из game.cpp:
    Код:
    if( Command == "warn" && !Payload.empty( ) && !m_GHost->m_BNETs.empty( ) && !IsAdmin(User) && !IsRootAdmin(User) )
                {
                  if (!IsSafe(User))
                {
                        SendChat(player->GetPID(), "Команда доступна только VIP пользователям!");
                        return HideCommand;
                    }
     
                    // extract the victim and the reason
                    // e.g. "Varlock leaver after dying" -> victim: "Varlock", reason: "leaver after dying"
     
                    string Victim;
                    string Reason;
                    stringstream SS;
                    SS << Payload;
                    SS >> Victim;
     
                    if( !SS.eof( ) )
                    {
                        getline( SS, Reason );
                        string :: size_type Start = Reason.find_first_not_of( " " );
     
                        if( Start != string :: npos )
                            Reason = Reason.substr( Start );
                    }
     
                    if( m_GameLoaded )
                    {
                        string VictimLower = Victim;
                        transform( VictimLower.begin( ), VictimLower.end( ), VictimLower.begin( ), (int(*)(int))tolower );
                        uint32_t Matches = 0;
                        CDBBan *LastMatch = NULL;
     
                        // try to match each player with the passed string (e.g. "Varlock" would be matched with "lock")
                        // we use the m_DBBans vector for this in case the player already left and thus isn't in the m_Players vector anymore
     
                        for( vector<CDBBan *> :: iterator i = m_DBBans.begin( ); i != m_DBBans.end( ); i++ )
                        {
                            string TestName = (*i)->GetName( );
                            transform( TestName.begin( ), TestName.end( ), TestName.begin( ), (int(*)(int))tolower );
     
                            if( TestName.find( VictimLower ) != string :: npos )
                            {
                                Matches++;
                                LastMatch = *i;
                            }
                        }
     
                        if( Matches == 0 )
                            SendAllChat( m_GHost->m_Language->UnableToWarnNoMatchesFound( Victim ) );
                        else if( Matches == 1 )
                        {
                            bool isAdmin = IsOwner(LastMatch->GetName());
                            for( vector<CBNET *> :: iterator j = m_GHost->m_BNETs.begin( ); j != m_GHost->m_BNETs.end( ); j++ )
                            {
                                if( (*j)->IsAdmin(LastMatch->GetName() ) || (*j)->IsRootAdmin( LastMatch->GetName() ) )
                                {
                                    isAdmin = true;
                                    break;
                                }
                            }
     
                            if (isAdmin && !RootAdminCheck)
                            {
                                SendChat( player->GetPID(), "You can't warn an admin!");
                                return HideCommand;
                            }
     
                            if ((IsSafe(LastMatch->GetName()) && m_GHost->m_SafelistedBanImmunity) && !RootAdminCheck)
                            {
                                SendChat( player->GetPID(), "You can't warn a safelisted player!");
                                return HideCommand;
                            }
     
                            Reason = CustomReason(Reason, LastMatch->GetName() );
     
                            WarnPlayer(LastMatch, Reason, User);
                        }
                        else
                            SendAllChat( m_GHost->m_Language->UnableToWarnFoundMoreThanOneMatch( Victim ) );
                    }
                    else
                    {
                        WarnPlayer( Victim, Reason, User);
                    }
                }