CS 1.6 TG monitoring bot PHP

CS 1.6 TG monitoring bot PHP 0.1.0

Нет прав для скачивания
Сообщения
438
Реакции
66
Помог
10 раз(а)
Код бота не смотрел, но обычно боты не зависят от тачек всяких, наверное есть какой нибудь config.php куда просто нужно прописать ip и порт. И если reunion отдает данные - то гуд должно быть
 
Сообщения
97
Реакции
9
yamusaka, Питону нужно обвязка. Нет возможности пока разбираться как это все работает. Почему написал про тачки. До того как я разнес сервере и веб. Все работало прекрасно. Вероятно мне нужно разрешить серверу который с сайтом без ограничений подключаться к серверу с кс.
Там куча правил от скана портов и прочего.
Проверю отпишусь =)
 
Сообщения
248
Реакции
73
Помог
2 раз(а)
shkrest, попробуйте пинг от вашего веб сервера до игрового. Если всё работало то проблема скорее всего в этом.
 
Сообщения
97
Реакции
9
yamusaka, Да это единственный вариант. Пока нет возможности проверить. Но я обязательно отпишу когда проверю это. Сервер блокирует пинги и прочую ересь.
 
Сообщения
97
Реакции
9
Разрешающее правило есть на порт 27015, бот стучится по этому порту?
14 Ноя 2024
Скрытое содержимое могут видеть только пользователь группы: Web Dev, Администратор, Модератор, Разработчик, Скриптер

Вот такое дает в логах nginx.
 
Сообщения
78
Реакции
21
Думаю было бы как раз кстати, увидеть в этом боте «из коробки» возможность для администратора сервера(-ов), добавлять свои заданные получаемые параметры в информацию об его же сервере. Примеры того, что я имею в виду:

Карта: bb_map /bb1
Игроки: 1 из 32 (0 ботов)
IP: "АЙПИ СЕРВЕРА"
Фаза: Постройка
Время до окончания фазы: 02:30
Карта: de_santorini /public1
Игроки: 8 из 32 (0 ботов)
IP: "АЙПИ СЕРВЕРА"
Время до конца карты: 19:38
Голосов за досрочную смену карты RTV: 4 / 6
Карта: zm_fdust2x2 /zm1
Игроки: 16 из 32 (8 ботов)
IP: "АЙПИ СЕРВЕРА"
Режим: Немезида
Здоровье Немезиды: 19820
Живых человек: 6/15
И ещё близко к тому, но всё-таки немного другое: Возможность задавать смайлик рядом с игроком в таблице игроков в контексте определённых переменных. Например, если это зомби сервер, то кто зомби, рядом с ним ставить смайлик зомбаря; если это паблик сервер, можно, например, рядом с VIP игроками (донатерами) ставить смайлик короны.

Думаю это уже что-то за гранью фантастики, но было бы прикольно также увидеть интеграцию с каким-нибудь популярным мапменеджером)). Например Map Manager [Modular] от Mistrick . Реализация в виде предоставления возможности активному подтверждённому игроку сервера номинировать карты прямиком при просмотре информации о сервере с учётом возможности абьюза(злоупотребления) номинации, и там же смотреть список уже номинированных карт. Это было бы доступно только при разрешении администратора самого КС сервера, а разрешение в виде генерации ключа в самом боте, а на стороне КС сервера уже бы дополнительный плагин для модульного менеджера карт подтверждал соединение с ботом через этот ключ, и заодно предоставлял обработку запроса номинации карты, который уже поступал бы от бота в Телеграмм.

Зараннее извиняюсь, если мои идеи являются слишком узконаправленными, и походят на что-то сродни того, что нужно писать в стол заказов))). Я просто поделился тем, что резко пришло в голову, и не успело вылететь). Сам бы попробовал подобное реализовать, коль не был бы я таким ленивым задом, и шарил за PHP 👍.
 
Сообщения
248
Реакции
73
Помог
2 раз(а)
@Levka4,тут уже без плагина не обойтись, в чем я не так силен :)
 
