Бот спамит ; Бот не может писать в беседу. VkNet, C#

110
27 декабря 2021, 22:40

У меня возникло несколько вопросов по созданию ВК бота на C# с помощью библиотеки VkNet.

  1. Спам: Когда я отправляю своему боту сообщение, он отправляет в ответ своё, и всё бы хорошо, да только он начинает им спамить. Я пытался подставлять всякие условия, по типу "Если последнее сообщение отослал пользователь, у которого ID не равен (ID бота)", но бестолку. Ибо, во время отладки программы я увидел то, что он проверяет каждое отосланное во время его работы сообщения и видит, что когда - то в истории не он отсылал сообщение и пишет дальше (надеюсь понятно выразился).

Вот код:

while (true)
        {
            var poll = api.Groups.GetBotsLongPollHistory(
                    new BotsLongPollHistoryParams()
                    { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 1 });
            if (poll?.Updates == null) continue;
            foreach (var a in poll.Updates)
            {
                if (a.Type == GroupUpdateType.MessageNew)
                {
                    api.Messages.Send(new MessagesSendParams()
                    {
                        RandomId = new Random().Next(),
                        PeerId = *ID бота*,
                        UserId = *ID получателя*,
                        Message = "message"
                    });
                }
            }
        }
  1. Писать в беседе: В беседе бот администратор, в ключе доступа везде галочки, реагирует бот только тогда, когда кто - то напишет в беседе, но всё равно выскакивает исключение в методе api.Messages.Send типа - VkNet.Exception.CannotSendToUserFirstlyException: "Can't send messages for users without permission" . Что не так? Ибо в ЛС это уже не выскакивает.
Answer 1

Необходимо пометить сообщение как прочитанное после его обработки. https://vknet.github.io/vk/messages/markAsRead/

Как вариант можно проверять состояние последнего полученного сообщения и если оно не прочитано, выполнять требуемые действия

var msg = vk.Messages.Get(new MessagesGetParams {Count = 1 }); 
if (msg.Messages[0].ReadState == VkNet.Enums.MessageReadState.Unreaded)
{
   //TODO
}

Соответственно, если это сообщество, то через LongPoll можно следующим образом сделать проверку:

            api.Authorize(new ApiAuthParams() { AccessToken = Token });
            var s = new LongPollServerResponse();
            s = api.Groups.GetLongPollServer(groupID); //id группы
            while (true) //  получение обновлений
            {              
                var poll = api.Groups.GetBotsLongPollHistory(
                   new BotsLongPollHistoryParams()
                   { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 25 });
                if (poll?.Updates == null) continue; // Проверка на новые события
                foreach (var a in poll.Updates)
                {
                    if (a.Type == GroupUpdateType.MessageNew)
                    {
                        string userMessage = a.Message.Text.ToLower();
                        long? userID = a.Message.FromId;
                        string payload = a.Message.Payload;
                        if (a.Message.ReadState == VkNet.Enums.MessageReadState.Unreaded)
                        {
                           //Обрабатываем
                           // После всех действий говорим что сообщение прочитано
                           a.Message.ReadState = VkNet.Enums.MessageReadState.Readed;
                        }
                    }
                 }
             }
READ ALSO
Unity | AudioSource.mute не работает

Unity | AudioSource.mute не работает

У меня есть функция (прикручена к нажатию кнопки), которая должна включать/отключать весь звук на сцене (ну и сохранять наличие/отсутствие...

306
Назначил кнопке обработчик событий, но ничего не происходит. WPF

Назначил кнопке обработчик событий, но ничего не происходит. WPF

Хочу сделать свою программу многостраничнойДля этого я назначил кнопке событие по переключению страниц

95
Сократить код обращения к одинаковым свойствам классов, когда они реализованы разными базовыми классами/интерфейсами?

Сократить код обращения к одинаковым свойствам классов, когда они реализованы разными базовыми классами/интерфейсами?

Пишу простой tweener на UnityДвижок предоставляет классы (компоненты) для рендера, и у тех, что я использую есть свойство color, но эти классы не наследуются...

199
как мне перехватить этот вид исключения

как мне перехватить этот вид исключения

Как в laravel сделать если не авторизован пользователь и вызвать Auth::user()->id; то возвращается ошибка Trying to get property of non-object как ее заменить на свое...

127