Advertisement
Fedcomp

Untitled

Nov 27th, 2014
143
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.         ArrayPushString(html_reply, szBuffer)
  104.         content_size += strlen(szBuffer)
  105.     }
  106.    
  107.     server_print("%s content size: %i", PREFIX, content_size)
  108.    
  109.     new http_response[1024]
  110.        
  111.     format(http_response, charsmax(http_response),
  112.         "%s%s%s%s%i%s%s"                                ,
  113.         "HTTP/1.0 200 OK^r^n"                       ,
  114.         "Server: WAMod barely working server^r^n"   ,
  115.         //"Connection: keep-alive, close^r^n"                       ,
  116.         "Accept-Ranges: bytes^r^n"                  ,
  117.         "Content-Length: ", content_size, "^r^n"                ,
  118.         "Content-Type: text/html^r^n^r^n"          
  119.     )
  120.    
  121.     socket_send(connection, http_response, strlen(http_response))
  122.    
  123.    
  124.     for(new i=0; i < i_arr_size; i++){
  125.         new szBuffer[WAMOD_LINESIZE]
  126.         ArrayGetString(HTML_TEMPLATE, i, szBuffer, WAMOD_LINESIZE);
  127.         socket_send(connection, szBuffer, strlen(szBuffer))
  128.     }
  129.  
  130.    
  131.  
  132.     //socket_send(connection, http_response, strlen(http_response))
  133.     //send_formatted(connection)
  134.     //socket_send(connection, html_reply, strlen(html_reply))
  135.     set_task(0.5,"release_connection",connection)
  136.     ArrayClear( html_reply )
  137. }
  138.  
  139. public release_connection(connection){
  140.     socket_close(connection)
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement