/// <summary> /// Posts a command locally. Commands like /help will result in a help message written in the current channel. /// </summary> /// <param name="text">the text containing the command identifier and command parameters.</param> /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param> public void PostCommand(string text, Channel target = null) { if (target == null) { target = CurrentChannel.Value; } if (target == null) { return; } var parameters = text.Split(new[] { ' ' }, 2); string command = parameters[0]; string content = parameters.Length == 2 ? parameters[1] : string.Empty; switch (command) { case "np": AddInternal(new NowPlayingCommand()); break; case "me": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage("Usage: /me [action]")); break; } PostMessage(content, true); break; case "join": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage("Usage: /join [channel]")); break; } var channel = availableChannels.FirstOrDefault(c => c.Name == content || c.Name == $"#{content}"); if (channel == null) { target.AddNewMessages(new ErrorMessage($"Channel '{content}' not found.")); break; } JoinChannel(channel); CurrentChannel.Value = channel; break; case "help": target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /np")); break; default: target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help")); break; } }
/// <summary> /// Posts a command locally. Commands like /help will result in a help message written in the current channel. /// </summary> /// <param name="text">the text containing the command identifier and command parameters.</param> /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param> public void PostCommand(string text, Channel target = null) { if (target == null) { target = CurrentChannel.Value; } if (target == null) { return; } var parameters = text.Split(new[] { ' ' }, 2); string command = parameters[0]; string content = parameters.Length == 2 ? parameters[1] : string.Empty; switch (command) { case "me": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage("Usage: /me [action]")); break; } PostMessage(content, true); break; case "help": target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action]")); break; default: target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help")); break; } }
/// <summary> /// Posts a message to the currently opened channel. /// </summary> /// <param name="text">The message text that is going to be posted</param> /// <param name="isAction">Is true if the message is an action, e.g.: user is currently eating </param> /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param> public void PostMessage(string text, bool isAction = false, Channel target = null) { if (target == null) { target = CurrentChannel.Value; } if (target == null) { return; } void dequeueAndRun() { if (postQueue.Count > 0) { postQueue.Dequeue().Invoke(); } } postQueue.Enqueue(() => { if (!api.IsLoggedIn) { target.AddNewMessages(new ErrorMessage("Please sign in to participate in chat!")); return; } var message = new LocalEchoMessage { Sender = api.LocalUser.Value, Timestamp = DateTimeOffset.Now, ChannelId = target.Id, IsAction = isAction, Content = text }; target.AddLocalEcho(message); // if this is a PM and the first message, we need to do a special request to create the PM channel if (target.Type == ChannelType.PM && !target.Joined) { var createNewPrivateMessageRequest = new CreateNewPrivateMessageRequest(target.Users.First(), message); createNewPrivateMessageRequest.Success += createRes => { target.Id = createRes.ChannelID; target.ReplaceMessage(message, createRes.Message); dequeueAndRun(); }; createNewPrivateMessageRequest.Failure += exception => { Logger.Error(exception, "Posting message failed."); target.ReplaceMessage(message, null); dequeueAndRun(); }; api.Queue(createNewPrivateMessageRequest); return; } var req = new PostMessageRequest(message); req.Success += m => { target.ReplaceMessage(message, m); dequeueAndRun(); }; req.Failure += exception => { Logger.Error(exception, "Posting message failed."); target.ReplaceMessage(message, null); dequeueAndRun(); }; api.Queue(req); }); // always run if the queue is empty if (postQueue.Count == 1) { dequeueAndRun(); } }
public void PostCommand(string text, Channel target = null) { target ??= CurrentChannel.Value; if (target == null) { return; } string[] parameters = text.Split(' ', 2); string command = parameters[0]; string content = parameters.Length == 2 ? parameters[1] : string.Empty; switch (command) { case "np": AddInternal(new NowPlayingCommand(target)); break; case "me": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage("Usage: /me [action]")); break; } PostMessage(content, true, target); break; case "join": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage("Usage: /join [channel]")); break; } var channel = availableChannels.FirstOrDefault(c => c.Name == content || c.Name == $"#{content}"); if (channel == null) { target.AddNewMessages(new ErrorMessage($"Channel '{content}' not found.")); break; } JoinChannel(channel); break; case "chat": case "msg": case "query": if (string.IsNullOrWhiteSpace(content)) { target.AddNewMessages(new ErrorMessage($"Usage: /{command} [user]")); break; } // Check if the user has joined the requested channel already. // This uses the channel name for comparison as the PM user's username is unavailable after a restart. var privateChannel = JoinedChannels.FirstOrDefault( c => c.Type == ChannelType.PM && c.Users.Count == 1 && c.Name.Equals(content, StringComparison.OrdinalIgnoreCase)); if (privateChannel != null) { CurrentChannel.Value = privateChannel; break; } var request = new GetUserRequest(content); request.Success += OpenPrivateChannel; request.Failure += e => target.AddNewMessages( new ErrorMessage(e.InnerException?.Message == @"NotFound" ? $"User '{content}' was not found." : $"Could not fetch user '{content}'.")); api.Queue(request); break; case "help": target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /chat [user], /np")); break; default: target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help")); break; } }