AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Reading data (https://forums.alliedmods.net/showthread.php?t=223244)

Turle 08-11-2013 09:06

Reading data
 
PHP Code:

#include < amxmodx > 
#include < sockets > 

#define PLUGIN "Socket Test#2" 
#define VERSION "1.0" 

enum _:iServerInfos 

    
Server64 ], 
    
RemoteFile64 ], 
    
Socket
    
Error
    
PacketNum 
     


new 
g_ServerDataiServerInfos ]; 

new 
szRequest128 ]; 
new 
g_DataBuffer4096 ]; 

public 
plugin_init( ) 

    
register_pluginPLUGINVERSION"Askhanar" ); 
     
    
FormatHostAndRequest( ); 
    
register_concmd"test""GetPlayerInfo" ); 
     
    
set_task5.0"GetPlayerInfo"112233 ); 
     
    
// Add your code here... 


FormatHostAndRequest( ) 

    
g_ServerDataServer ] = "www.gametracker.com"
    
g_ServerDataRemoteFile ] = "player/lager/193.104.68.21:27050/"
     
    
formatexszRequestsizeof szRequest ) -1,"GET /As HTTP/1.1^r^nHost: %s^r^n^r^n"g_ServerDataRemoteFile ], g_ServerDataServer ] ); 



public 
GetPlayerInfo( ) 

     
    if( 
g_ServerDataSocket ] > 
        
socket_closeg_ServerDataSocket ] ); 
     

    
g_ServerDataSocket ] = socket_openg_ServerDataServer ], 80SOCKET_TCPg_ServerDataError ] ); 
     
    if( 
g_ServerDataError ] == && g_ServerDataSocket ] > 
    { 
        
log_amx"connected, sending: %s"szRequest ); 
        
socket_sendg_ServerDataSocket ], szRequestsizeofszRequest ) ); 
        
g_ServerDataPacketNum ] = 0
         
        
set_task0.1"task_ReciveData"112233__"b"); 
        
set_task5.0"task_close" ); 
    } 
    else 
    { 
        switch( 
g_ServerDataError ] ) 
        { 
            case 
1:    log_amx("[ERROR] Unable to create socket." ); 
            case 
2:    log_amx("[ERROR] Unable to connect to hostname." ); 
            case 
3:    log_amx("[ERROR] Unable to connect to the HTTP port." ); 
             
        }  
         
        
set_fail_state"An error occured, read logs." ); 
    } 
     


public 
task_close( ) 

    
log_amx"removed_task" ); 
    
socket_closeg_ServerDataSocket ] ); 
    
g_ServerDataSocket ] = 0
    
g_ServerDataPacketNum ] = 0
    
remove_task112233 ); 


public 
task_ReciveData( ) 

    
log_amx"task_rec" ); 
    static 
iDataStart 
    
new iLen
     
    if( 
socket_changeg_ServerDataSocket ], ) ) 
    { 
         
        if( ( 
iLen socket_recvg_ServerDataSocket ], g_DataBuffersizeofg_DataBuffer ) ) ) ) 
        { 
             
            if ( ( ++
g_ServerDataPacketNum ] == ) && ( ( iDataStart strfindg_DataBuffer "^r^n^r^n" ) ) > -) ) 
            { 
                
iDataStart += 4
            } 
            else 
            { 
                
iDataStart 0
            } 
             
            
log_amx"[%i] [ %i ] RECEIVED: %s"g_ServerDataPacketNum ], iLeng_DataBufferiDataStart ] ); 
             
        } 
        
/*else 
        { 
     
            log_amx( "removed_task" ); 
            socket_close( g_ServerData[ Socket ] ); 
            g_ServerData[ Socket ] = 0; 
            g_ServerData[ PacketNum ] = 0; 
            remove_task( 112233 ); 
        }*/ 
    

         


How can you get the data in a hud message ?

fysiks 08-11-2013 13:55

Re: Reading data
 
You simply build a string with the data that you want and then use the hud message functions. If that doesn't help then you need to be more specific about your problem.

Turle 08-11-2013 15:19

Re: Reading data
 
Quote:

Originally Posted by fysiks (Post 2010933)
You simply build a string with the data that you want and then use the hud message functions. If that doesn't help then you need to be more specific about your problem.

Could you edit the plugin i've posted / tell me if it's done right ?
Thank you very much for reply.

fysiks 08-11-2013 15:22

Re: Reading data
 
Quote:

Originally Posted by Turle (Post 2010989)
Could you edit the plugin i've posted / tell me if it's done right ?
Thank you very much for reply.

What doesn't work?

Turle 08-11-2013 15:30

Re: Reading data
 
Quote:

Originally Posted by fysiks (Post 2010992)
What doesn't work?

Well, I don't receive any data in logs.I don't really know how to do it in HUD(I'm kind of new in scripting), could you show me please ?
I really appreciate the fact that you're trying to help me, thanks! :)

Black Rose 08-11-2013 22:17

Re: Reading data
 
I made some small changes.

Code:
set_task( 0.1, "task_ReciveData", 112233, _, _, "b", 0 );
-->
Code:
set_task( 0.1, "task_ReciveData" );

Code:
    if( socket_change( g_ServerData[ Socket ], 0 ) )       {           // ...     }
-->
Code:
    if( socket_change( g_ServerData[ Socket ], 0 ) )       {           // ...     }     else         set_task( 0.1, "task_ReciveData" );

Code:
if( ( iLen = socket_recv( g_ServerData[ Socket ], g_DataBuffer, sizeof( g_DataBuffer ) ) ) )
-->

Code:
while( ( iLen = socket_recv( g_ServerData[ Socket ], g_DataBuffer, sizeof( g_DataBuffer ) ) ) )

But your basic error was this:
Code:
    formatex( szRequest, sizeof ( szRequest ) -1,"GET /As HTTP/1.1^r^nHost: %s^r^n^r^n", g_ServerData[ RemoteFile ], g_ServerData[ Server ] ); //                                                     ^
Should be like this obviously
Code:
    formatex( szRequest, sizeof ( szRequest ) -1,"GET /%s HTTP/1.1^r^nHost: %s^r^n^r^n", g_ServerData[ RemoteFile ], g_ServerData[ Server ] ); //                                                     ^

Code:
#include < amxmodx >   #include < sockets >   #define PLUGIN "Socket Test#2"   #define VERSION "1.0"   enum _:iServerInfos   {       Server[ 64 ],       RemoteFile[ 64 ],       Socket,       Error,       PacketNum         }   new g_ServerData[ iServerInfos ];   new szRequest[ 128 ];   new g_DataBuffer[ 4096 ];   public plugin_init( )   {       register_plugin( PLUGIN, VERSION, "Askhanar" );             FormatHostAndRequest( );       register_concmd( "test", "GetPlayerInfo" );             set_task( 5.0, "GetPlayerInfo", 112233 );             // Add your code here...   }   FormatHostAndRequest( )   {       g_ServerData[ Server ] = "www.gametracker.com";       g_ServerData[ RemoteFile ] = "player/lager/193.104.68.21:27050/";             formatex( szRequest, sizeof ( szRequest ) -1,"GET /%s HTTP/1.1^r^nHost: %s^r^n^r^n", g_ServerData[ RemoteFile ], g_ServerData[ Server ] );   }   public GetPlayerInfo( )   {             if( g_ServerData[ Socket ] > 0 )           socket_close( g_ServerData[ Socket ] );             g_ServerData[ Socket ] = socket_open( g_ServerData[ Server ], 80, SOCKET_TCP, g_ServerData[ Error ] );             if( g_ServerData[ Error ] == 0 && g_ServerData[ Socket ] > 0 )       {           log_amx( "connected, sending: %s", szRequest );           socket_send( g_ServerData[ Socket ], szRequest, sizeof( szRequest ) );           g_ServerData[ PacketNum ] = 0;                     set_task( 0.1, "task_ReciveData" );     }       else       {           switch( g_ServerData[ Error ] )           {               case 1:    log_amx("[ERROR] Unable to create socket." );               case 2:    log_amx("[ERROR] Unable to connect to hostname." );               case 3:    log_amx("[ERROR] Unable to connect to the HTTP port." );                         }                     set_fail_state( "An error occured, read logs." );       }         }   public task_close( )   {       log_amx( "removed_task" );       socket_close( g_ServerData[ Socket ] );       g_ServerData[ Socket ] = 0;       g_ServerData[ PacketNum ] = 0;       remove_task( 112233 );   }   public task_ReciveData( )   {       log_amx( "task_rec" );       static iDataStart       new iLen;             if( socket_change( g_ServerData[ Socket ], 0 ) )       {                     while( ( iLen = socket_recv( g_ServerData[ Socket ], g_DataBuffer, sizeof( g_DataBuffer ) ) ) )           {                             if ( ( ++g_ServerData[ PacketNum ] == 1 ) && ( ( iDataStart = strfind( g_DataBuffer , "^r^n^r^n" ) ) > -1 ) )               {                   iDataStart += 4;               }               else               {                   iDataStart = 0;               }                             log_amx( "[%i] [ %i ] RECEIVED: %s", g_ServerData[ PacketNum ], iLen, g_DataBuffer[ iDataStart ] );                         }           /*else           {                     log_amx( "removed_task" );               socket_close( g_ServerData[ Socket ] );               g_ServerData[ Socket ] = 0;               g_ServerData[ PacketNum ] = 0;               remove_task( 112233 );           }*/       }     else         set_task( 0.1, "task_ReciveData" );           }

Turle 08-12-2013 07:34

Re: Reading data
 
It crashes my server.

But it works, meaning that it gets data in logs.

And one more question, how to select just a certain data, for example this page: http://www.gametracker.com/player/lo...163.197:27015/
to get just:
PHP Code:

PLAYER SUMMARY
First Seen
Aug 122013 
Last Seen
Online Now
CURRENT STATS
Score

Minutes Played

Score per Minute

Rank on Server
#10 

Thanks a lot for helping me!

fysiks 08-12-2013 19:29

Re: Reading data
 
Quote:

Originally Posted by Turle (Post 2011390)
And one more question, how to select just a certain data, for example this page: http://www.gametracker.com/player/lo...163.197:27015/
to get just:
PHP Code:

PLAYER SUMMARY
First Seen
Aug 122013 
Last Seen
Online Now
CURRENT STATS
Score

Minutes Played

Score per Minute

Rank on Server
#10 


You parse the HTML accordingly (which is probably not that easy).

Is either of the IPs that you posted your server?

Black Rose 08-12-2013 19:58

Re: Reading data
 
Here's my suggestion. It requires this file.
The regex part might not be perfect because I learned it now just to create this.
Code:
#include <amxmodx> #include <http> #include <regex> new Results[6][32]; enum patternsEnum {     Prefix[32],     Pattern[128] } new Info[][patternsEnum] = {     { "First Seen:",        "\w{3} [0-3][0-9], [12][019][0-9][0-9]" },     { "Last Seen:",   "Online Now|(((Yester|To)day)|(\w{3} [0-3][0-9], [12][019][0-9][0-9])) (1[0-2]|[0-9]):[0-5]\d [A|P]M" },     { "Score:",    "(?<=\s)\d+" },     { "Minutes Played:",    "(?<=\s)\d+" },     { "Score per Minute:",  "(?<=\s)\d+\.?\d?" },     { "Rank on Server:",    "#\d+ out of \d+" } } public plugin_init() {     register_plugin("Test Plugin 9", "", "");         HTTP_DownloadFile("http://www.gametracker.com/player/londin/78.110.163.197:27015/", "result.txt"); } public HTTP_Download(const szFile[] , iDownloadID , iBytesRecv , iFileSize , bool:TransferComplete) {         if ( ! TransferComplete )         return;         new hFile = fopen(szFile, "r");     new num, i, bool: searching;     new buffer[1024], error[128];     if ( ! hFile )         return;         while ( ! feof(hFile) && i < sizeof Info ) {         fgets(hFile, buffer, charsmax(buffer));                 if ( ! searching && contain(buffer, Info[i][Prefix]) != -1 )         searching = true;                 if ( searching ) {                         new Regex:hRegex = regex_match(buffer, Info[i][Pattern], num, error, 127);                         if ( hRegex >= REGEX_OK ) {                 regex_substr(hRegex, 0, Results[i], 31);                 server_print("%s %s", Info[i][Prefix], Results[i]);                 regex_free(hRegex);                 i++;                 searching = false;             }         }     }     fclose(hFile)         delete_file(szFile); }

Code:

First Seen: Aug 12, 2013
Last Seen: Today 7:36 AM
Score: 0
Minutes Played: 0
Score per Minute: 0
Rank on Server: #24185 out of 24184


red_bull2oo6 08-13-2013 06:37

Re: Reading data
 
thanks Black Rose, because of your example.. i have finally learned regex too :)
i`ll use some of you code too ( i`m trying to make it directly.. < not using http.inc > ).

LE: i dont understand the purpose of 'StringId' .


All times are GMT -4. The time now is 15:56.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.