PDA

Просмотр полной версии : [Мануал] Проверка обновлений через HTTP



Nexius_Tailer
12.12.2016, 16:37
Примечание: По состоянию на 2023 год pastebin полностью перешёл на https и отдаёт любые ответы на нём, что SA-MP сервером, увы, не поддерживается (он из коробки поддерживает лишь голый http). Есть реализация https в стороннем плагине pawn-requests, но смысл описываемой в статье концепции крохотной системы, которая до этого не требовала ничего лишнего, практически полностью теряется, если появляется нужда тянуть за ней какие-то доп. плагины. Тем не менее, на open.mp сервере всё нижеописанное работает без каких-то изменений, поскольку он поддерживает https из коробки.

Привет, сегодня пришла в голову идея, каким образом сделать проверку обновлений почти любого скрипта.
В этом мануале мы будем делать проверку обновлений на примере сервера. Т.е. при запуске будет проверять, последняя ли у нас версия сервера, и если нет, то уведомлять об этом в консоль.

И т.к. на оф. сайте (sa-mp.com) я не нашёл отдельной страницы, где бы выводилась лишь текущая версия сервера/клиента, мне пришлось зарегать аккаунт на pastebin и уже на него заливать текст с версией (и при каждой новой версии мне придётся его обновлять).
Всё это потому, что если считывать сервером, например, официальную страницу сампа целиком (а на ней последняя версия указана) - то размеры информации, присланной сайтом, повесят стек :(
Собственно, и с пастебином было бы скорее всего тоже самое, если бы не трюк с режимом просмотра (где сайт отсылает только сам загруженный вами текст).

Реализация:

1. Ко всем forward

forward OnVersionChecked(index, response_code, data[]);

2. В OnGameModeInit():

HTTP(1000, HTTP_GET, "pastebin.com/raw/7wmiJKnG", "", "OnVersionChecked");

3. Ну и в любую часть скрипта:

public OnVersionChecked(index, response_code, data[])
{
//Всё прошло успешно
if(response_code == 200)
{
new ver[16];
GetServerVarAsString("version", ver, sizeof ver);
if(strcmp(data, ver)) printf("[Обновление] Доступна новая версия сервера: %s", data);
else print("[Обновление] Вы используете последнюю версию сервера");
}
//Иначе
else print("[Ошибка] Не удалось проверить обновления сервера!");
}

Отлично, теперь при запуске сервера ниже версии 0.3.7-R2 в консоль будет писать следующее:

"[Обновление] Доступна новая версия сервера: 0.3.7-R2"

P.s. Забыл сказать, что для работоспособности кода выше нужно подключить "a_http.inc" (стандартный инклуд) таким образом:

#include <a_samp> //Ваш a_samp
#include <a_http>

Надеюсь, было для кого-то полезно.

vovandolg
12.12.2016, 18:29
Что то не совсем понятно как оно работает:pardon:

DeimoS
12.12.2016, 18:38
Что то не совсем понятно как оно работает:pardon:

На этом (pastebin.com/raw/7wmiJKnG) pastebin хранится версия SA-MP в виде текста. Туда отправляется запрос, который извлекает эту версию.
pastebin этот зареган на автора темы и он обновит этот pastebin в случае, если выйдет новая версия SA-MP.

Nexius_Tailer
12.12.2016, 18:44
Что то не совсем понятно как оно работает:pardon:
Да всё довольно просто: регая аккаунт на пастебине можно создавать тексты с постоянной ссылкой, изменяя их в будущем без ограничений только со своего акка (но это скорее для тех, у кого личного сайта нет).
Далее создаётся текст, куда пишется только текущая версия нужного скрипта. В нужном скрипте мы дефайним его текущую версию, затем подключаем http и отправляем запрос на наш текст на пастебине (только если текст находится, к примеру, по ссылке "pastebin.com/7wmiJKnG", то нам нужно переделать её в "pastebin.com/raw/7wmiJKnG", чтобы в ответ на запрос приходил только сам текст версии и ничего больше). Далее просто тупо сверяем пришедшую строку с сайта со своей версией: не совпадают - выводим инфу о существовании более новой версии.
В свою очередь при обновлении скрипта нужно будет каждый раз изменять наш текст на пастебине, тем самым уведомление о новой версии появится при использовании старых.

Это вкратце смысл мануала.

vovandolg
12.12.2016, 18:45
Хорошо, плывем дальше, шо за index в аргументах каллбека?)

Nexius_Tailer
12.12.2016, 18:50
Хорошо, плывем дальше, шо за index в аргументах каллбека?)
С ним обязательно должен быть паблик, куда приходит ответ от сайтов (https://wiki.sa-mp.com/wiki/HTTP)
Это своего рода ид запроса, если вдруг нужно слать много запросов с ответом в паблик с одним и тем же названием

ziggi
12.12.2016, 22:21
Для GitHub пришлось создать небольшой скрипт, который позволяет узнать информацию о последнем релизе:


<?php

$owner = $_GET['owner'];
$repo = $_GET['repo'];
$elem = $_GET['elem'];

foreach (array($owner, $repo, $elem) as $param) {
if (!preg_match('/^[a-z0-9_-]+$/i', $param)) {
exit("Bad param.");
}
}

if (!$owner || !$repo || !$elem) {
exit();
}

$ch = curl_init("https://api.github.com/repos/$owner/$repo/releases/latest");

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

if ($result !== FALSE) {
$arr = json_decode($result);
echo $arr->$elem;
}

Из плюсов - не нужно вручную где-то менять версию скрипта. Пример использования здесь (https://github.com/ziggi/rustext/blob/master/include/rustext.inc#L90-L112).

_lizard
13.12.2016, 00:17
Хороший скрипт, жалко конечно, что никогда не понадобится, ибо частота выхода новых версий стремится к нулю.

Nexius_Tailer
13.12.2016, 00:38
Хороший скрипт, жалко конечно, что никогда не понадобится, ибо частота выхода новых версий стремится к нулю.
Так прелесть в том, что это можно использовать и для своих собственных скриптов тоже

KrutoyKrosch
13.12.2016, 01:51
Новости сервера замутить можно с сайта, поменяв пару значений

Disinterpreter
13.12.2016, 13:00
public OnVersionChecked(index, response_code, data[])
{
//Всё прошло успешно
if(response_code == 200)
{
....




Я конечно не эксперт, но разве не может оно вернуть 301 302 коды ответа (если урл будет другой, особенно если сайт HTTPS-only)?

Nexius_Tailer
13.12.2016, 20:27
Я конечно не эксперт, но разве не может оно вернуть 301 302 коды ответа (если урл будет другой, особенно если сайт HTTPS-only)?
Я тоже не эксперт)
Но в руководстве был один единственный 200 код, плюс на пастебине это работает хорошо и ничего иного не возвращает.