Advertisement
BratokHR

Untitled

Mar 29th, 2016
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. // ^-ignore\\s+(.+)
  4. // ^-ignore\\s*$
  5.  
  6. cmatch reg_matches;
  7.  
  8. /**
  9.  * Массивы регулярок
  10.  * reg1 заменяется на reg2
  11.  */
  12. const char *reg1[] = { "\\?",  "\\/",  "\\*",  "\\-",  "\\+",  "\\\\", "\\.",  "\\^",  "\\)",  "\\(",  "\\}",  "\\{",  "\\]",  "\\[",  "\\$",  "\\%",  "\\@"  };
  13. const char *reg2[] = { "\\\?", "\\\/", "\\\*", "\\\-", "\\\+", "\\\\", "\\\.", "\\\^", "\\\)", "\\\(", "\\\}", "\\\{", "\\\]", "\\\[", "\\\$", "\\\%", "\\\@" };
  14.  
  15. /**
  16.  * Функция для проверки текста по регулярным вырожениям (не учитывая регистр)
  17.  */
  18. bool cChat::rgx(char *msg, char *reg)
  19. {
  20.     regex pattern(reg, regex_constants::icase);
  21.  
  22.     if (regex_match(msg, pattern)) {
  23.         if (regex_search(msg, reg_matches, pattern)) {
  24.             return true;
  25.         }
  26.     }
  27.  
  28.     return false;
  29. }
  30.  
  31. /**
  32.  * Функция удаляет из текста все цвета (дважды) и пробелы
  33.  */
  34. void cChat::clearColor(char *name)
  35. {
  36.     name = (char*)regex_replace(name, (regex)"\\^\\d", "").c_str();
  37.     name = (char*)regex_replace(name, (regex)"\\^\\d", "").c_str();
  38.     name = (char*)regex_replace(name, (regex)" ", "").c_str();
  39.  
  40.     name = (char*)regex_replace(name, (regex)reg1[0], reg2[0]).c_str();
  41.     for (int i = 1; i < 17; i++) { // 17 - кол-во регулярных вырожений в массиве
  42.         name = (char*)regex_replace(name, (regex)reg1[i], reg2[i]).c_str();
  43.     }
  44. }
  45.  
  46. /**
  47.  * Функция ищет игрока и возвращает его id
  48.  * Если совпадений нет, то возвращается -1
  49.  * Если совпадений больше 1, то возвращается 65
  50.  */
  51. int cChat::getId(char *name)
  52. {
  53.     int count = 0, // Кол-во совпадений
  54.         id = -1; // id игрока
  55.  
  56.     clearColor(name);
  57.  
  58.     for (int i = 0; i < 64; i++) { // 64 - макс. кол-во игроков
  59.         clientInfo_t *client = &ci[i];
  60.         char *name_client = client->name;
  61.  
  62.         if (strlen(name_client) == 0) { // Если слот пустой, то пропускаем его
  63.             continue;
  64.         }
  65.  
  66.         clearColor(name_client);
  67.         if (rgx(name_client, name)) {
  68.             id = client->clientNum;
  69.             count++;
  70.         }
  71.     }
  72.  
  73.     print::Saybold(name);
  74.  
  75.     if (count == 0) {
  76.         return -1;
  77.     }
  78.     else if (count == 1) {
  79.         return id;
  80.     }
  81.     else {
  82.         return 65;
  83.     }
  84. }
  85.  
  86. /**
  87.  * Функция обработки сообщений
  88.  */
  89. void cChat::Responses(char *name, char *msg)
  90. {
  91.     logging.Text(name, msg);
  92.  
  93.     // Если няня "занята", то ничего не делать
  94.     if (!getMsg) {
  95.         return;
  96.     }
  97.  
  98.     // -time
  99.     if (rgx(msg, "^-time\\s*$")) {
  100.         Thread(Time);
  101.     }
  102.  
  103.     // -id (search_string)
  104.     else if (rgx(msg, "^-id\\s+(.+)")) {
  105.         id((char*)reg_matches[0].str().c_str());
  106.     }
  107.     else if (rgx(msg, "^-id\\s*$")) {
  108.         id(name);
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement