Szukam pluginu który automatycznie pobiera aktualną bazę danych z BL.
Mam na serwerze o ten plugin(patrz niżej), ale nie działa niestety. Jest jakiś inny albo może coś w tym jest źle? Jeszcze ten kod dla pewności kompilowałem i wgrywałem jeszcze raz.
Cvary ustawione. W plugins.ini dopisane.
Errorów nie ma.
Kod:
#include <amxmodx>
#include <sockets>
#include <httpdl>
#define PLUGIN "Blacklisted.pl auto updater"
#define VERSION "1.0"
#define AUTHOR "Bentski & Sn!ff3r"
new dlinfo[MAX_DOWNLOADS + 1][5];
new dlpath[MAX_DOWNLOADS + 1][256];
new ndownloading;
new fwd_dlcomplete, fwd_result;
new banlist[] = "blacklisted.cfg";
new enabled, hour, minute, autoexec;
public plugin_init() {
//register_plugin("HTTP Download", "1.0", "Bentski");
register_plugin(PLUGIN, VERSION, AUTHOR)
fwd_dlcomplete = CreateMultiForward("dlcomplete", ET_IGNORE, FP_CELL, FP_STRING);
enabled = register_cvar("amx_autobl","1");
hour = register_cvar("amx_autobl_hour","5");
minute = register_cvar("amx_autobl_minute","30");
autoexec = register_cvar("amx_autobl_autoexec","1");
register_cvar("autobl",VERSION,FCVAR_SERVER);
if(get_pcvar_num(enabled)) {
set_task(60.0,"check_time",_,_,_,"b");
if(get_pcvar_num(autoexec)) {
server_cmd("exec %s",banlist);
}
}
}
public plugin_natives() {
register_library("httpdl");
register_native("download", "native_download", 1);
}
public native_download(url[], path[]) {
new slot = 0;
while(slot <= MAX_DOWNLOADS && dlinfo[slot][0] != 0)
slot++;
if(slot == MAX_DOWNLOADS) {
log_amx("Maksymalna ilosc plikow przekroczona (%d)", MAX_DOWNLOADS);
return 0;
}
param_convert(1);
param_convert(2);
new u[256], p[256];
copy(u, 7, url);
if(equal(u, "http://"))
copy(u, 248, url[7]);
else copy(u, 255, url);
new pos = 0;
new len = strlen(u);
while (++pos < len && u[pos] != '/') { }
copy(p, 255, u[pos + 1]);
copy(u, pos, u);
new error = 0;
new socket = dlinfo[slot][2] = socket_open(u, 80, SOCKET_TCP, error);
switch(error) {
case 0: {
new msg[512];
format(msg, 511, "GET /%s HTTP/1.1^r^nHost: %s^r^n^r^n", p, u);
socket_send(socket, msg, 512);
copy(dlpath[slot], 255, path);
dlinfo[slot][3] = fopen(path, "wb");
dlinfo[slot][0] = 1;
dlinfo[slot][4] = 0;
ndownloading++;
if(ndownloading == 1)
set_task(0.2, "download_task", 3318, _, _, "b");
new id = dlinfo[slot][1] = random_num(1, 65535);
return id;
}
case 1: log_amx("[HTTP] Blad przy tworzeniu socket'a");
case 2: log_amx("[HTTP] Nie mozna odnalezc domeny");
case 3: log_amx("[HTTP] Nie mozna polaczyc z %s:80", u);
}
return 0;
}
public download_task() {
for(new i = 0; i < MAX_DOWNLOADS; i++) {
if(dlinfo[i][0] == 0)
continue;
new socket = dlinfo[i][2];
new f = dlinfo[i][3];
if(socket_change(socket)) {
new buffer[1024];
new len = socket_recv(socket, buffer, 1024);
if(dlinfo[i][4] == 0) { // if first packet then cut the header
new pos = contain(buffer, "^r^n^r^n");
if(pos > -1) {
for(new j = pos + 4; j < len; j++)
fputc(f, buffer[j]);
dlinfo[i][4]++;
continue;
}
}
// is there a better way to write binary data to a file? :S
for(new j = 0; j < len; j++)
fputc(f, buffer[j]);
dlinfo[i][4]++;
continue;
}
fclose(f);
ExecuteForward(fwd_dlcomplete, fwd_result, dlinfo[i][1], dlpath[i]);
dlinfo[i][0] = 0;
ndownloading--;
if(ndownloading == 0)
remove_task(3318);
socket_close(socket);
}
}
public check_time() {
new arg1[4];
get_time("%H",arg1,3);
if(get_pcvar_num(hour) == str_to_num(arg1)) {
get_time("%M",arg1,3);
if(get_pcvar_num(minute) == str_to_num(arg1)) {
update_list();
}
}
}
public update_list() {
if(file_exists(banlist))
delete_file(banlist)
download("http://www.blacklisted.pl/get_config.php", banlist);
}
public dlcomplete(id, file[]) {
log_amx("Zakonczono pobieranie listy %s",banlist);
fix_file();
}
public fix_file() {
if(write_file(banlist,"// Automatyczny update listy",0)) { // fix first line, this line will be empty, so maybe add a comment ?
new num = file_size(banlist,1);
if(write_file(banlist,"",num - 3)) { // remove 0 from eof
log_amx("Zakonczono poprawe pliku %s",banlist);
server_cmd("exec %s",banlist); // yeah, file updated, so execute it!
}
}
else {
log_amx("Blad przy poprawnianiu pliku %s",banlist);
}
}
Użytkownik Drzanas edytował ten post 29.03.2011 14:21