#include <amxmodx>
#include <curl>
#define PLUGIN "Curl Example SMTP"
#define AUTHOR "Morning Rainbow"
#define VERSION "0.1"
#define MAX_PLAYERS 32
#define SMTP_USERNAME ""
#define SMTP_PASSWORD ""
#define SMTP_URL "ssl://smtp.yandex.ru"
#define SMTP_PORT 465
smtps://smtp.yandex.ru
ssl://smtp.yandex.ru
smtp.yandex.ru
#define SEND_FROM SMTP_USERNAME
#define SENDER_NAME "Stats Bot"
static const c_payload_template[][] =
{
{"To: <%s>^r^n"},
{"From: <%s>(%s)^r^n"},
{"Message-ID: <%s>^r^n"},
{"Subject: %s^r^n"},
{"Content-Type: text/html^r^n"},
{"^r^n"}, /* empty line to divide headers from body, see RFC5322 */
{"Сервер <strong>%s</strong><br>^r^n"},
{"Адрес <strong>%s</strong><br>^r^n"},
{"Статистика для игрока <strong>%s</strong><br>^r^n"},
{"<br>^r^n"},
{"<table><tr><th>Убийства</th><th>В голову</th><th>Смерти</th><th>Выстрелов</th><th>Попадания</th><th>Урон</th></tr>^r^n"},
{"<tr><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr></table>^r^n"}
};
enum _:TUserData
{
usdat_Email[64]
};
new g_udUserData[MAX_PLAYERS+1][TUserData]
new g_iLinesRead[MAX_PLAYERS+1]
new bool:g_bLock[MAX_PLAYERS+1] // может ли игрок опять запросить статистику
new g_szServerName[64], g_szServerAddr[64]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
get_cvar_string("hostname", g_szServerName, charsmax(g_szServerName))
get_user_ip(0, g_szServerAddr, charsmax(g_szServerAddr))
}
public plugin_precache()
{
register_concmd("say", "say_callback")
register_concmd("say_team", "say_callback")
}
public say_callback(id)
{
new buf[128], mail[117];
read_argv(1, buf, charsmax(buf));
if(!equal(buf, "/statsmail", 10))
return PLUGIN_CONTINUE;
read_argv(2, mail, charsmax(mail));
trim(mail);
if(strlen(mail) == 0)
{
client_print(id, print_chat, "Ошибка, не указан email, вы должны указать email после команды /statsmail");
return PLUGIN_CONTINUE;
}
send_mail(id, mail);
return PLUGIN_HANDLED;
}
send_mail(id, mail[])
{
if(g_bLock[id])
{
client_print(id, print_chat, "Вы не можете запросить статистику, пока не обработался предыдущий запрос.");
return;
}
g_bLock[id] = true
g_iLinesRead[id] = 0
client_print(id, print_chat, "Отправка статистики на email ^"%s^"", mail);
new CURL:curl;
new curl_slist:recipients;
if((curl = curl_easy_init()))
{
curl_easy_setopt(curl, CURLOPT_USERNAME, SMTP_USERNAME)
curl_easy_setopt(curl, CURLOPT_PASSWORD, SMTP_PASSWORD)
// отключает проверку сертификата, если включить обратно, то нужно в какой-то другой опции указать путь к папке с сертификатами
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_PORT, SMTP_PORT);
curl_easy_setopt(curl, CURLOPT_URL, SMTP_URL);
// угловые скобки < > добавятся автоматически
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, SEND_FROM);
recipients = curl_slist_append(recipients, mail);
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, "payload_source");
curl_easy_setopt(curl, CURLOPT_READDATA, id);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // вывод дебаг информации в консоль сервера
copy(g_udUserData[id][usdat_Email], strlen(mail), mail);
new data[2];
data[0] = id;
data[1] = recipients;
curl_easy_perform(curl, "payload_complite", data, sizeof(data));
}
}
public payload_source(buffer[], size, nmemb, player)
{
if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1))
return 0;
if(g_iLinesRead[player] > (sizeof(c_payload_template) - 1))
return 0;
if(!is_user_connected(player))
return 0;
new text[512], len
switch(g_iLinesRead[player])
{
case 0: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_udUserData[player][usdat_Email])
case 1: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], SEND_FROM, SENDER_NAME)
case 2:
{
new uid[40];
generate_uid(uid, SEND_FROM);
formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], uid);
}
case 3:
{
new subj[128];
get_user_name(player, subj, charsmax(subj));
format(subj, charsmax(subj), "[%s] Stats for %s", g_szServerName, subj);
formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], subj);
}
case 6: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_szServerName)
case 7: formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], g_szServerAddr)
case 8:
{
new name[32];
get_user_name(player, name, charsmax(name));
formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], name);
}
case 11:
{
new stats[8], hits[8], name[32];
hits = "awd1"
name = "awd2"
stats = "awd3"
formatex(text, charsmax(text), c_payload_template[g_iLinesRead[player]], stats[0], stats[2], stats[1], stats[4], stats[5], stats[6]);
}
default: copy(text, charsmax(text), c_payload_template[g_iLinesRead[player]]);
}
g_iLinesRead[player]++;
len = strlen(text);
if(len > nmemb)
{
log_amx("[%s] Размер буфера (%d) для записи превышает допустимый максимум (%d)", len, nmemb);
g_iLinesRead[player] = 0;
return 0;
}
copy(buffer, len, text);
return len;
}
public payload_complite(CURLcode:code, CURL:curl, data[], data_size)
{
new id = data[0];
new curl_slist:recipients = curl_slist:data[1];
if(is_user_connected(id))
{
if(code != CURLE_OK)
{
new error[256];
curl_easy_strerror(code, error, charsmax(error));
client_print(id, print_chat, "Ошибка отправки: %s", error);
}
else
client_print(id, print_chat, "Письмо успешно отправлено! Проверьте папку ^"Спам^", если не найдёте письмо в папке ^"Принятые^"");
}
curl_slist_free_all(recipients);
curl_easy_cleanup(curl);
g_bLock[id] = false;
}
stock generate_uid(buf[40], const mail[])
{
static const chars[] = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'i', 'I', 'k', 'K', 'o', '2', '4', '_', '-'} // ok
new gen_size = charsmax(buf) - strlen(mail)-1;
for(new i = 0; i < gen_size; i++)
{
buf[i] = chars[random(sizeof chars)];
}
add(buf, charsmax(buf), ".");
add(buf, charsmax(buf), mail, strlen(mail));
}