Advertisement
Fedcomp

Untitled

Nov 27th, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <sockets_hz>
  4.  
  5. #define DEBUG
  6.  
  7. #pragma tabsize 0
  8.  
  9. #define PREFIX "[WAMod]"
  10. #define WAMOD_LINESIZE 2048 // Я бы даже сказал что многовато, но на ваш вкус. Если поставить 300, то можно добиться понижения потребления памяти. Я поставил 2048 чтобы удовлетворить любую школоту.
  11.  
  12. new g_ListeningSocket // Наш шпион сокет.
  13.  
  14. new Array:HTML_TEMPLATE, // HTML Шаблон в памяти
  15.     Array:html_reply // И массив в котором будет готовиться html ответ
  16.  
  17. public plugin_init() {
  18.         register_plugin("WAMod", "0.1-indev", "Fedcomp")
  19.        
  20.         read_template()
  21.         init_my_socket()
  22. }
  23.  
  24. public plugin_end ()
  25. {
  26.         socket_close(g_ListeningSocket)
  27.         ArrayDestroy(HTML_TEMPLATE)
  28.         ArrayDestroy(html_reply)
  29. }
  30.  
  31. // ======== UTILS ============ //
  32.  
  33. // Получаем порт
  34. // FIXME: Отдельный квар для порта
  35. get_port(){
  36.     return get_cvar_num("port")
  37. }
  38.  
  39. // ======= </UTILS> ========== //
  40.  
  41. // Читаем шаблон в память
  42. read_template(){
  43.     HTML_TEMPLATE   = ArrayCreate(WAMOD_LINESIZE)
  44.  
  45.     new path[255]
  46.    
  47.     // Получаем путь к шаблону
  48.     get_configsdir(path, charsmax(path))
  49.     format(path, charsmax(path), "%s/wamod/wamod.html", path)
  50.  
  51.     // Если файла с шаблоном нет то плагин отказывается работать
  52.     if (!file_exists(path))
  53.         set_fail_state("wamod.html is not found!!")
  54.    
  55.     // Открываем шаблон на чтение
  56.     new i_filehandle = fopen(path,"rb")
  57.     new szBuffer[2048]
  58.    
  59.     while(!feof(i_filehandle))
  60.     {
  61.         fgets(i_filehandle, szBuffer, charsmax(szBuffer));
  62.         trim(szBuffer);
  63.        
  64.         ArrayPushString(HTML_TEMPLATE,szBuffer)
  65.     }
  66.    
  67.     html_reply      = ArrayCreate(WAMOD_LINESIZE, ArraySize(HTML_TEMPLATE) )
  68.     fclose(i_filehandle)
  69. }
  70.  
  71. // Создаем сокет на прослушку. Отсылаем телефонные переговоры в США
  72. init_my_socket() {
  73.     new error //you're the error
  74.     g_ListeningSocket = socket_listen("0.0.0.0", get_port(),SOCKET_TCP,error)
  75.     socket_unblock(g_ListeningSocket)
  76.     server_print("%s LISTENNING ANY IP ON PORT %d", PREFIX, get_port())
  77.    
  78.     // Делаем таймер на прослушку телефонных переговоров. Т.е таймер который раз в заданное время будет проверять на новые соединения
  79.     set_task(0.05,"incoming_connection",0,"",0,"b")
  80. }
  81.  
  82.  
  83. public incoming_connection() {
  84.     new connection;
  85.     if((connection = socket_accept(g_ListeningSocket)) < 0) return
  86.        
  87.     #if defined DEBUG
  88.     server_print("%s New Connection", PREFIX)
  89.     #endif
  90.    
  91.     // Создаем массив в котором будет уже сформированный html который можно отправлять
  92.     new Array:html_reply = ArrayCreate(WAMOD_LINESIZE)
  93.    
  94.     // Calculating content lenght:
  95.     new i_arr_size = ArraySize(HTML_TEMPLATE),
  96.         content_size = 0
  97.    
  98.     server_print("%s Template lines: %i", PREFIX, i_arr_size)
  99.    
  100.     for(new i=0; i < i_arr_size; i++){
  101.         new szBuffer[WAMOD_LINESIZE]
  102.         ArrayGetString(HTML_TEMPLATE, i, szBuffer, WAMOD_LINESIZE);
  103.        
  104.         // Если найден шаблон в строке
  105.         if(contain(szBuffer, "{{") != -1){
  106.             replace_macroses(szBuffer, WAMOD_LINESIZE)
  107.         }
  108.  
  109.         content_size += strlen(szBuffer)
  110.        
  111.         ArrayPushString(html_reply, szBuffer)
  112.     }
  113.    
  114.     server_print("%s content size: %i", PREFIX, content_size)
  115.    
  116.     new http_response[1024]
  117.        
  118.     format(http_response, charsmax(http_response),
  119.         "%s%s%s%s%i%s%s"                                ,
  120.         "HTTP/1.0 200 OK^r^n"                       ,
  121.         "Server: WAMod barely working server^r^n"   ,
  122.         //"Connection: keep-alive, close^r^n"                       ,
  123.         "Accept-Ranges: bytes^r^n"                  ,
  124.         "Content-Length: ", content_size, "^r^n"                ,
  125.         "Content-Type: text/html^r^n^r^n"          
  126.     )
  127.    
  128.     socket_send(connection, http_response, strlen(http_response))
  129.    
  130.    
  131.     for(new i=0; i < i_arr_size; i++){
  132.         new szBuffer[WAMOD_LINESIZE]
  133.         ArrayGetString(html_reply, i, szBuffer, WAMOD_LINESIZE);
  134.         socket_send(connection, szBuffer, strlen(szBuffer))
  135.     }
  136.  
  137.     set_task(0.1,"release_connection",connection)
  138.     ArrayClear( html_reply )
  139. }
  140.  
  141. // Функция заменяет макросы их значениями
  142. public replace_macroses(buffer[], len){
  143.     static  hostname[255],
  144.             ipport[22],
  145.             port,
  146.             playerscurrent,
  147.             maxplayers,
  148.             bool:password,
  149.             timelimit,
  150.             roundtime,
  151.             bool:friendlyfire
  152.            
  153.     get_cvar_string("hostname", hostname, charsmax(hostname) )  // Название сервера
  154.     get_user_ip(0, ipport, charsmax(ipport) )               // IP:PORT сервера
  155.     playerscurrent          = get_playersnum()                  // Количество игроков на сервере
  156.     maxplayers              = get_maxplayers()
  157.    
  158.     new pwd[255]
  159.     get_cvar_string("sv_password", pwd, charsmax(pwd) )
  160.    
  161.     if(pwd[0] == 0) // Если первая ячейка пуста значит пароля нет
  162.         password = false
  163.     else
  164.         password = true
  165.  
  166.     timelimit = get_cvar_num("mp_timelimit")
  167.     roundtime = get_cvar_num("mp_roundtime")
  168.     friendlyfire = get_cvar_num("mp_friendlyfire")
  169.  
  170.     // Не думаю что у вас на одной строке будет два одинаковых шаблона, поэтому replace а не replace_all
  171.     replace(buffer, len, "{{HOSTNAME}}",            hostname);
  172.     replace(buffer, len, "{{IPPORT}}",              ipport);
  173.     replace(buffer, len, "{{PLAYERS_CURRENT}}",     playerscurrent);
  174.     replace(buffer, len, "{{MAXPLAYERS}}",          maxplayers);
  175.    
  176.     if(password)
  177.         replace(buffer, len, "{{PASSWORD_BOOL}}",   "Да");
  178.     else
  179.         replace(buffer, len, "{{PASSWORD_BOOL}}",   "Нет");
  180.    
  181.     replace(buffer, len, "{{TIMELIMIT}}",           timelimit);
  182.     replace(buffer, len, "{{ROUNDTIME}}",           roundtime);
  183.  
  184.     if(friendlyfire)
  185.         replace(buffer, len, "{{FRIENDLYFIRE_BOOL}}",   "Да");
  186.     else
  187.         replace(buffer, len, "{{FRIENDLYFIRE_BOOL}}",   "Нет");
  188.  
  189. }
  190.  
  191. public release_connection(connection){
  192.     socket_close(connection)
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement