translator12 .sma (96): error 017: undefined symbol "socket_is_writable"
Code:
#define VERSION "1.2"
#include <amxmodx>
#include <amxmisc>
#include <sockets>
#include <regex>
#define TASKID_SOCKET_CLOSE 9637
new const HOSTNAME[ ] = "translate.google.com"
new const REQUEST[ ] = "GET /translate_a/t?client=t&sl=%s&tl=%s&hl=%s&sc=2&ie=UTF-8&oe=UTF-8&pc=1&oc=1&otf=1&ssel=0&tsel=0&q=%s HTTP/1.1^r^nHost: translate.google.com^r^n^r^n"
#define MAX_PLAYERS 32
new sockets[ MAX_PLAYERS + 1 ]
new Regex:regex
public plugin_init( )
{
register_plugin( "AMXX Translator", VERSION, "Milashkasiya" )
register_concmd( "amx_translator", "concmd_translator", _, "<sl> <tl> <text>" )
prepare_regex( )
}
public concmd_translator( id, level, cid )
{
// check params
if( !cmd_access(id, level, cid, 4) )
return PLUGIN_HANDLED
if( sockets[id] )
{
console_print( id, "Tiene una traduccion en proceso, intente en unos momentos..." )
return PLUGIN_HANDLED
}
new szSL[ 5 ]
new szTL[ 3 ]
new iLenSL = read_argv( 1, szSL, charsmax(szSL) )
new iLenTL = read_argv( 2, szTL, charsmax(szTL) )
// validation
if( iLenTL != 2 || (iLenSL == 2 && szSL[0] == szTL[0] && szSL[1] == szTL[1]) )
{
console_print( id, "No se puede procesar la traduccion, verifique los parametros e intente de nuevo..." )
return PLUGIN_HANDLED
}
if( !iLenSL || !equali(szSL, "auto") )
{
copy( szSL, charsmax(szSL), "auto" )
}
// invalid socket
if( !prepare_socket(id) )
return PLUGIN_HANDLED
// text to translate
static szText[ 128 ]
read_argv( 3, szText, charsmax(szText) )
// full request
static szEncodedText[ 128 ]
static szFullRequest[ 300 ]
StringURLEncode( szText, szEncodedText, charsmax(szEncodedText) )
iLenSL = formatex( szFullRequest, charsmax(szFullRequest), REQUEST, szSL, szTL, szTL, szEncodedText )
make_request( id, sockets[id], szFullRequest, iLenSL )
return PLUGIN_HANDLED
}
prepare_socket( id )
{
new error
new socket = socket_open_non_blocking( HOSTNAME, 80, SOCKET_TCP, error )
if( socket <= 0 )
{
switch( error )
{
case 1: log_amx( "Error while creating socket" )
case 2: log_amx( "Couldn't resolve hostname" )
case 3: log_amx( "Couldn't connect to given hostname:port" )
}
return 0
}
sockets[ id ] = socket
return socket
}
make_request( id, socket, const request[], len )
{
if( socket_is_writable(socket, 3000000) )
{
socket_send( socket, request, len )
set_task( 0.2, "task_recv_data", id, _, _, "a", 15 )
set_task( 3.1, "task_socket_close", id + TASKID_SOCKET_CLOSE )
}
}
public task_recv_data( id )
{
new iSocket = sockets[ id ]
if( socket_change(iSocket) )
{
static szData[ 512 ]
socket_recv( iSocket, szData, charsmax(szData) )
if( szData[0] )
{
new iRet
if( regex_match_c(szData, regex, iRet) > 0 )
{
regex_substr( regex, 1, szData, charsmax(szData) )
remove_task( id )
remove_task( id + TASKID_SOCKET_CLOSE )
socket_close( iSocket )
console_print( id, "[AMXX TRANSLATOR] %s", szData )
sockets[ id ] = 0
}
}
}
}
public task_socket_close( id )
{
id -= TASKID_SOCKET_CLOSE
console_print( id, "Ha ocurrido un error con la traduccion, intente nuevo..." )
socket_close( sockets[id] )
sockets[ id ] = 0
}
public client_disconnect( id )
{
if( task_exists(id) || task_exists(id + TASKID_SOCKET_CLOSE) )
{
remove_task( id )
remove_task( id + TASKID_SOCKET_CLOSE )
socket_close( sockets[id] )
sockets[ id ] = 0
}
}
prepare_regex( )
{
new ret, error[ 32 ]
if( (regex = regex_compile( "\[^"([^^^"]*)^",", ret, error, charsmax(error))) < REGEX_OK )
{
log_amx( "REGEX ERROR: (%i)%s", ret, error )
pause( "ad" )
}
}
// https://forums.alliedmods.net/showthread.php?t=117744
stock StringURLEncode( const szInput[ ], szOutput[ ], const iLen )
{
static const HEXCHARS[ 16 ] = {
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66
};
new iPos, cChar, iFLen;
while( ( cChar = szInput[ iPos ] ) && iFLen < iLen )
{
if( cChar == 0x20 )
{
szOutput[ iFLen++ ] = 0x2B;
}
else if( !( 0x41 <= cChar <= 0x5A )
&& !( 0x61 <= cChar <= 0x7A )
&& !( 0x30 <= cChar <= 0x39 )
&& cChar != 0x2D
&& cChar != 0x2E
&& cChar != 0x5F )
{
if( ( iFLen + 3 ) > iLen )
{
break;
}
else if( cChar > 0xFF
|| cChar < 0x00 )
{
cChar = 0x2A;
}
szOutput[ iFLen++ ] = 0x25;
szOutput[ iFLen++ ] = HEXCHARS[ cChar >> 4 ];
szOutput[ iFLen++ ] = HEXCHARS[ cChar & 15 ];
}
else
{
szOutput[ iFLen++ ] = cChar;
}
iPos++;
}
szOutput[ iFLen ] = 0;
return iFLen;
}