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

Ф-я проверки бота

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

  1. DhL Ньюфаг

    Сообщения:
    36
    Спасибы:
    0
    Суть ф-ии:
    - Проверить в базе bnet_username == dbuser == botid
    - Если таковая запись имеется - продолжить загрузки, если нет - выключение бота.

    ghost.cpp:

    Код:
    CGHost :: CGHost( CConfig *CFG )
    {
    
    string bot_username = CFG->GetString( "bnet_username", string( ) );
    uint32_t bot_botid = CFG->GetInt( "db_mysql_botid", uint32_t( ) );
    string bot_dbuser = CFG->GetString( "db_mysql_user", string( ) );
    string bot_ip = CFG->GetString( "bot_bindaddress", string( ) );
    
    if( !m_DB->ThreadedBotValid( bot_username, bot_botid, bot_dbuser, bot_ip ) )
    {
    	CONSOLE_Print( "[GHOST] Bot not valid. Closing. " );
            exit(1);
    }
    ghostdb.h:

    Код:
    
    class CGHostDB
    {
      ** text **
    public:
    
      virtual bool BotValid( string name, uint32_t id, string dbuser, string ip );
      virtual CCallableBotValid *ThreadedBotValid( string name, uint32_t id, string dbuser, string ip );
    
    };
    
    class CCallableBotValid;
    
    class CCallableBotValid : virtual public CBaseCallable
    {
    protected:
    	string m_Name;
    	uint32_t m_ID;
    	string m_DBuser;
    	string m_IP;
    	bool m_Result;
    
    public:
    	CCallableBotValid( string nName, uint32_t nId, string nDBuser, string nIp ) : CBaseCallable( ), m_Name( nName ), m_ID( nId ), m_DBuser( nDBuser ), m_IP( nIp ), m_Result( false ) { }
    	virtual ~CCallableBotValid( );
    
    	virtual string GetName( )				{ return m_Name; }
    	virtual uint32_t GetId( )					{ return m_ID; }
    	virtual string GetDBuser( )				{ return m_DBuser; }
    	virtual string GetIp( )					{ return m_IP; }
    	virtual bool GetResult( )				{ return m_Result; }
    	virtual void SetResult( bool nResult )	{ m_Result = nResult; }
    };
    ghostdb.cpp:

    Код:
    CCallableBotValid *CGHostDB :: ThreadedBotValid( string name, uint32_t id, string dbuser, string ip )
    {
    	return NULL;
    }
    
    CCallableBotValid :: ~CCallableBotValid( )
    {
    
    }
    
    bool CGHostDB :: BotValid( string name, uint32_t id, string dbuser, string ip )
    {
    	return true;
    }
    
    ghostdbmysql.cpp:

    Код:
    CCallableBotValid *CGHostDBMySQL :: ThreadedBotValid( string name, uint32_t id, string dbuser, string ip )
    {
    	void *Connection = GetIdleConnection( );
    
    	if( !Connection )
    		m_NumConnections++;
    
    	CCallableBotValid *Callable = new CMySQLCallableBotValid( name, id, dbuser, ip, Connection, m_BotID, m_Server, m_Database, m_User, m_Password, m_Port );
    	CreateThread( Callable );
    	m_OutstandingCallables++;
    	return Callable;
    }
    
    bool MySQLBotValid( void *conn, string *error, uint32_t botid, string name, uint32_t id, string dbuser, string ip )
    {
    	bool mybool = false;
    
    	string EscName = MySQLEscapeString( conn, name );
    	string EscDBUser = MySQLEscapeString( conn, dbuser );
    	string EscIP = MySQLEscapeString( conn, ip );
    	
    	string Query = "SELECT owner FROM craft_ghosts WHERE dbuser='" + EscDBUser + "' AND name = '" + EscName + "'";
    
    	if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.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.empty( ) )
    				mybool = true;
    
    			mysql_free_result( Result );
    		}
    		else
    			*error = mysql_error( (MYSQL *)conn );
    	}
    
    	return mybool;
    }
    
    void CMySQLCallableBotValid :: operator( )( )
    {
    	Init( );
    
    	if( m_Error.empty( ) )
    		m_Result = MySQLBotValid( m_Connection, &m_Error, m_SQLBotID, m_Name, m_SQLBotID, m_DBuser, m_IP );
    
    	Close( );
    }
    
    
    ghostdbmysql.h:

    Код:
    virtual CCallableBotValid *ThreadedBotValid( string name, uint32_t id, string dbuser, string ip );
    
    bool MySQLBotValid( void *conn, string *error, uint32_t botid, string name, uint32_t id, string dbuser, string ip );
    
    
    class CMySQLCallableBotValid : public CCallableBotValid, public CMySQLCallable
    {
    public:
    	CMySQLCallableBotValid( string nName, uint32_t nId, string nDbuser, string nIp, void *nConnection, uint32_t nSQLBotID, string nSQLServer, string nSQLDatabase, string nSQLUser, string nSQLPassword, uint16_t nSQLPort ) : CBaseCallable( ), CCallableBotValid( nName, nId, nDbuser, nIp ), CMySQLCallable( nConnection, nSQLBotID, nSQLServer, nSQLDatabase, nSQLUser, nSQLPassword, nSQLPort ) { }
    	virtual ~CMySQLCallableBotValid( ) { }
    
    	virtual void operator( )( );
    	virtual void Init( ) { CMySQLCallable :: Init( ); }
    	virtual void Close( ) { CMySQLCallable :: Close( ); }
    };
    
    Тоесть ThreadedBotValid ( ) ( ghost.cpp ) должна вернуть true : false;

    Но она возвращается, почему-то мне кажется, всегда false;

    Делал по аналогии с AdminCheck :] Компилируется все отлично. В чем может быть проблема?;(