Need SomeOne to check my translation plugin
Hi all!
This is my second post :)
Few days ago I've created plugin which is translating whole chat to player langs, via google translate.
My problem is that i can't test it, because I don't know anyone with foreign IP.
Here is my code. Please post any suggestions here.
Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <geoip>
#include <cstrike>
#include <sockets_hz>
#include <regex>
#include <colorchat>
#define PLUGIN "Chat Translation ULTIMATE!"
#define VERSION "1.0"
#define AUTHOR "peku33"
#define MAXSOCK 64
#define CHANGE_TASKID 4321
new sTranslationSocks[MAXSOCK];
new sTranslationSender[MAXSOCK];
new sTranslationDestTeam[MAXSOCK];
new sTranslationDestLang[MAXSOCK][3];
new sTranslationSrcLang[MAXSOCK][3];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("amx_translation_version", VERSION);
register_clcmd("say", "hook_say");
//register_clcmd("say_team", "hook_say_team");
}
public hook_say(sender)
{
if(is_user_connected(sender))
{
new text[192]
read_args(text, 191);
remove_quotes(text);
prepare_translation(sender, text, 0);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public prepare_translation(sender, text[], team)
{
//Find langs to translate, exclude sender lang
new sender_ip[32];
new sender_lang[3];
get_user_ip(sender, sender_ip, 32, true);
geoip_code2(sender_ip, sender_lang)
//Translate
new rec_ip[32];
new rec_lang[3];
new langs_used[33][3];
new bool:yet = false;
new transid, err;
new query[512];
for(new i = 1; i <= 32; i++)
{
if(is_user_connected(i) && !is_user_bot(i))
{
get_user_ip(i, rec_ip, 31, true);
geoip_code2(rec_ip, rec_lang);
yet = false;
if(equali(rec_lang, sender_lang))
{
showchat(sender, text, team, rec_lang, sender_lang);
continue;
}
//Check wether this lang has been translated
for(new j = 1; j <= 32; j++)
{
if(equali(rec_lang, langs_used[j])/* || i == sender*/)
{
yet = true;
}
}
if(!yet)
{
transid = find_free_sock();
if(transid == -1)
{
showchat(sender, text, team, rec_lang, sender_lang);
}
else
{
if((sTranslationSocks[transid] = socket_open("ajax.googleapis.com", 80, SOCKET_TCP, err)) > 0)
{
socket_unblock(sTranslationSocks[transid]);
copy(sTranslationDestLang[transid], 3, rec_lang);
copy(sTranslationSrcLang[transid], 3, sender_lang);
sTranslationDestTeam[transid] = team;
sTranslationSender[transid] = sender;
//Prepare query
strtolower(sender_lang);
strtolower(rec_lang);
//Replace
replace_all(text, 191, " ", "%20");
replace_all(text, 191, "&", "");
replace_all(text, 191, "=", "");
replace_all(text, 191, "^"", "");
replace_all(text, 191, "'", "");
formatex(query, 511, "GET /ajax/services/language/translate?v=1.0&q=%s&langpair=%s|%s HTTP/1.1^r^nHost: ajax.googleapis.com^r^nUser-Agent: peku33 chat translator (%s)^r^n^r^n", text, sender_lang, rec_lang, VERSION);
socket_send(sTranslationSocks[transid], query, strlen(query))
set_task(0.1, "check_socket_change", CHANGE_TASKID+transid, _, _, "b");
}
else
{
set_fail_state("Cannot open socket to google");
}
}
}
}
}
}
public showchat(sender, text[], team, dstlang[3], srclang[3])
{
new ip[32], lang[3];
if(is_user_connected(sender))
{
new Color:color;
switch(cs_get_user_team(sender))
{
case CS_TEAM_CT:
{
color = BLUE;
}
case CS_TEAM_T:
{
color = RED;
}
default:
{
color = GREY;
}
}
new name[32];
get_user_name(sender, name, 31);
for(new i = 1; i <= 32; i++)
{
if(is_user_connected(i) && is_user_alive(i) == is_user_alive(sender) && (team == 0 || cs_get_user_team(i) == CsTeams:team))
{
get_user_ip(i, ip, 31, true);
geoip_code2(ip, lang);
if(equali(lang, dstlang))
{
ColorChat(i, color, "%s: ^x01%s ^x04[%s->%s]", name, text, srclang, dstlang);
}
}
}
}
}
public find_free_sock()
{
for(new i = 1; i < MAXSOCK; i++)
{
if(sTranslationSocks[i] == 0)
{
return i;
}
}
return -1;
}
public check_socket_change(taskid)
{
new transid = taskid - CHANGE_TASKID;
if(socket_change(sTranslationSocks[transid]) > 0)
{
remove_task(taskid);
new data[512];
socket_recv(sTranslationSocks[transid], data, 511);
//Parse returned data
new regret, regerr[128]
new Regex:reg = regex_match(data, "{^"translatedText^":^"(.+)^"}", regret, regerr, 127, "s");
switch(reg)
{
case REGEX_PATTERN_FAIL:
{
log_amx("Regex Pattern Fail! (%d) (%s)", regret, regerr);
}
case REGEX_MATCH_FAIL:
{
log_amx("Regex Match Fail! (%d) (%s)", regret, regerr);
}
case REGEX_NO_MATCH:
{
log_amx("Regex No MATCH Fail! (%d) (%s)", regret, regerr);
}
default:
{
new text[192];
regex_substr(reg, 1, text, 191);
showchat(sTranslationSender[transid], text, sTranslationDestTeam[transid], sTranslationDestLang[transid], sTranslationSrcLang[transid]);
regex_free(reg);
}
}
socket_close(sTranslationSocks[transid]);
sTranslationSocks[transid] = 0;
}
}
|