P.S. Больше не могу на это смотреть. Если бы я разбирался хорошо в парсинге хекс данных, то и темы бы этой не было. Собственно данный форум и создан для того, чтоб люди могли получать конструктивную помощь на свои вопросы и желательно с примерами для ускорения процесса обучения. К сожалению самые продвинутые в этом плане люди тут, теперь используют данный форум не совсем по прямому назначению, осуществлять поддержку тех, кто только начинает постигать такие вещи, для них форум теперь что то вроде торговой площадки своих разработок и поделиться фрагментом кода, класса и т.п. для них одно и тоже, как и позволить залезть к себе в карман... жаль конечно, что DEV форум становится торговой площадкой. Насчет структуры я примерно понял, но пока плохо представляю практический пример такого такого рода, писать класс, это опять же нужно 100% понимать методы парсинга хекс данных, увы я пока в данном направлении вообще плохо продвинулся, единственное, что пока могу пытаться разобрать хекс методом тыка, как я это и делаю сейчас, хоть и понимаю, что с точки зрения тех, кто лучше понимает в этом деле, это по меньшей мере мазохизм, но... если нет конструктивных ответов, то и приходится, если мало информации на этот счет - страдать мазохизмом...
Именно. решил сделать как ты сказал, получил любопытный результат, однако на 144 все так же ломанный парсинг: 1.4.4 листинг: [IMG] 151 листинг: [IMG] ну и сам скрипт парсинга: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.4.4(60)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan4 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan5 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan6 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan7 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan8 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan9 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan10 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan11 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan12 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]+1; $clan14 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan15 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan16 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan17 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan18 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan19 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} | {$clan2[1]} | {$clan3[1]} | {$clan4[1]} | {$clan5[1]} | {$clan6[1]} | {$clan7[1]} | {$clan8[1]} | {$clan9[1]} | {$clan10[1]} | {$clan11[1]} | {$clan12[1]} | {$clan13[1]} | {$news} | {$clan14[1]} | {$clan15[1]} | {$clan16[1]} | {$clan17[1]} | {$clan18[1]} | {$clan19[1]}</font><hr>"; } echo $clan_list; ?> вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных. Как говорил alexdnepro, сначала нужно написать класс для удобной работы с пакетами, а потом уже разбирать пакеты или писать их по структуре. у алекса хорошее чувство юмора, что сделать класс такой, надо примерно понять мне как парсить данные. Иначе не представляю для себя эту возню с написанием класса. --- добавлено: 15 фев 2015 в 17:57 --- Эм, vieraw же писал. Данный пакет представляет из себя: opcode - cuint длина - cuint max - int retcode - int handle - octets информация о кланах - vector Плюс ко всему, очень непонятно: ты читаешь 4 байта, а смещаешь на 1. $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; хочешь сказать, смещать не нужно вообще?
Действительно, почему ты пропускаешь? На стороне сервера используется маршалинг, а не тупо запись байт, взятых с потолка, в поток. Там может лежать, что угодно. Нельзя так просто сидеть и гадать. предлагаешь не пропускать, а пытаться раскодировать байты, которые встречаются на пути цикла? Именно. решил сделать как ты сказал, получил любопытный результат, однако на 144 все так же ломанный парсинг: 1.4.4 листинг: [IMG] 151 листинг: [IMG] ну и сам скрипт парсинга: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.4.4(60)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan4 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan5 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan6 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan7 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan8 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan9 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan10 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan11 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan12 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan13 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]+1; $clan14 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan15 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan16 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan17 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan18 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan19 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} | {$clan2[1]} | {$clan3[1]} | {$clan4[1]} | {$clan5[1]} | {$clan6[1]} | {$clan7[1]} | {$clan8[1]} | {$clan9[1]} | {$clan10[1]} | {$clan11[1]} | {$clan12[1]} | {$clan13[1]} | {$news} | {$clan14[1]} | {$clan15[1]} | {$clan16[1]} | {$clan17[1]} | {$clan18[1]} | {$clan19[1]}</font><hr>"; } echo $clan_list; ?> вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных.
Действительно, почему ты пропускаешь? На стороне сервера используется маршалинг, а не тупо запись байт, взятых с потолка, в поток. Там может лежать, что угодно. Нельзя так просто сидеть и гадать. предлагаешь не пропускать, а пытаться раскодировать байты, которые встречаются на пути цикла?
Хочешь сказать, что в целом при обработке хекса с 1.5.1 у меня ошибок нет, просто в 1.4.4 придется немного изменить перемещение по байтам. Разная структура пакетов 144 и 151? Я не смотрел код, так как не шарю в php, но по результату парсинга видно, что первый клан читается нормально, а остальные - нет. Это означает, что длина описания одного клана разная, поэтому начиная со второго клана идёт сдвиг, который и ломает всё. Можно наугад менять кол-во "пропускаемых ненужных байт", скорее всего получится Но это только мои предположения но странно, что в 151 без проблем парсится, хоть и ожидалось, что структура пакетов в 151 может быть более мудренная,чем в 144. Все же интересно увидеть конструктивный ответ, который поможет понять как же решить проблему?
Разные структуры пакетов Хочешь сказать, что в целом при обработке хекса с 1.5.1 у меня ошибок нет, просто в 1.4.4 придется немного изменить перемещение по байтам. Разная структура пакетов 144 и 151?
пробую понять, как работать с хекс данными игровой базы на примере списка кланов... Имею две машины, на одной сборка 1.4.4 на второй 1.5.1, скрипт в котором пытаюсь разбирать данные один и тот же: <? function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } $bdname = 'factioninfo'; $bdlen = pack("n*", strlen($bdname)+32768); $data = pack('N', -1) . $bdlen . $bdname . "\x00\x00\x00\x00"; $Socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $Data = cuint(3055).cuint(strlen($data)).$data; if(socket_connect($Socket,"127.0.0.1","29400")) { socket_set_block($Socket); $send = socket_send($Socket,$Data,8192,0); $recv = socket_recv($Socket,$buf,8192,0); socket_set_nonblock($Socket); socket_close($Socket); } echo "Версия сервера 1.5.1(101)<br><br>"; $var = "Запрос: ".bin2hex($Data)."<br>-<br>"; $var2 = "Ответ: ".bin2hex($buf)."<br>-<br>"; echo $var.$var2."<hr>"; echo "Попытка разобрать пакет с ответом: <hr>"; $strlarge = unpack( "H", substr( $buf, 2, 1 ) ); if(substr($strlarge[1], 0, 1) == "8") { $start = 13; } else { $start = 12; } $clancount = unpack( "c", substr( $buf, $start, 1 ) ); $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) for($c=0; $i<$clancount[1]; $i++) { $clanid = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+4; $namelarge = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $clanname = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge[1] ) ); $start = $start+$namelarge[1]; $clan2 = unpack( "C*", substr( $buf, $start, 4 ) ); $start = $start+1; $clan3 = unpack( "N*", substr( $buf, $start, 4 ) ); $start = $start+11; //точка отсчета и пропускаем 11 байтов (пока не понял для чего они) $namelarge2 = unpack( "c*", substr( $buf, $start, 4 ) ); $start = $start+1; $news = iconv( "UTF-16", "UTF-8", substr( $buf, $start, $namelarge2[1] ) ); $start = $start+$namelarge2[1]; $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) $clan_list .="<font color='red'>[ {$clanid[1]} ] {$clanname} {$clan2[1]} {$clan3[1]} {$news}</font><hr>"; } echo $clan_list; ?> в общем, испытав его на 1.5.1, немного обрадовался, так как получил листинг кланов: [IMG] но, разочаровался, когда запустил его на 1.4.4: [IMG] Как видно, только первую запись скрипт декодировал нормально, остальные записи увы нет... И ещё для информации, на обоих серверах по 6 кланов, однако на 1.5.1 было 2 клана, я довел их количество до 6, после создания каждого клана проверял листинг в скрипте, он показывал корректно 3, 4, 5 и 6 кланов. До этого я полагал, что причина ошибки в 1.4.4 из за того, что там 6 кланов и дело в длине пакета, оказалось, что видимо это не так, ведь на 1.5.1 сейчас тоже 6 кланов и они отображаются в скрипте нормально. Так что я порядком уже запутался, в чем же дело?
От себя добавлю что все-таки не стоит давать права 777. Нужно понимать, что это будет адская дыра в безопасности. сервер тестовый локальный, потому ничего страшного нет в безопасности. либо через <?php echo passthru("id"); [IMG] и что из этого?
А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал А ты после того как начал гонять эту команду через пхп проверял потом в консоли? После 3-5 выводов база частенько "запирается" и перестает выдавать ответ на подобные запросы. Ну или попробуй вариант через екзек exec("cd /home/gamedbd && ./gamedbd gamesys.conf listfaction", $arr); Если бы вы читали все мои посты, то наверняка бы увидели бы, что я уже писал, что в консоли проверял и все работает, только в браузере не пашет и выдает ошибку 134. --- добавлено: 15 фев 2015 в 07:14 --- А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction как всегда, в консоли прекрасно пашет, из скрипта в браузере ошибка 134... хз что за ошибка...chmod 777 -R /home/gamedbd/ смеёшся? )) вся папка с её содержимым давно уже имеет 777 )
На форуме есть бан чата по логам, там можно задавать метод по которому будет баниться чат, вот от wsok как раз. Найдешь. А бад слова добавишь 1010100 или какие там повторяются. ну мой скрипт не будет 100% решением, он парсит то, что уже есть в логах чата, т.е. то что уже отправили, а как писал ТС, там за секунду десятки раз флуд, пока мой скрипт сработает, клиент уже может отвалится. Мой скрипт скорее создан, чтоб немного упростить работу ГМам, которые следят за порядком в игре. По проблеме ТСа нужно более конструктивное решение, например пакетный автобан с возможностью указать какой чат канал нужно мониторить и при этом, он чтоб работал в режиме проксирования чат трафика от игрового клиента. Ну или фиксить бинарные файлы сервера, отвечающие за чат, чтоб интервальная защита от флуда была не только в мировом чате, но и в других.
А ты после того как начал гонять эту команду через пхп проверял потом в консоли? После 3-5 выводов база частенько "запирается" и перестает выдавать ответ на подобные запросы. Ну или попробуй вариант через екзек exec("cd /home/gamedbd && ./gamedbd gamesys.conf listfaction", $arr); Если бы вы читали все мои посты, то наверняка бы увидели бы, что я уже писал, что в консоли проверял и все работает, только в браузере не пашет и выдает ошибку 134. --- добавлено: 15 фев 2015 в 07:14 --- А если так? echo passthru("/pwserver/gamedbd/ /pwserver/gamedbd/gamesys.conf listfaction"); запрос у тебя немного неверный, сам то проверял? Но суть не в этом, а в другом, перечитай все мои посты и увидишь, что я уже и подобный запрос юзал /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction как всегда, в консоли прекрасно пашет, из скрипта в браузере ошибка 134... хз что за ошибка...
попробовал получить код ошибки: passthru("/pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction",$error); выдал код ошибки 134, погуглил, гугл вообще ничего не знает о данном коде ошибки... (:| --- добавлено: 14 фев 2015 в 20:29 --- если спецом делаю неверные пути в команде, то получаю код 127, так что это доказывает, что пути все же (до намеренного изменения) указаны верно
да ну, ты считаешь, что я вчера родился и сразу в пв пошел? Ну на всякий случай я проверил (хоть и знал, что пути там верные) http://joxi.ru/L21LJlOcR1R1mX так что ребус все ещё не решен) И меня не интересует кто использует этот способ и кто нет, мне нужен сам факт, почему функция тупит? Где косяк? Я не знаю что за магию ты практикуешь, но у меня все отлично работает. [IMG] [IMG] <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php ob_start(); passthru("/.../gamedbd/gamedbd /.../gamedbd/gamesys.conf listrolebrief"); $a1 = ob_get_clean(); echo "<pre>".$a1."</pre>"; ?> Вот мне и самому интересно, что же это за магия такая на моем сервере, которая мешает данной функции делать то, что раньше кстати работало... --- добавлено: 14 фев 2015 в 19:20 --- но в чудеса и мистику я не верю, поэтому должно быть логическое объяснение, почему в консоли та же команда выводит данные из игровой базы, а когда выполняю скрипт в браузере с той же командой, данные не получаю... забавно да? --- добавлено: 14 фев 2015 в 19:48 --- проверил ещё на 3 виртуалках, и о чудо, на одной из них скрипт вывел в браузер данные... на остальных машинах видимо и впрямь проклятие лежит )) --- добавлено: 14 фев 2015 в 19:49 --- в общем ребус не решен, пока непонятно что мешает ему?
Настрой пути в gamedbd -> gamesys.conf эх, неужели, если пути были бы неверные, в консоли бы вывело список? Более того скажу, проверил вызов скрипта пхп из консоли php /var/www/hn.wsok.net/html/l.php Список вывело там, вывод? с путями все нормально, а раз так, то почему выполнение в браузере так тупит? Настрой файл gamesys.conf, пропиши полный путь до базы (в самом конф. файле) [storage] homedir = /pw/db/gamedbd/dbhome datadir = /pw/db/gamedbd/dbdata logdir = /pw/db/gamedbd/dblogs backupdir = /pw/db/gamedbd/dbbackup ... [storagewdb] homedir = /pw/db/gamedbd/dbhomewdb datadir = /pw/db/gamedbd/dbdata logdir = /pw/db/gamedbd/dblogs backupdir = /pw/db/gamedbd/dbbackup Просто уже никто не пользуется варварскими методами, наверное. ти чта эта нексхен от батча да ну, ты считаешь, что я вчера родился и сразу в пв пошел? Ну на всякий случай я проверил (хоть и знал, что пути там верные) http://joxi.ru/L21LJlOcR1R1mX так что ребус все ещё не решен) И меня не интересует кто использует этот способ и кто нет, мне нужен сам факт, почему функция тупит? Где косяк?
Дампнуть её не пробовал, вместо echo? да, получаю NULL Хз, проверь настройки врапера пхп. что то сомневаюсь, ведь выводит все в браузер, кроме выполнения этого: /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction Эх, смотрю этот ребус никто не поможет решить...
Дампнуть её не пробовал, вместо echo? да, получаю NULL
Настрой пути в gamedbd -> gamesys.conf эх, неужели, если пути были бы неверные, в консоли бы вывело список? Более того скажу, проверил вызов скрипта пхп из консоли php /var/www/hn.wsok.net/html/l.php Список вывело там, вывод? с путями все нормально, а раз так, то почему выполнение в браузере так тупит?
Памятуя старую темку от Ботчала - решил немного поиграть с пхп функцией passthru. В качестве команды использую: /pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction Когда выполнил в консоли сервера, то как и ожидалось получил список, чтож, хорошо, значит все норм, ошибок нет, решил её выполнить в пхп: echo passthru("/pwserver/gamedbd/gamedbd /pwserver/gamedbd/gamesys.conf listfaction"); И обломался, списка не увидел.. Вообще ничего не увидел, кроме белой страницы в браузере. Включил вывод ошибок пхп, все равно белая страница... Выставил на файлы, что вызываются командой и сам пхп файл права 777 и на папки тоже... Все равно белая страница... Подумал, может команда тупит? Решил проверить... echo passthru("ls"); браузер сразу вывел содержимое папки, значит все же ошибок нет? Тогда где же собака порылась? Помогите решить ребус. =)
скриптов, по крайней мере для шары очень мало, да и для таких задач обычно пишутся на заказ.
wsok, Там бан только за мировой чат, у меня флудят в белый. Еще вопрос. Есть ли способы, или скрипты, что бы быстро узнать айпишник игрока? Через консоль получается, но это пока онлайн маленький утром. ну не знал, что там нет возможности указать модерируемый чат канал... могу лишь подсказать радикальное решение, забанить аккаунты игровые с которых идет спам и временно отключить регу, и как вариант составить расписание когда регистрация на сервер возможна и проверять вновь зарегенные аки, обычно спамер регистрирует логины, которые не имеют смысловой нагрузки и мыло, которое так же явно не создавалось как постоянное. В общем ввести строгий режим на регу акков, хотя бы временно.
Имена участников (разделяйте запятой).