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

Safe List

Тема в разделе 'Основные вопросы', создана пользователем ____ROB____, 14 мар 2011.

  1. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    Код:
    /*********************
    			* NON ADMIN COMMANDS *
    			*********************/
    
    			// don't respond to non admins if there are more than 3 messages already in the queue
    			// this prevents malicious users from filling up the bot's chat queue and crippling the bot
    			// in some cases the queue may be full of legitimate messages but we don't really care if the bot ignores one of these commands once in awhile
    			// e.g. when several users join a game at the same time and cause multiple /whois messages to be queued at once
    
    				if (m_GHost->m_DetourAllMessagesToAdmins)
    					return;
    
    				if (!m_GHost->m_NonAdminCommands && !IsRootAdmin(User) && !IsAdmin( User ) )
    					return;
    
    // !PUB for safelist
                if (( Command == "pub" || Command == "p" ) && IsSafe(User) && m_GHost->m_SafeCanHost)
                {
                   if (m_GHost->m_LastGameName=="" && Payload.empty())
                   {
                      QueueChatCommand("Задайте название игры", User, Whisper);
                      return;
                   }
    
                   string GameName = Payload;
                   if (GameName.empty())
                      GameName = m_GHost->m_LastGameName;               
                   string GameNr = string();
                   uint32_t idx = 0;
                   uint32_t Nr = 0;
    
                   if (Payload.empty())
                   {
                      idx = GameName.length()-1;
                      if (idx>=2)
                      if (GameName.at(idx-2)=='#')
                         idx = idx-1;
                      else
                         if (GameName.at(idx-1)=='#')
                            idx = idx;
                         else
                            idx = 0;
    
                      // idx = 0, no Game Nr found in gamename
                      if (idx == 0)
                      {
                         GameNr = "0";
                         GameName = GameName + " #";
                      }
                      else
                      {
                         GameNr = GameName.substr(idx,GameName.length()-idx);
                         GameName = GameName.substr(0,idx);
                      }
                      stringstream SS;
                      SS << GameNr;
                      SS >> Nr;
                      Nr ++;
                      if (Nr>20)
                         Nr = 1;
                      GameNr = UTIL_ToString(Nr);
                      GameName = GameName + GameNr;
                   }
                   m_GHost->m_QuietRehost = false;
    
                   // adding the game creator as friend
                   bool cf = false;
                   if (m_GHost->m_addcreatorasfriendonhost && !IsFriend(User))
                   {
                      QueueChatCommand( "/f a "+User);
                      cf = true;
                   }
    
                   m_GHost->CreateGame( m_GHost->m_Map, GAME_PUBLIC, false, GameName, User, User, m_Server, Whisper );
                   if (m_GHost->m_addcreatorasfriendonhost && !cf && m_GHost->m_CurrentGame)
                      m_GHost->m_CurrentGame->m_CreatorAsFriend = false;
    
                }
    
    //			if( IsAdmin( User ) || IsRootAdmin( User ) || m_OutPackets.size( ) <= 3 )
    			if( m_OutPackets.size( ) <= 3 )
    			{
    				//
    				// !STATS
    				//
    
    				if( Command == "stats" )
    				{
    					string StatsUser = User;
    
    					if( !Payload.empty( ) )
    						StatsUser = Payload;
    
    					string Usr;
    					Usr = Whisper ? User : string( );
    					if (m_GHost->m_WhisperAllMessages)
    						Usr = User;
    
    					// check for potential abuse
    
    					if( !StatsUser.empty( ) && StatsUser.size( ) < 16 && StatsUser[0] != '/' )
    						m_PairedGPSChecks.push_back( PairedGPSCheck( Usr, m_GHost->m_DB->ThreadedGamePlayerSummaryCheck( StatsUser ) ) );
    				}
    Код:
    1>------ Построение начато: проект: ghost, Конфигурация: Release MySQL Win32 ------
    1>Компиляция...
    1>bnet.cpp
    1>Компоновка...
    1>Создание кода
    1>Создание кода завершено
    1>Внедрение манифеста...
    1>Журнал построения был сохранен в "file://c:\Users\SAHTA\Desktop\GHostOne\ghost\Release MySQL\BuildLog.htm"
    1>ghost - ошибок 0, предупреждений 0
    ========== Построение: успешно: 1, с ошибками: 0, без изменений: 1, пропущено: 0 ==========
    где ошибка ?
  2. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    мб тут?
    Код:
    bot_safecanhost = 1
  3. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    в конфиге так и стоит :) так что не в этом ...
    выложи пожалуйста свой файл bnet.cpp я попробую его скомпилить и проверить на работоспособность =\
  4. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    StafiloKOK
    В лобби бот вообще не откликается не на какие команды...
  5. StafiloKOK Ньюфаг

    Сообщения:
    19
    Спасибы:
    0
    ____ROB____,
    Значит у тебя нет проверки на сейф-лист..
    Короче вот как я себе сделал:

    Код:
    bool CGame :: EventPlayerBotCommand( CGamePlayer *player, string command, string payload )
    {
    	bool HideCommand = CBaseGame :: EventPlayerBotCommand( player, command, payload );
    
    	// todotodo: don't be lazy
    
    	string User = player->GetName( );
    	string Command = command;
    	string Payload = payload;
    
    	uint32_t AdminAccess = 0;
    	bool AdminCheck = false;
    	bool BluePlayer = false;
    
    	CGamePlayer *p = NULL;
    	unsigned char Nrt;
    	unsigned char Nr = 255;
    	for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    	{
    		Nrt = GetSIDFromPID((*i)->GetPID());
    		if (Nrt<Nr)
    		{
    			Nr = Nrt;
    			p = (*i);
    		}
    	}
    
    	for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    	{
    		if(( (*i)->GetServer( ) == player->GetSpoofedRealm( ) && (*i)->IsAdmin( User )) )
    		{
    			AdminCheck = true;
    			AdminAccess = (*i)->LastAccess();
    			if (IsOwner(User))
    				AdminAccess = m_GHost->CMDAccessAddOwner(AdminAccess);
    			break;
    		}
    	}
    
    // upgrade LAN players to admins in case bot_lanadmins = 1
    // upgrade local players to admins in case bot_localadmins = 1
    	if ((m_GHost->m_LanAdmins && player->IsLAN()) || (m_GHost->m_LocalAdmins && player->GetExternalIPString()=="127.0.0.1" ))
    	{
    		AdminCheck = true;
    		AdminAccess = m_GHost->CMDAccessAddOwner(AdminAccess);
    	}
    
    	bool RootAdminCheck = false;
    
    	// upgrade LAN players to rootadmins in case bot_lanrootadmins = 1
    	if ((m_GHost->m_LanRootAdmins && player->IsLAN()) )
    	{
    		RootAdminCheck = true;
    	}
    
    	for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    	{
    		if( (*i)->GetServer( ) == player->GetSpoofedRealm( ) && (*i)->IsRootAdmin( User ) )
    		{
    			RootAdminCheck = true;
    			break;
    		}
    	}
    
    	if (RootAdminCheck)
    	{
    		BluePlayer = true;
    		AdminAccess = CMDAccessAll();
    	}
    
    /***********************
    * SEMI-ADMIN COMMANDS *
    ************************/
    
    	bool SafeListAdminCheck = false;
    
    	for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    	{
    		if( (*i)->GetServer( ) == player->GetSpoofedRealm( ) && (*i)->IsSafe( User ) )
    		{
    			SafeListAdminCheck = true;
    			break;
    		}
    	}
    
    	if( player->GetSpoofed( ) && SafeListAdminCheck && !AdminCheck && !RootAdminCheck )
    	{
    		CONSOLE_Print( "[GAME: " + m_GameName + "] semi-admin [" + User + "] sent command [" + Command + "] with payload [" + Payload + "]" );
    
    		if( !m_Locked )
    		{
    			//
    			// !CMDS (Semi-admins)
    			//
    
    			if( Command == "commands" || Command == "cmds" )
    			{
    
    			// ...
    			// ...
    			// ...
    
    			}
    
    			// ...
    			// ...
    			// ...
    
    		}
    		else
    		{
    			CONSOLE_Print( "[GAME: " + m_GameName + "] semi-admin user command ignored, the game is locked" );
    			SendChat( player, m_GHost->m_Language->TheGameIsLocked( ) );
    		}
    	}
    
    
    // END   (SEMI-ADMIN COMMANDS)
    //*****************************
    
    	else if( player->GetSpoofed( ) && (AdminCheck || RootAdminCheck) )
    	{
    		CONSOLE_Print( "[GAME: " + m_GameName + "] admin [" + User + "] sent command [" + Command + "] with payload [" + Payload + "]" );
    
    		//if( !m_Locked || RootAdminCheck || IsOwner( User ) )
    		if( !m_Locked || RootAdminCheck)
    		{
    			/*****************
    			* ADMIN COMMANDS *
    			******************/
    
    			// ...
    			// ...
    			// ...
  6. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Не так. По моему там на права админа дополняются правами овнера. Если снять овнера админские права сохраняются. Проверь сам
    Насчет разграничения доступа. Можно сделать так, чтобы админ прописывался как овнер, но овнерские команды были ему закрыты.
    Насчет лобби. Чтобы бот принял команду ему ее надо писать через /w ник_бота, т.к. он уходит с канала на время пабания игры.
  7. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    вобщем, забрал у овнера права на бан и кик.
    добавил пару рут админов (bot_rootadmins =).
    рут админ создаёт игру, в лобби банить не может и в игре тоже (пишет нет прав), другой рут админ находящийся в игре банит.
    вывод = тому кто создаёт игру автоматически даётся овнер и присваиваются права овнера.
    хотелось бы зделать, что права оставались для админов из "admin access control".
    как ето зделать мозгов нет, поетому и пишу тут...
  8. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    фантастика o_O 100% что-то путаешь. ИБо какой он рутадмн если банить не может
    Насчет ограничения по правам, седня гляну, там вроде не сложно.
  9. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    так да, но разобратся не могу...
  10. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
  11. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Вот что я накопал, это 100% касается команд в игре, насчет лобби не уверен.
    Ищем в game.ccp
    Код:
    bool CGame :: EventPlayerBotCommand( CGamePlayer *player, string command, string payload )
    
    Смотрим где там перед командама назначают доступ, из всего нас интересует только это(если опция, что синий по автомату Владелец выключена):
    1) Здесь смотрят являеться ли юзер владельцем и если да назначают права:
    Код:
    	if (IsOwner(User))
    	{
    		AdminCheck = true;
    		AdminAccess = m_GHost->CMDAccessAddOwner(0);
    	}
    
    Здесь проверяют на админство, а также являеться ли юзер овнером:
    Код:
    	for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    	{
    		if(( (*i)->GetServer( ) == player->GetSpoofedRealm( ) && (*i)->IsAdmin( User )) )
    		{
    			AdminCheck = true;
    			AdminAccess = (*i)->LastAccess();
    			if (IsOwner(User) )
    				AdminAccess = m_GHost->CMDAccessAddOwner(AdminAccess);
    			break;
    		}
    	}
    Я решил сделать так:
    1) Подправим условие до такого вида:
    Код:
    	if (IsOwner(User) && !IsAdmin(User))
    	{
    		AdminCheck = true;
    		AdminAccess = m_GHost->CMDAccessAddOwner(0);
    	}
    2) закомментировать проверку на владельца, т.к если он до нее дойдет, то он уже будет считаться админом.
    Код:
    			/*if (IsOwner(User) )
    				AdminAccess = m_GHost->CMDAccessAddOwner(AdminAccess);*/
    По идее получиться то, что ты хочешь. Админам права овнера даваться не будут, но овнерами они будут считаться все равно.
    Поправьте меня, если где накосячил.
  12. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    спасибо, буду тестить :palevo:
  13. StafiloKOK Ньюфаг

    Сообщения:
    19
    Спасибы:
    0
    MuP,
    Это то же самое, о чём я писал в начале...
  14. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    То, что ты предлагал совсем исключает наделение правами овнера. Роб же просил, чтобы овнера не давали админам. Да очень похоже, не спорю, но результат разный.
  15. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Где находятсо команды овнера?? Хочу вырезать пару.
    или его разрешения.... как у адм в цифрах типа. Мб так гдето есть? Он меня уже кумарит :metal:
  16. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    bot_owneraccess в конфиге
    GUI -> Ghost Options -> Page 6 -> Owner access
  17. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    Вобщем, внёс изменения в game.cpp:




    компиляцыя прошла успешно.

    Являюсь рут админом на боте (также добавил себя через !addadmin).
    Создал игру от своего NAME1, зашол в игру, бот команд вообще не слушается (свап опен кик тд, хотя в AdminAccess ето всё доступно).

    Создал игру С ника NAME2, и зашол с ника NAME1, все команды работают.
    ....
  18. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    NAME1 являлся рутом? Бот не реагировал или писал что нет доступа к команде?
  19. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    да, NAME1 NAME2 являются рутадминами.
    Когда захожу захожу в лобби, и пишу команды (кик опен свап), реакции некакой нет и надписи про запрет на команды тоже.

    пс если нужно скрины - выложу.
  20. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Очень странно. Просто в коде дальше следует это:
    Код:
    	for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    	{
    		if( (*i)->GetServer( ) == player->GetSpoofedRealm( ) && (*i)->IsRootAdmin( User ) )
    		{
    			RootAdminCheck = true;
    			break;
    		}
    	}
    
    	if (RootAdminCheck)
    	{
    		BluePlayer = true;
    		AdminAccess = CMDAccessAll();
    	}
    суть такова, независимо от того овнер ты или админ, если ты рут(прошел спуф чек, и числишься в списке рутов), то дается полный доступ. Также если бы косяк был с правами, то по идее писал бы что нехватает прав для использования этой команды, а раз бот молчит, то скорее всего не признал тебя админом по какой то причине.