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

Safe List

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

  1. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    Вечер добрый.
    Рылся в конфиге, и решил проверить команду -

    Код:
    ### если 1, то SAFE LISTED юзеры могут юзать !pub/!map/!unhost 
    bot_safecanhost = 1
    ничего не получилось.
    GHostONE 1.7.266.

    Каким другим способом можно дать игрокам из Safe List'a доступ к командам !pub !unhost и !start...
    :newcry:
  2. Synth (LM) Пантограф!

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

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    спасибо :prayy:
    со вчерашнего вечера искал (но что я могу найти)...
  4. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Ну там просто есть переменная, ее нужно полностью делать (команду), а мне лень :facepalm:
  5. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    тоесть команда
    не рабочая?
    а может просто для определённыех команд (!pub !Unhost !starT) что-то дописать, и сейфлист тоже смогут ими пользоватся (как ты мне показывал с командой !sla)...
  6. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    ну что ? вы разобрались с этим ? а то тоже интересно в чем проблема ...
  7. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Я глянул в коде, сама переменная объявлена, но нигде не используется. Надо просто создать команду и привязать к этой переменной
    Вот как я решил эту проблему для !pub:
    bnet.ccp
    Ищем
    ~5650
    Код:
    /*********************			
    * NON ADMIN COMMANDS *			
    *********************/
    После этой надписи добавляем новую команду !pub(код команды берем там же, ~3960 строка, надо только удалить парочку проверок). У меня получилось такое чудо:
    Код:
    // !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;
    
    				}
    Также по аналогии получаются команды !map и !unhost. Если надо могу выложить.
    P.S. первая самостоятельная правка кода. Если что не так, сильно не бейте :bIbIbIblya:
  8. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Да, молодец, бери пироги с полок.
  9. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    Все работает, спс :)
    добавь код и тех двух команд если не сложно )
  10. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Компилировать то пробовал?
  11. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    я не полный чайник :)
    одну строчку по спешке захватил случайно когда код вставлял )
  12. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    По аналогии, смотришь в bnet.ccp команду, добавляешь проверку IsSafe(User) и m_GHost->m_SafeCanHost и удаляешь лишнее, если такое обнаружиться:
    !unhost
    Код:
    				//
    				// !UNHOST
    				//
    				if( (Command == "unhost" || Command == "uh") && IsSafe(User) && m_GHost->m_SafeCanHost )
    				{
    					if( m_GHost->m_CurrentGame )
    					{
    						if( m_GHost->m_CurrentGame->GetCountDownStarted( ) )
    							QueueChatCommand( m_GHost->m_Language->UnableToUnhostGameCountdownStarted( m_GHost->m_CurrentGame->GetDescription( ) ), User, Whisper );
    						else
    						{
    							// if the game owner is still in the game only allow the root admin to unhost the game
    
    							if( m_GHost->m_CurrentGame->GetPlayerFromName( m_GHost->m_CurrentGame->GetOwnerName( ), false ) && !IsRootAdmin( User ) && IsAdmin(m_GHost->m_CurrentGame->GetOwnerName( )) )
    								QueueChatCommand( m_GHost->m_Language->CantUnhostGameOwnerIsPresent( m_GHost->m_CurrentGame->GetOwnerName( ) ), User, Whisper );
    							else
    							{
    								QueueChatCommand( m_GHost->m_Language->UnhostingGame( m_GHost->m_CurrentGame->GetDescription( ) ), User, Whisper );
    								m_GHost->m_CurrentGame->SetExiting( true );
    							}
    						}
    					}
    					else
    						QueueChatCommand( m_GHost->m_Language->UnableToUnhostGameNoGameInLobby( ), User, Whisper );
    				}
    !map
    Код:
    				if( Command == "map" && IsSafe(User) && m_GHost->m_SafeCanHost )
    				{
    					if( Payload.empty( ) )
    						QueueChatCommand( m_GHost->m_Language->CurrentlyLoadedMapCFGIs( m_GHost->m_Map->GetCFGFile( ) ), User, Whisper );
    					else
    					{
    						string FoundMaps;
    
    						try
    						{
    							path MapPath( m_GHost->m_MapPath );
    							string Pattern = Payload;
    							transform( Pattern.begin( ), Pattern.end( ), Pattern.begin( ), (int(*)(int))tolower );
    
    							if( !exists( MapPath ) )
    							{
    								CONSOLE_Print( "[BNET: " + m_ServerAlias + "] error listing maps - map path doesn't exist" );
    								QueueChatCommand( m_GHost->m_Language->ErrorListingMaps( ), User, Whisper );
    							}
    							else
    							{
    								directory_iterator EndIterator;
    								path LastMatch;
    								uint32_t Matches = 0;
    
    								for( directory_iterator i( MapPath ); i != EndIterator; i++ )
    								{
    									string FileName = i->filename( );
    									string Stem = i->path( ).stem( );
    									transform( FileName.begin( ), FileName.end( ), FileName.begin( ), (int(*)(int))tolower );
    									transform( Stem.begin( ), Stem.end( ), Stem.begin( ), (int(*)(int))tolower );
    
    									if( !is_directory( i->status( ) ) && FileName.find( Pattern ) != string :: npos )
    									{
    										LastMatch = i->path( );
    										Matches++;
    
    										if( FoundMaps.empty( ) )
    											FoundMaps = i->filename( );
    										else
    											FoundMaps += ", " + i->filename( );
    
    										// if the pattern matches the filename exactly, with or without extension, stop any further matching
    
    										if( FileName == Pattern || Stem == Pattern )
    										{
    											Matches = 1;
    											break;
    										}
    									}
    								}
    
    								if( Matches == 0 )
    									QueueChatCommand( m_GHost->m_Language->NoMapsFound( ), User, Whisper );
    								else if( Matches == 1 )
    								{
    									string File = LastMatch.filename( );
    									QueueChatCommand( m_GHost->m_Language->LoadingConfigFile( File ), User, Whisper );
    
    									// hackhack: create a config file in memory with the required information to load the map
    
    									CConfig MapCFG;
    									MapCFG.Set( "map_path", "Maps\\Download\\" + File );
    									MapCFG.Set( "map_localpath", File );
    									bool dota = false;
    									string dt=string();
    									string dc=string();
    									string dh=string();
    									if (File.find("Allstars")!=string::npos)
    										dota = true;
    									if (dota)
    									{
    										dt = "dota";
    										dc = "dota_elo";
    										if (m_GHost->m_forceautohclindota)
    											dh = "ar";
    									}
    									MapCFG.Set( "map_type", dt );
    									MapCFG.Set( "map_matchmakingcategory", dc );
    									MapCFG.Set( "map_defaulthcl", dh );
    									m_GHost->m_Map->Load( &MapCFG, File );
    								}
    								else
    									QueueChatCommand( m_GHost->m_Language->FoundMaps( FoundMaps ), User, Whisper );
    							}
    						}
    						catch( const exception &ex )
    						{
    							CONSOLE_Print( "[BNET: " + m_ServerAlias + "] error listing maps - caught exception [" + ex.what( ) + "]" );
    							QueueChatCommand( m_GHost->m_Language->ErrorListingMaps( ), User, Whisper );
    						}
    					}
    				}
    Тут тупое копирование + 5 сек на изменение пары строк.
  13. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    нащёт паба он должен так выглядить
    Код:
                if (( Command == "pub" || Command == "p" ) && ((IsSafe(User) && m_GHost->m_SafeCanHost)m_GHost->m_UserCanHost ))
    а унхост нужно сделать строго по овнеру или рут админ..
    ЗЫ:имхо юзание m_CurrentGame в bnet это чтото из разряда //HackHack т.е. как по мне нужно найти другой метод исполнения ф-ций в игре...
  14. StafiloKOK Ньюфаг

    Сообщения:
    19
    Спасибы:
    0
    Забавно. Когда я спрашивал про то же самое, НИКТО не ответил...

    P.S. С помощью этой фигни я сделал себе на боте полу-админов (с очень ограниченными возможностями).
  15. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    вот только меня одно смущает - safe пользователям доступно на канале только ети 3 команды, но когда они создают игру, им автоматически даётся овнера, а у овнера по дефолту есть доступ на бан, кик тд, если забрать у овнера доступ к етим командам, админы не смогут банить...
    нужно что бы при создании игры админом, давались права из "admin access control" а сефл листу из овнера...
    если кто-то понял что я написал :lol:
  16. StafiloKOK Ньюфаг

    Сообщения:
    19
    Спасибы:
    0
    Для этого закомментируй/удали вот эту хрень:

    game.cpp
    Код:
    	// this is blue player
    	if (p)
    		if (p->GetPID()==player->GetPID())
    			BluePlayer = true;
    
    	if (BluePlayer && m_GHost->m_BlueIsOwner)
    	{
    		AdminCheck = true;
    		AdminAccess = m_GHost->CMDAccessAddOwner(0);
    	}
    	if (IsOwner(User))
    	{
    		AdminCheck = true;
    		AdminAccess = m_GHost->CMDAccessAddOwner(0);
    	}
    Хотя это отразится на !pubby, но лично я отключил эту команду, так что...
  17. MuP .

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

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    да! (что бы на него действовали только команды которые я отметил в "admin access control", а игрокам из сейфлиста, давались команды овнера + ну и те 3 команды которые ты выложил) если такое возможно...


    ПС если у админов в "admin access control" включены команды на !ban !kick !end а в бот_овнер выключены, то при создании игры ему автоматически даётся овнера, соответственно права на бан и кик пропадают (в игрре банить и киккать админ не сможет)...
    так?


    StafiloKOK, попробую отпишусь.
    я серьёзно взялся за ето дело :opasnoste:
  19. santaklays Ньюфаг

    Сообщения:
    17
    Спасибы:
    0
    И все же не работает данный код, дописал, скомпилил, добавил юзера в сейф лист, бот не реагирует на его команду.
    MuP выложи полный код bnet.cpp или сам уже готовы файл. Интересно где я ошибся ... или код просто не робит =\

    ps кстати, BNET: wc3.theabyss.ru] startadvex3 failed это что за трабла ?
    Коннектится нормально на все сервера, игру создавать не хочет, пишет что название попробуйте другое, и после начинает хаотично переконективатся в заданные каналы :) Трабла именно в абисе, так как после удаления его с конфига все стает на свои места .
  20. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    всё работает :lol: