Пример #1
0
        private void TextCallback(object sender, TextMessage textMessage)
        {
            var langResult = LocalizationManager.LoadLanguage(config.Language);

            if (!langResult.Ok)
            {
                Log.Error("Failed to load language file ({0})", langResult.Error);
            }

            textMessage.Message = textMessage.Message.TrimStart(' ');
            if (!textMessage.Message.StartsWith("!", StringComparison.Ordinal))
            {
                return;
            }

            Log.Info("User {0} requested: {1}", textMessage.InvokerName, textMessage.Message);

            ClientConnection.InvalidateClientBuffer();

            ulong?channelId = null, databaseId = null;

            ulong[] channelGroups = null;
            var     clientResult  = ClientConnection.GetCachedClientById(textMessage.InvokerId);

            if (clientResult.Ok)
            {
                channelId  = clientResult.Value.ChannelId;
                databaseId = clientResult.Value.DatabaseId;
            }
            else
            {
                var clientInfoResult = ClientConnection.GetClientInfoById(textMessage.InvokerId);
                if (clientInfoResult.Ok)
                {
                    channelId     = clientInfoResult.Value.ChannelId;
                    databaseId    = clientInfoResult.Value.DatabaseId;
                    channelGroups = clientInfoResult.Value.ServerGroups;
                }
                else
                {
                    Log.Warn("Bot is not correctly set up. Some commands might not work or are slower (clientlist:{0}, clientinfo:{1}).",
                             clientResult.Error.Str, clientInfoResult.Error.Str);
                }
            }

            var invoker = new InvokerData(textMessage.InvokerUid,
                                          clientId: textMessage.InvokerId,
                                          visibiliy: textMessage.Target,
                                          nickName: textMessage.InvokerName,
                                          channelId: channelId,
                                          databaseId: databaseId)
            {
                ServerGroups = channelGroups
            };

            var session = SessionManager.GetOrCreateSession(textMessage.InvokerId);
            var info    = CreateExecInfo(invoker, session);

            using (session.GetLock())
            {
                // check if the user has an open request
                if (session.ResponseProcessor != null)
                {
                    var msg = session.ResponseProcessor(textMessage.Message);
                    session.ClearResponse();
                    if (!string.IsNullOrEmpty(msg))
                    {
                        info.Write(msg).UnwrapThrow();
                    }
                    return;
                }

                CallScript(info, textMessage.Message, true, false);
            }
        }
Пример #2
0
        private async Task OnMessageReceived(object?sender, TextMessage textMessage)
        {
            if (textMessage?.Message == null)
            {
                Log.Warn("Invalid TextMessage: {@textMessage}", textMessage);
                return;
            }
            Log.Debug("TextMessage: {@textMessage}", textMessage);

            if (!localization.LanguageLoaded)
            {
                var langResult = await localization.LoadLanguage(config.Language, false);

                if (!langResult.Ok)
                {
                    Log.Error("Failed to load language file ({0})", langResult.Error);
                }
            }
            localization.ApplyLanguage();

            textMessage.Message = textMessage.Message.TrimStart(' ');
            if (!textMessage.Message.StartsWith("!", StringComparison.Ordinal))
            {
                return;
            }

            Log.Info("User {0} requested: {1}", textMessage.InvokerName, textMessage.Message);

            ts3client.InvalidateClientBuffer();

            ChannelId?     channelId    = null;
            ClientDbId?    databaseId   = null;
            ChannelGroupId?channelGroup = null;

            ServerGroupId[]? serverGroups = null;

            if (ts3FullClient.Book.Clients.TryGetValue(textMessage.InvokerId, out var bookClient))
            {
                channelId    = bookClient.Channel;
                databaseId   = bookClient.DatabaseId;
                serverGroups = bookClient.ServerGroups.ToArray();
                channelGroup = bookClient.ChannelGroup;
            }
            else if ((await ts3FullClient.ClientInfo(textMessage.InvokerId)).Get(out var infoClient, out var infoClientError))
            {
                channelId    = infoClient.ChannelId;
                databaseId   = infoClient.DatabaseId;
                serverGroups = infoClient.ServerGroups;
                channelGroup = infoClient.ChannelGroup;
            }
            else
            {
                try
                {
                    var cachedClient = await ts3client.GetCachedClientById(textMessage.InvokerId);

                    channelId    = cachedClient.ChannelId;
                    databaseId   = cachedClient.DatabaseId;
                    channelGroup = cachedClient.ChannelGroup;
                }
                catch (AudioBotException cachedClientError)
                {
                    Log.Warn(
                        "The bot is missing teamspeak permissions to view the communicating client. " +
                        "Some commands or permission checks might not work " +
                        "(clientlist:{0}, clientinfo:{1}).",
                        cachedClientError.Message, infoClientError.ErrorFormat());
                }
            }

            var invoker = new ClientCall(textMessage.InvokerUid ?? Uid.Anonymous, textMessage.Message,
                                         clientId: textMessage.InvokerId,
                                         visibiliy: textMessage.Target,
                                         nickName: textMessage.InvokerName,
                                         channelId: channelId,
                                         databaseId: databaseId,
                                         serverGroups: serverGroups,
                                         channelGroup: channelGroup);

            var session = sessionManager.GetOrCreateSession(textMessage.InvokerId);
            var info    = CreateExecInfo(invoker, session);

            // check if the user has an open request
            if (session.ResponseProcessor != null)
            {
                await TryCatchCommand(info, answer : true, async() =>
                {
                    var msg = await session.ResponseProcessor(textMessage.Message);
                    if (!string.IsNullOrEmpty(msg))
                    {
                        await info.Write(msg).CatchToLog(Log);
                    }
                });

                session.ClearResponse();
                return;
            }

            await CallScript(info, textMessage.Message, answer : true, false);
        }