Сообщения
2
Реакции
2
yamusaka, ну можете вернуть эти функции, мол когда обновлена статистика сколько до конца карты и тд. Кому это не нужно они просто отключат их и кому нужно, добавят. Еще нашел ошибку, карта имеется, но вместо нее он показывает картинку no_imdge, если поспамить, то через раз он ее отображает. Заранее спасибо!
 
Последнее редактирование:
Сообщения
39
Реакции
8
couldn't open file не видит карту

а так же /info /start показывает общие сервера
если же получать информацию по каждому серверу. информация в чат не идет. в логах дебаг. информация идет. единственная ошибка что не видит карту

хотя они есть и права на папку есть.. и при вводе ссылки ручной путь до карты в браузере открывается фото карты

Команда /public2 найдена, отправляем информацию о сервере
Ответ Telegram API:
Ошибка cURL: <blockquote>


немного не понятно что он хочет curl нет? модуля у php?
 
Сообщения
134
Реакции
8
Помог
1 раз(а)
Было бы хорошо сделать сокращение ника когда он слишком длинный! А то с телефона переносится на новую строку!

Diff:
    $info = "\n\n<strong>Ник (Фраги)</strong>\n";
    foreach ($players as $index => $player) {
                                          
+    $name = mb_substr($player['Name'], 0, 22);
+    if (mb_strlen($player['Name']) > 22) {
+      $name .= '…';
+    }
                                          
        $info .= "👤 <code>{$name}</code> (<code>{$player['Frags']}</code>)\n";
    }
Diff:
-  $info .= ($index + 1) . ". 👤 <code>{$player['Name']}</code> (<code>{$player['Frags']}</code> | <code>{$player['TimeF']}</code>)\n";
+  $info .= ($index + 1) . ". 👤 <code>{$name}</code> (<code>{$player['Frags']}</code> | <code>{$player['TimeF']}</code>)\n";
 
Последнее редактирование:
Сообщения
97
Реакции
9
Здравствуйте. Обновил скрипт, только php. Привязал хук, в чат приходит шапка с инфой, но не раскрывает полный список. В дебаге есть ошибка
Ошибка cURL: вот такого типа. Внтури название сервера. Из за чего может быть,в дебаг файле показывает список игроков и время. А в чат не приходит. Куда копать?
 
Сообщения
248
Реакции
73
Помог
2 раз(а)
shkrest, вы уверены что вы правильно настроили "адрес сайта" и "папку с картами"?
 
Сообщения
97
Реакции
9
yamusaka, старый работал. Скопировал из старой версии ключи и все остальное. Обновил хук. Сообщение в тг приходит. Но когда хочу развернуть пусто. А в лог присылает. Картинки есть. Права тоже. Есть картинка no image. Если он не находит, должен же ее подставить?
 
Сообщения
248
Реакции
73
Помог
2 раз(а)
shkrest, ну как минимум я должен убедиться что вы правильно настроили и файл noimage существует в папке со скринами
 
Сообщения
97
Реакции
9
yamusaka,

<?php
require DIR . '/SourceQuery/bootstrap.php';
use xPaw\SourceQuery\SourceQuery;

const TOKEN = "************************************************";
const COMMANDS = ['/start', '/info'];
const URL = 'https://***************'; // ДОМЕН ПИШЕМ БЕЗ СЛЕША ("/") в конце
const DEFAULT_IMAGE = 'noimage.jpg'; // Когда не находит карту с названием maps/cs_mansion.jpg будет отправлять maps/no_image.png
const DEBUG = true; // Не забудьте отключить DEBUG после тестов! (true|false)

$servers = [
'/csdm' => '**************'
];

$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['message']['chat']['id'])) {
exit();
}

$chatId = $data['message']['chat']['id'];
$messageId = $data['message']['message_id'];
$text = $data['message']['text'] ?? '';

if (isset($data['message']['new_chat_members'])) {
welcomeUser($data['message']['from'], $chatId, $messageId);
exit();
}

if (!empty($text)) {
processMessage($text, $chatId, $messageId, $servers);
}

function debug($message) {
if(DEBUG) {
file_put_contents(DIR . '/debug.log', date("Y-m-d H:i:s") . " - " . $message . "\n", FILE_APPEND);
}
}

