HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <colorchat>
  4.  
  5. #define PLUGIN "Block Advertising"
  6. #define VERSION "1.3"
  7. #define AUTHOR "Alka"
  8.  
  9. #define USE_COLORCHAT
  10.  
  11. #define MAX_WARNINGS 3
  12. #define MAX_LOGS 50
  13.  
  14. #define BYPASS_FLAG ADMIN_RCON
  15.  
  16. #define IsValidBlock(%0) (0 <= str_to_num(%0) <= 255)
  17.  
  18. enum (<<=1) {
  19.  
  20. ADV_BLOCK = 1,
  21. ADV_WARN,
  22. ADV_KICK,
  23. ADV_LOG,
  24. ADV_BYPASS
  25. };
  26.  
  27. enum {
  28.  
  29. ADDR_VALID = 1,
  30. ADDR_NOT_FOUND = -1
  31. };
  32.  
  33. new g_pCvarMode;
  34.  
  35. new Trie:g_tChars, Trie:g_tBlocks;
  36. new Array:g_aDomains, Array:g_aWhitelist;
  37.  
  38. new g_iWarnings[33];
  39.  
  40. new g_szLogsFile[64];
  41.  
  42. public plugin_init() {
  43.  
  44. register_plugin(PLUGIN, VERSION, AUTHOR);
  45.  
  46. register_clcmd("say", "clcmd_HandleChat");
  47. register_clcmd("say_team", "clcmd_HandleChat");
  48.  
  49. g_pCvarMode = register_cvar("amx_advblock", "abcde");
  50.  
  51. g_tChars = TrieCreate();
  52. g_tBlocks = TrieCreate();
  53.  
  54. g_aDomains = ArrayCreate(6);
  55. g_aWhitelist = ArrayCreate(32);
  56. }
  57.  
  58. public plugin_cfg()
  59. {
  60. get_basedir(g_szLogsFile, charsmax(g_szLogsFile));
  61. add(g_szLogsFile, charsmax(g_szLogsFile), "/logs/advblock_logs.log");
  62.  
  63. if(file_size(g_szLogsFile, 1) / 3 > MAX_LOGS)
  64. fclose(fopen(g_szLogsFile, "w"));
  65. else
  66. fclose(fopen(g_szLogsFile, "a"));
  67.  
  68. LoadConfigs();
  69. }
  70.  
  71. public plugin_end()
  72. {
  73. TrieDestroy(g_tChars);
  74. TrieDestroy(g_tBlocks);
  75. ArrayDestroy(g_aDomains);
  76. ArrayDestroy(g_aWhitelist);
  77. }
  78.  
  79. public client_disconnect(id)
  80. {
  81. if(g_iWarnings[id] > 0)
  82. g_iWarnings[id] = 0;
  83. }
  84.  
  85. public clcmd_HandleChat(id)
  86. {
  87. if((GetModFlags() & ADV_BYPASS) && get_user_flags(id) & BYPASS_FLAG)
  88. return PLUGIN_CONTINUE;
  89.  
  90. new szText[191];
  91. read_args(szText, charsmax(szText));
  92. remove_quotes(szText);
  93.  
  94. if(strlen(szText) < 4)
  95. return PLUGIN_CONTINUE;
  96.  
  97. TrieClear(g_tBlocks);
  98.  
  99. new szBlock[4], iLen;
  100. new iNumSeq, iNumBlocks, iDel;
  101. new iLastBlock;
  102. new bool:bDuplicate;
  103.  
  104. for(new i = 0 ; i < sizeof szText ; i++)
  105. {
  106. if(isdigit(szText[i]) && (i + 1 < sizeof szText))
  107. {
  108. iLen += formatex(szBlock[iLen], charsmax(szBlock) - iLen, "%c", szText[i]);
  109.  
  110. if(isdigit(szText[i + 1]))
  111. iNumSeq++;
  112. else
  113. {
  114. if(IsValidBlock(szBlock))
  115. {
  116. if(!TrieKeyExists(g_tBlocks, szBlock))
  117. {
  118. TrieSetCell(g_tBlocks, szBlock, 1);
  119.  
  120. new iTo = strlen(szBlock) == 3 ? i - 2 : (strlen(szBlock) == 2 ? i - 1 : i);
  121. if(FindDiffChars(szText, charsmax(szText), iLastBlock, iTo) < 8)
  122. iNumBlocks++;
  123.  
  124. iLastBlock = i;
  125. }
  126. else if(TrieKeyExists(g_tBlocks, szBlock) && !bDuplicate)
  127. {
  128. new iTo = strlen(szBlock) == 3 ? i - 2 : (strlen(szBlock) == 2 ? i - 1 : i);
  129. if(FindDiffChars(szText, charsmax(szText), iLastBlock, iTo) < 8)
  130. iNumBlocks++;
  131.  
  132. iLastBlock = i;
  133. bDuplicate = true;
  134. }
  135. }
  136. iLen = 0;
  137. }
  138. }
  139. else
  140. {
  141. if(szText[i] != 0)
  142. {
  143. iDel++;
  144. }
  145. }
  146. }
  147.  
  148. if((iNumSeq > 0 && iNumBlocks > 3) || (iNumBlocks > 3 && iDel > 5) || CheckAddr(szText, charsmax(szText)) != ADDR_NOT_FOUND)
  149. {
  150. new iFlags = GetModFlags();
  151.  
  152. if(iFlags & ADV_WARN)
  153. {
  154. if(iFlags & ADV_KICK)
  155. {
  156. g_iWarnings[id]++;
  157. #if !defined USE_COLORCHAT
  158. client_print(id, print_chat, "Figyelem!!! IP / Weboldal hirdetés! [%d/%d] - Kick", g_iWarnings[id], MAX_WARNINGS);
  159. #else
  160. client_print_color(id, RED, "^3Figyelem!!! ^4IP ^1/ ^4Weboldal ^1hirdetés! ^4[^3%d^1/^3%d^4] ^1- Kick", g_iWarnings[id], MAX_WARNINGS);
  161. #endif
  162.  
  163. if(g_iWarnings[id] == 3)
  164. {
  165. server_cmd("kick #%d ^"Hirdetes!^"", get_user_userid(id));
  166. g_iWarnings[id] = 0;
  167. }
  168. }
  169. else
  170. {
  171. #if !defined USE_COLORCHAT
  172. client_print(id, print_chat, "Figyelem!!! IP / Weboldal hirdetes!");
  173. #else
  174. client_print_color(id, RED, "^3Figyelem!!! ^4IP ^1/ ^4Weboldal ^1hirdetés!");
  175. #endif
  176. }
  177. }
  178. if(iFlags & ADV_LOG)
  179. {
  180. new szName[32];
  181. get_user_name(id, szName, charsmax(szName));
  182.  
  183. new iFile = fopen(g_szLogsFile, "a");
  184. fprintf(iFile, "Nev: %s ^nChat: %s^n---------------------------------------^n", szName, szText);
  185. fclose(iFile);
  186. }
  187. if(iFlags & ADV_BLOCK)
  188. return PLUGIN_HANDLED;
  189. else
  190. return PLUGIN_CONTINUE;
  191. }
  192. return PLUGIN_CONTINUE;
  193. }
  194.  
  195. stock FindDiffChars(szString[], iLen, iFrom, iTo)
  196. {
  197. TrieClear(g_tChars);
  198.  
  199. new iChars;
  200. for(new i = 0 ; i < iLen ; i++)
  201. {
  202. if(iFrom < i < iTo)
  203. {
  204. new szChar[2];
  205. formatex(szChar, charsmax(szChar), "%c", szString[i]);
  206.  
  207. if(!TrieKeyExists(g_tChars, szChar))
  208. {
  209. TrieSetCell(g_tChars, szChar, 1);
  210. iChars++;
  211. }
  212. }
  213. }
  214. return iChars;
  215. }
  216.  
  217. stock CheckAddr(szString[], iLen)
  218. {
  219. new szText[128], iLen2;
  220. new i;
  221. for(i = 0 ; i < iLen ; i++)
  222. {
  223. if(!isalpha(szString[i]) && !ValidAddrSeparator(szString[i]))
  224. continue;
  225.  
  226. iLen2 += formatex(szText[iLen2], charsmax(szText) - iLen2, "%c", szString[i]);
  227. }
  228.  
  229. new szTemp[6], szTemp1[32];
  230. for(i = 0 ; i < ArraySize(g_aWhitelist) ; i++)
  231. {
  232. ArrayGetString(g_aWhitelist, i, szTemp1, charsmax(szTemp1));
  233. if(containi(szText, szTemp1) != -1)
  234. {
  235. replace(szText, charsmax(szText), szTemp1, "");
  236. i--;
  237. }
  238. }
  239. for(i = 0 ; i < ArraySize(g_aDomains) ; i++)
  240. {
  241. ArrayGetString(g_aDomains, i, szTemp, charsmax(szTemp));
  242.  
  243. if(containi(szText, szTemp) > 0)
  244. return ADDR_VALID;
  245. }
  246. return ADDR_NOT_FOUND;
  247. }
  248.  
  249. stock bool:ValidAddrSeparator(iChar)
  250. {
  251. new iChars[] = { ':', '/', '.' };
  252. for(new i = 0 ; i < sizeof iChars ; i++)
  253. {
  254. if(iChar == iChars[i])
  255. return true;
  256. }
  257. return false;
  258. }
  259.  
  260. stock GetModFlags()
  261. {
  262. new szVal[6];
  263. get_pcvar_string(g_pCvarMode, szVal, charsmax(szVal));
  264.  
  265. return read_flags(szVal);
  266. }
  267.  
  268. stock LoadConfigs()
  269. {
  270. new szFile[64];
  271. get_configsdir(szFile, charsmax(szFile));
  272. add(szFile, charsmax(szFile), "/advblock_config.ini");
  273.  
  274. new iFile = fopen(szFile, "r");
  275. if(!iFile)
  276. set_fail_state("Nem sikerult a konfig fajl betoltese!");
  277.  
  278. new szBuffer[32];
  279. new iConfig;
  280. while(!feof(iFile))
  281. {
  282. fgets(iFile, szBuffer, charsmax(szBuffer));
  283. trim(szBuffer);
  284.  
  285. if(!szBuffer[0] || szBuffer[0] == ';')
  286. continue;
  287.  
  288. if(equal(szBuffer, "#domains"))
  289. {
  290. iConfig = 1;
  291. continue;
  292. }
  293. else if(equal(szBuffer, "#whitelist"))
  294. {
  295. iConfig = 2;
  296. continue;
  297. }
  298. else
  299. {
  300. if(szBuffer[0] != '{' || szBuffer[0] != '}')
  301. {
  302. switch(iConfig)
  303. {
  304. case 1: ArrayPushString(g_aDomains, szBuffer);
  305. case 2: ArrayPushString(g_aWhitelist, szBuffer);
  306. }
  307. }
  308. }
  309. }
  310. fclose(iFile);
  311. }
  312.