Как использовать ReplyToCommand() внутри callback функции

iteelion

Участник
Сообщения
2
Реакции
1
Господа форумчане, подскажите начинающему, как использовать ReplyToCommand() внутри callback функции? До того как проваливаешься в callback, GetCmdReplySource() возвращает 1 или 0, в зависимости от того откуда пишешь (чат/консоль), но уже после того как провалился в него, всегда возвращает 0, откуда бы не писал команду.

Логика примерно такая:
C-подобный:
public void HttpResponseCallback(bool isRequestSuccess, const char[] requestError, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method) {
{
    ...
    ReplyToCommand(client, message); // Тут уже всегда пишет в консоль, а GetCmdReplySource() всегда = 0
    ...
}

public Action Command_Test(int client, int args)
{
    ...
    System2HTTPRequest httpRequest = new System2HTTPRequest(HttpResponseCallback, "https://some.addr/");
    httpRequest.POST();
    ...
    ReplyToCommand(client, message); // Тут ОК
    return Plugin_Handled;
}

Вопрос скорее теоретический, чем практический, можно ли вообще так делать и почему теряется "контекст" ReplySource.

На данный момент решаю проблему кастомной функцией и передачей значения из GetCmdReplySource() внутрь callback'a, но кажется, что это не по феншую.
C-подобный:
void ReplyToCommandEx(int client, char[] message, int replySrc)
{
    if(client > 0){
        if(replySrc == 1){
            PrintToChat(client, message);
        }else{
            PrintToConsole(client, message);
        }
    } else {
        PrintToServer(message);
    }
}

Буду благодарен любым ответам по существу, не пожалею виртуальных плюсиков в карму.
 
Решение
можно ли вообще так делать и почему теряется "контекст" ReplySource
1. Можно.
2. Ну вы ещё спросите, почему аргументы в каллбеке недоступны.
SM чистит своё состояние при переходе от контекста к контексту. Но Вам никто не мешает обратно установить нужное. Есть одноименная функция, SetCmdReplySource(). Главное обратно сбросить в 0 ее не забудьте.

WeSTMan

А вот тут текст!
Сообщения
833
Реакции
521
Попробуй код:
System2HTTPRequest Reuqest = new System2HTTPRequest(HttpResponseCallback, "site.ru");
Reuqest.Any = GetClientUserId(client);
Reuqest.GET();
delete Reuqest;

и в callback'е делаешь

void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method) {
    if(success) {
        int client = GetClientOfUserId(request.Any);
        if (!client) return;
        
        //Код пошел
    }
}
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #3
можно ли вообще так делать и почему теряется "контекст" ReplySource
1. Можно.
2. Ну вы ещё спросите, почему аргументы в каллбеке недоступны.
SM чистит своё состояние при переходе от контекста к контексту. Но Вам никто не мешает обратно установить нужное. Есть одноименная функция, SetCmdReplySource(). Главное обратно сбросить в 0 ее не забудьте.
 
Решение

iteelion

Участник
Сообщения
2
Реакции
1
Попробуй код:
System2HTTPRequest Reuqest = new System2HTTPRequest(HttpResponseCallback, "site.ru");
Reuqest.Any = GetClientUserId(client);
Reuqest.GET();
delete Reuqest;

и в callback'е делаешь

void HttpResponseCallback(bool success, const char[] error, System2HTTPRequest request, System2HTTPResponse response, HTTPRequestMethod method) {
    if(success) {
        int client = GetClientOfUserId(request.Any);
        if (!client) return;
     
        //Код пошел
    }
}
Вопрос немного не об этом, но все равно спасибо! Примерно так и делаю сейчас, вопрос в том, что я ReplySrc (момент с консолью и чатом клиента) руками обрабатываю и мне это не нравится.
1. Можно.
2. Ну вы ещё спросите, почему аргументы в каллбеке недоступны.
SM чистит своё состояние при переходе от контекста к контексту. Но Вам никто не мешает обратно установить нужное. Есть одноименная функция, SetCmdReplySource(). Главное обратно сбросить в 0 ее не забудьте.
Большое спасибо за пояснения! Первый код на sp после других языков, пока тяжко без понимания нюансов. Я вообще думал, что ReplySrc это глобальное значение, и устанавливается на время выполнения эвента (логично было предположить, что убегая в коллбек - все что касается эвента кончается, но я все же надеялся :D). SetCmdReplySource пробовал и даже сбрасывал его значение на то, которые было, но при следующем вызове команды оно уже не менялось (или надо именно в 0 сбрасывать, в доке вроде написано "верни как было" о_О?).

Пример как это было:
1) вызываю первый раз из чата, запоминаю значение, ставлю значение в коллбеке, вывожу в чат, ставлю значение на то которое было
2) вызываю второй раз из консоли, оно все равно пишет в чат
аналогично если перезапустить сервер, и в первый раз написать в консоль то далее будет писать только в консоль.

Правильно я понимаю, что при каждом новом входе в Action функцию, новое значение ReplySrc должно само выставляться? (в принципе это главное знание, чтоб нормально продебажить, без экспериментов в стиле "а как оно должно работать на самом деле", грузить конкретным кодом никого не хочу ^_^)
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #5
или надо именно в 0 сбрасывать, в доке вроде написано "верни как было" о_О?
Всё верно в доке, "верни как было". В нормальных ситуациях там как раз 0 будет, но труЪ - получить при сете, после восстановить.

Правильно я понимаю, что при каждом новом входе в Action функцию, новое значение ReplySrc должно само выставляться?
Если эта Action функция является обработчиком консольной команды - да.
 
Сверху Снизу