function welcomeUser($user, $chatId, $messageId) {
$name = "<a href='tg://user?id={$user['id']}'>{$user['first_name']}" . (!empty($user['last_name']) ? " {$user['last_name']}" : "") . "</a>";
sendTelegramMessage($chatId, "Добро пожаловать {$name}!", $messageId);
}

function processMessage($text, $chatId, $messageId, $servers) {
debug("Получено сообщение: $text");

foreach(COMMANDS as $command) {
if (mb_stripos($text, $command) !== false) {
debug("Команда {$command}, отправляем информацию о всех серверах.");
sendAllServersInfo($chatId, $messageId, $servers);
return;
}
}

foreach ($servers as $key => $server) {
if (mb_stripos($text, $key) !== false) {
debug("Команда $key найдена, отправляем информацию о сервере $server.");
sendServerInfo($key, $server, $chatId, $messageId);
exit();
}
}

debug("Команда не распознана: $text");
}

function sendAllServersInfo($chatId, $messageId, $servers) {
$info = "";
foreach ($servers as $key => $server) {
$info .= getServerStatus($server, $key, false) . "\n\n";
}
sendTelegramMessage($chatId, $info, $messageId);
}

function sendServerInfo($key, $server, $chatId, $messageId) {
$image = URL . '/maps/' . DEFAULT_IMAGE;
$info = getServerStatus($server, $key, true, $image);
sendTelegramPhoto($chatId, $info, $image, $messageId);
}

function getServerStatus($server, $key, $includePlayers = false, &$image = null) {
$cacheDir = DIR . "/cache";
$cacheFile = "$cacheDir/{$key}.json";
$cacheTime = 30;

if (!is_dir($cacheDir)) {
mkdir($cacheDir, 0777, true);
}

if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) {
$cachedData = json_decode(file_get_contents($cacheFile), true);
if (!$includePlayers) {
return $cachedData['info'];
}
return $cachedData['info'] . $cachedData['players'];
}

$query = new SourceQuery();
try {
$query->Connect(strstr($server, ':', true), str_replace(':', '', strstr($server, ':')), 1, SourceQuery::GOLDSOURCE);
$infos = $query->GetInfo();

$replace2x2Map = $infos['Map'];
if (substr($replace2x2Map, -4) === '_2x2') {
$replace2x2Map = substr($replace2x2Map, 0, -4);
}

$imagePath = DIR . '/maps/' . $replace2x2Map . '.jpg';
if (file_exists($imagePath)) {
$image = URL . '/maps/' . $replace2x2Map . '.jpg';
}

$info = "<blockquote>{$infos['HostName']}</blockquote>\nКарта: <code>{$infos['Map']}</code> {$key}\n" .
"Игроки: {$infos['Players']} из {$infos['MaxPlayers']} ({$infos['Bots']} ботов)\nIP: <code>{$server}</code>";

$players = getPlayersInfo($query->GetPlayers());

file_put_contents($cacheFile, json_encode([
'info' => $info,
'players' => $players
]));

return $includePlayers ? $info . $players : $info;
} catch (Exception $e) {
return "<blockquote>Ошибка</blockquote>\nКарта: Неизвестно {$key}\nИгроки: 0 из 0 (0 ботов)\nIP: $server";
} finally {
$query->Disconnect();
}
}

function getPlayersInfo($players) {
if (empty($players)) {
return "\n\n<strong>Игроков нет.</strong>";
}

$info = "\n\n<strong>Ник (Фраги | Время в игре)</strong>\n";
foreach ($players as $index => $player) {
$info .= ($index + 1) . ". 👤 <code>{$player['Name']}</code> (<code>{$player['Frags']}</code> | <code>{$player['TimeF']}</code>)\n";
}
return $info;
}

function sendTelegramMessage($chatId, $text, $replyToMessageId = null) {
$url = "https://api.telegram.org/bot" . TOKEN . "/sendMessage?" . http_build_query([
'chat_id' => $chatId,
'text' => $text,
'parse_mode' => "HTML",
'disable_web_page_preview' => true,
'reply_to_message_id' => $replyToMessageId
]);

debug("Отправка сообщения в Telegram: $url");

$response = file_get_contents($url);
debug("Ответ Telegram API: $response");
}

