SourcePawn [SourcePawn] Урок 14 - Работа с куками (clientprefs)

Pushistik↯❤

Команда форума
Регистрация
6 Июл 2017
Сообщения
393
Реакции
97
Баллы
28
[SourcePawn] Урок 14 - Работа с куками (clientprefs)
<= К содержанию
Куки (Cookie) - инструмент позволяющих хранить некоторую информацию об игроках на сервере.
Внутренняя реализация куков в SourceMod реализована в виде SQLite базы. Но API не предоставляет к ней доступ.

API по кукам здесь clientprefs · SourceMod Scripting API Reference

Уровни доступа к кукам:
  • CookieAccess_Public - Видимые для пользователей и разрешены для изменения.
  • CookieAccess_Protected - Видимые для пользователей но запрещены для изменения.
  • CookieAccess_Private - Не видимые для пользователей.

Функции для работы с куками
  • RegClientCookie - Создает новые куки.
    PHP:
    Handle RegClientCookie(const char[] name, const char[] description, CookieAccess access)
    • char[] name - Уникальное имя куков.
    • char[] description - Описание.
    • CookieAccess access - Уровень доступа.
      PHP:
      Handle g_hCookie;
      public void OnPluginStart()
      {
          g_hCookie = RegClientCookie("Lesson", "cookies for a lesson", CookieAccess_Public);
      }
  • FindClientCookie - Ищет куки если они уже были созданы.
    PHP:
    Handle FindClientCookie(const char[] name)
    • char[] name - Уникальное имя куков.
    • char[] description - Описание.
    • CookieAccess access - Уровень доступа.
      PHP:
      Handle hCookie = FindClientCookie("Lesson");
      if(hCookie != null)
      {
          // Куки найдены
      }
  • AreClientCookiesCached - Возвращает загружены ли куки игрока.
    PHP:
    bool AreClientCookiesCached(int client)
    • int client - Индекс игрока.
    PHP:
    if(AreClientCookiesCached(iClient))
    {
        // Куки игрока загружены и с ними можно работать
    }
  • GetClientCookie - Получает куки игрока.
    PHP:
    void GetClientCookie(int client, Handle cookie, char[] buffer, int maxlen)
    • int client - Индекс игрока.
    • Handle cookie - Handle куков.
    • char[] buffer - Буфер, для получения куков.
    • int maxlen - Размер буфера.
    PHP:
    char szCookie[64];
    GetClientCookie(iClient, g_hCookie, szCookie, sizeof(szCookie));
  • GetClientCookieTime - Получает время последнего обновления куков игрока (unix).
    PHP:
    int GetClientCookieTime(int client, Handle cookie)
    • int client - Индекс игрока.
    • Handle cookie - Handle куков.
      PHP:
      int iLastCookieUpdate = GetClientCookieTime(iClient, g_hCookie);
  • SetClientCookie - Устанавливает значение куков для игрока.
    PHP:
    void SetClientCookie(int client, Handle cookie, const char[] value)
    • int client - Индекс игрока.
    • Handle cookie - Handle куков.
    • char[] value - Значение.
      PHP:
      SetClientCookie(iClient, g_hCookie, "342");
  • SetAuthIdCookie - Устанавливает значение куков для игрока по SteamID.
    PHP:
    void SetAuthIdCookie(const char[] authID, Handle cookie, const char[] value)
    • char[] authID - SteamID игрока.
    • Handle cookie - Handle куков.
    • char[] value - Значение.
      PHP:
      SetAuthIdCookie("STEAM_0:0:12345678", g_hCookie, "342");
  • ShowCookieMenu - Открывает игроку меню !settings.
    PHP:
    void ShowCookieMenu(int client)
    • int client - Индекс игрока.
      PHP:
      ShowCookieMenu(iClient);
  • GetCookieAccess - Получает уровень доступа куков.
    PHP:
    CookieAccess GetCookieAccess(Handle cookie);
    • Handle cookie - Handle куков.
      PHP:
      CookieAccess iAccess = GetCookieAccess(g_hCookie);
  • SetCookieMenuItem - Добавляет пункт в меню !settings.
    PHP:
    void SetCookieMenuItem(CookieMenuHandler handler, any info, const char[] display);
    • CookieMenuHandler handler - Обратный вызов.
    • any info - Данные для передачи в обратный вызов.
    • char[] display - Текс пункта.
      PHP:
      SetCookieMenuItem(LessonPrefSelected, 0, "Lesson item");
      
      public void LessonPrefSelected(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
      {
          // Обратный вызов
          switch (action)
          {
          case CookieMenuAction_DisplayOption:    // Вызывается когда пункт отображается в меню
              {
                  SetGlobalTransTarget(iClient);
                  FormatEx(buffer, maxlen, "%t", "CookieMenu_Lesson"); // Отправим фразу из перевода
              }
          case CookieMenuAction_SelectOption:    // Вызывается когда игрок выбирает этот пункт
              {
                  // Отправляем ему меню настройки
                  DisplayLessonMenu(iClient);    // Ф-я придуманная и не реализована
              }
          }
      }
  • SetCookiePrefabMenu - Добавляет пункт в меню !settings, работа которого автоматическая и не требует обратного вызова.
    PHP:
    void SetCookiePrefabMenu(Handle cookie, CookieMenu type, const char[] display, CookieMenuHandler handler=INVALID_FUNCTION, any info=0);
    • Handle cookie - Handle куков.
    • CookieMenu type - Тип:
      • CookieMenu_YesNo - Да/Нет в меню и "yes"/"no" в результатах (Сохраняется в куки)
      • CookieMenu_YesNo_Int - Да/Нет в меню и 1/0 в результатах (Сохраняется в куки)
      • CookieMenu_OnOff - Вкл/Выкл в меню и "on"/"off" в результатах (Сохраняется в куки)
      • CookieMenu_OnOff_Int - Вкл/Выкл в меню и 1/0 в результатах (Сохраняется в куки)
    • char[] display - Текст пункта.
    • CookieMenuHandler handler - Обратный вызов. По умолчанию = INVALID_FUNCTION
    • any info - Данные для передачи в обратный вызов. По умолчанию = 0
    PHP:
    SetCookiePrefabMenu(g_hCookie, CookieMenu_OnOff_Int, "Уроки", LessonPrefSelected);
    
    // Или если хотим отслеживать изменение:
    public void LessonPrefSelected(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
    {
        // Обратный вызов
        if (action == CookieMenuAction_SelectOption)
        {
            // Статус изменился
        }
    }
  • GetCookieIterator - Получает Handle итератора куков.
    PHP:
    Handle GetCookieIterator();
  • ReadCookieIterator - Получает информацию о куках с итератора.
    PHP:
    bool ReadCookieIterator(Handle iter, char[] name, int nameLen, CookieAccess &access, char[] desc="", int descLen=0);
    • Handle iter - Handle итератора.
    • char[] name - Буфер, для получения уникального имени куков.
    • int nameLen - Размер буфера.
    • CookieAccess &access - Буфер, для получения уровня доступа куков.
    • char[] desc - Буфер, для получения описания куков. По умолчанию = ""
    • int descLen - Размер буфера. По умолчанию = 0
    PHP:
    Handle hIter = GetCookieIterator();
    
    char szCookieName[32], szCookieDesc[255];
    CookieAccess iAccess;
    
    while (ReadCookieIterator(hIter, szCookieName, sizeof(szCookieName), iAccess, szCookieDesc, sizeof(szCookieDesc)) != false)
    {
        PrintToServer("Cookie '%s' (%s), Access = %i", szCookieName, szCookieDesc, iAccess);
    }
    
    delete hIter;
  • OnClientCookiesCached - Событие, которое вызывается когда куки игрока были загружены.
    PHP:
    void OnClientCookiesCached(int client);
    • int client - Индекс игрока.
PHP:
#pragma semicolon 1

#include <sourcemod>
#include <clientprefs>

#pragma newdecls required

Handle g_hCookie;

bool g_bSettings[MAXPLAYERS+1];

public void OnPluginStart()
{
    g_hCookie = RegClientCookie("TestCookie", "Урок работы с куками", CookieAccess_Private);
    SetCookiePrefabMenu(g_hCookie, CookieMenu_OnOff_Int, "TestCookie", TestCookieHandler);
}

public void TestCookieHandler(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
{
    if (action == CookieMenuAction_SelectOption)
    {
        OnClientCookiesCached(iClient);
    }
}

public void OnClientCookiesCached(int iClient)
{
    char szValue[4];
    GetClientCookie(iClient, g_hCookie, szValue, sizeof(szValue));
    if(szValue[0]) // Если в куках что-то записано
    {
        // Получаем это
        g_bSettings[iClient] = view_as<bool>(StringToInt(szValue));
    }
    else // Иначе
    {
        // По умолчанию сделаем опцию включенной
        g_bSettings[iClient] = true;
    }
}

<= К содержанию
 
Последнее редактирование:
Сверху Снизу