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); } }
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); }