function sendTelegramPhoto($chatId, $caption, $image, $replyToMessageId = null) {
$url = "https://api.telegram.org/bot" . TOKEN . "/sendPhoto";
$postData = [
'chat_id' => $chatId,
'caption' => $caption,
'parse_mode' => "HTML",
'disable_web_page_preview' => true,
'reply_to_message_id' => $replyToMessageId,
'photo' => new CURLFile($image)
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

debug("Ответ Telegram API: " . $response);
if ($error) {
debug("Ошибка cURL: " . $caption . $error);
}
}
1743876365194.png
1743876465225.png
файлы на месте. Разрешения тоже. Что делаю не так?
В дебаг лог пишет
2025-04-05 21:12:29 - Получено сообщение: /start
2025-04-05 21:12:29 - Команда /start, отправляем информацию о всех серверах.
2025-04-05 21:12:29 - Отправка сообщения в Telegram: https://api.telegram.org/bot*******...************2%29%0AIP%3A+%3Ccode%3E********ип сервера*********%3A**********2Fcode%3*******A&parse_mode=HTML&disable_web_page_preview=1&reply_to_message_id=561
2025-04-05 21:12:29 - Ответ Telegram API: {"ok":true,"result":{"message_id":562,"from":{"id":************,"is_bot":true,"first_name":"**************","username":"**********"},"chat":{"id":************,"first_name":"\u0412\u0441\u0435\u0432\u043e\u043b\u043e\u0434","username":"**********","type":"private"},"date":1743876749,"reply_to_message":{"message_id":561,"from":{"id":**********,"is_bot":false,"first_name":"***********************","username":"************","language_code":"ru"},"chat":{"id":*************,"first_name":"***************************************","username":"**********","type":"private"},"date":1743876748,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]},"text":"Имя игрового сервера \n\******************: de_dust2011 /csdm\n*******************38: 14 \u0438\u0437 32 (12 \u0431\u043e\u0442\u043e\u0432)\nIP: *:27015","entities":[{"offset":0,"length":34,"type":"blockquote"},{"offset":42,"length":11,"type":"code"},{"offset":54,"length":5,"type":"bot_command"},{"offset":92,"length":19,"type":"code"}]}}
2025-04-05 21:12:32 - Получено сообщение: /csdm
2025-04-05 21:12:32 - Команда /csdm найдена, отправляем информацию о сервере *************:27015.
2025-04-05 21:12:32 - Ответ Telegram API:
2025-04-05 21:12:32 - Ошибка cURL: <blockquote>Название игрового сервера</blockquote>
Карта: <code>de_dust2011</code> /csdm
Игроки: 14 из 32 (2 ботов)
IP: <code>**********:27015</code>

<strong>Ник (Фраги | Время в игре)</strong>
1. 👤 <code>t.me/**********</code> (<code>0</code> | <code>16:12:12</code>)
2. 👤 <code>https://************</code> (<code>0</code> | <code>16:12:12</code>)
3. 👤 <code>**********</code> (<code>46</code> | <code>16:12:12</code>)
4. 👤 <code>**********</code> (<code>48</code> | <code>16:12:12</code>)
5. 👤 <code>**********</code> (<code>53</code> | <code>16:12:12</code>)
6. 👤 <code>**********</code> (<code>55</code> | <code>16:12:12</code>)
7. 👤 <code>**********</code> (<code>61</code> | <code>16:12:12</code>)
8. 👤 <code>**********</code> (<code>55</code> | <code>16:12:12</code>)
9. 👤 <code>**********</code> (<code>50</code> | <code>16:12:12</code>)
10. 👤 <code>**********</code> (<code>49</code> | <code>16:12:12</code>)
11. 👤 <code>**********</code> (<code>45</code> | <code>16:12:12</code>)
12. 👤 <code>**********</code> (<code>40</code> | <code>16:12:12</code>)
13. 👤 <code>**********</code> (<code>41</code> | <code>16:12:12</code>)
14. 👤 <code>**********</code> (<code>47</code> | <code>16:12:12</code>)
operation aborted by callback



1743876651243.png
Это сообщение присылает. А игроков нет. Я думаю если бы что-то не так настроил не присылало бы это сообщение?
5 Апр 2025
1743877563839.png
 

Download all Attachments

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу