/// <summary> /// Processes the given DiscordMessage, extracting the command and the args for that command. /// Assumes that the message starts with the command char /// </summary> /// <param name="message">The message to parse</param> /// <returns>Two strings, the first being the command name and the second, the arguments</returns> public static string[] ProcessMessage(DiscordMessage message) { string[] contents = message.content.Split(' '); string[] parsed = new string[2]; parsed[0] = contents[0].Substring(1).ToLower(); parsed[1] = ""; for (int i = 1; i < contents.Length; i++) { parsed[1] += contents[i] + " "; } return parsed; }
public DiscordMessage SendMessage(string message) { string url = Endpoints.BaseAPI + Endpoints.Channels + $"/{id}" + Endpoints.Messages; JObject result = JObject.Parse(WebWrapper.Post(url, DiscordClient.token, JsonConvert.SerializeObject(Utils.GenerateMessage(message)))); DiscordMessage m = new DiscordMessage { id = result["id"].ToString(), attachments = result["attachments"].ToObject<string[]>(), author = this.parent.members.Find(x => x.ID == result["author"]["id"].ToString()), channel = this, content = result["content"].ToString(), RawJson = result, timestamp = result["timestamp"].ToObject<DateTime>() }; return m; }
/* From here on are the bot commands. These are exceuted when a user sends a message prefaced with the COMMAND_CHAR found in MessageProcessor.cs */ private bool SetStatus(string args, DiscordMessage from) { _userStatus[from.author.user.username.ToLower()] = args; return true; }
private bool PingComm(string args, DiscordMessage from) { SendMessage(":exclamation: SaltyBot is here :exclamation:", from.channel); return true; }
private bool MeComm(string args, DiscordMessage from) { switch (@from.author.user.username.ToLower()) { case "salt": SendMessage("He is my creator. I owe my digital life to him. :heart: Beep-Boop-Beep" + " :heart:", @from.channel); break; case "kowz": SendMessage("He supplies the world with dank memes and moderately okay Sheik plays", @from.channel); break; case "rafacar": SendMessage("A Brazillian dude who is... --Internet Disconnected--", @from.channel); break; case "freedom": SendMessage("My sources indicate he is Canadian and thus lives with polar bears in " + "an igloo while watching anime", @from.channel); break; case "axaruz": SendMessage("September 16th, 2015 at 1:16pm: \"doesn't matter to me\"", @from.channel); break; default: SendMessage("Hmmmm.... You appear to not be in my database folder \"NSA/People/InternetFolk\". " + "Can you tell me who you are with " + MessageProcessor.COMMAND_CHAR + "iam", @from.channel); break; } return true; }
private bool GetStatus(string args, DiscordMessage from) { args = args.ToLower(); if (_userStatus.ContainsKey(args)) { SendMessage(_userStatus[args], from.channel); } else { SendMessage("User has not set their status yet", from.channel); } return true; }
private void DeleteMessage(DiscordMessage message) { string url = Endpoints.BaseAPI + Endpoints.Channels + $"/{id}" + Endpoints.Messages + $"/{message.id}"; var result = JObject.Parse(WebWrapper.Delete(url, DiscordClient.token)); }
private void SendDeleteRequest(DiscordMessage message, bool user = false) { string url; if(!user) url = Endpoints.BaseAPI + Endpoints.Channels + $"/{message.channel.id}" + Endpoints.Messages + $"/{message.id}"; else url = Endpoints.BaseAPI + Endpoints.Users + $"/{message.channel.id}" + Endpoints.Messages + $"/{message.id}"; try { var result = WebWrapper.Delete(url, token); } catch(Exception ex) { DebugLogger.Log($"Exception ocurred while deleting message (ID: {message.id}): " + ex.Message, MessageLevel.Error); } }
public void DeletePrivateMessage(DiscordMessage message) { SendDeleteRequest(message, true); }
private bool AcceptInviteComm(string args, DiscordMessage from) { // not implemented yet. Waiting on DiscordSharp API return false; }
private void MessageCreateEvents(JObject message) { try { string tempChannelID = message["d"]["channel_id"].ToString(); var foundServerChannel = ServersList.Find(x => x.channels.Find(y => y.id == tempChannelID) != null); if (foundServerChannel == null) { var foundPM = PrivateChannels.Find(x => x.id == message["d"]["channel_id"].ToString()); DiscordPrivateMessageEventArgs dpmea = new DiscordPrivateMessageEventArgs(); dpmea.Channel = foundPM; dpmea.message = message["d"]["content"].ToString(); DiscordMember tempMember = new DiscordMember(); tempMember.user.username = message["d"]["author"]["username"].ToString(); tempMember.user.id = message["d"]["author"]["id"].ToString(); dpmea.author = tempMember; if (PrivateMessageReceived != null) PrivateMessageReceived(this, dpmea); } else { DiscordMessageEventArgs dmea = new DiscordMessageEventArgs(); dmea.Channel = foundServerChannel.channels.Find(y => y.id == tempChannelID); dmea.message_text = message["d"]["content"].ToString(); DiscordMember tempMember = new DiscordMember(); tempMember = foundServerChannel.members.Find(x => x.user.id == message["d"]["author"]["id"].ToString()); dmea.author = tempMember; DiscordMessage m = new DiscordMessage(); m.author = dmea.author; m.channel = dmea.Channel; m.content = dmea.message_text; m.id = message["d"]["id"].ToString(); m.RawJson = message; dmea.message = m; Regex r = new Regex("\\d+"); foreach (Match mm in r.Matches(dmea.message_text)) if (mm.Value == Me.user.id) if (MentionReceived != null) MentionReceived(this, dmea); if (MessageReceived != null) MessageReceived(this, dmea); KeyValuePair<string, DiscordMessage> toAdd = new KeyValuePair<string, DiscordMessage>(message["d"]["id"].ToString(), m); MessageLog.Add(toAdd); } } catch (Exception ex) { Console.WriteLine("!!! {0}", ex.Message); Console.Beep(100, 1000); } }
private void SendDeleteRequest(DiscordMessage message) { var httpRequest = (HttpWebRequest)WebRequest.Create("https://discordapp.com/api/channels/" + message.channel.id + "/messages/" + message.id); httpRequest.Headers["authorization"] = token; httpRequest.ContentType = "application/json"; httpRequest.Method = "DELETE"; using (var sw = new StreamWriter(httpRequest.GetRequestStream())) { //sw.Write("DELETE"); sw.Flush(); sw.Close(); } try { var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var sr = new StreamReader(httpResponse.GetResponseStream())) { var result = sr.ReadToEnd(); } } catch (WebException e) { using (StreamReader s = new StreamReader(e.Response.GetResponseStream())) { string result = s.ReadToEnd(); Console.WriteLine("!!! " + result); } } }
private DiscordMessage GenerateMessage(string message) { DiscordMessage dm = new DiscordMessage(); List<string> foundIDS = new List<string>(); Regex r = new Regex("\\@\\w+"); List<KeyValuePair<string, string>> toReplace = new List<KeyValuePair<string, string>>(); foreach (Match m in r.Matches(message)) { if (m.Index > 0 && message[m.Index - 1] == '<') continue; DiscordMember user = ServersList.Find(x => x.members.Find(y => y.user.username == m.Value.Trim('@')) != null).members.Find(y=>y.user.username == m.Value.Trim('@')); foundIDS.Add(user.user.id); toReplace.Add(new KeyValuePair<string, string>(m.Value, user.user.id)); } foreach(var k in toReplace) { message = message.Replace(k.Key, "<@" + k.Value + ">"); } dm.content = message; dm.mentions = foundIDS.ToArray(); return dm; }
/// <summary> /// Checks to see if the given message starts with the a valid command character /// </summary> /// <param name="message">discord message to check</param> /// <returns>true if message starts with the command char, false otherwise</returns> public static bool ValidCommand(DiscordMessage message) { return message.content[0] == COMMAND_CHAR; }
private bool TimerComm(string args, DiscordMessage from) { int time; try { time = int.Parse(args); } catch (FormatException ex) { SendMessage("Please give a number of seconds to countdown from", from.channel); return false; } if (time < 0) { SendMessage("Please give a number of seconds above 0", from.channel); return false; } _timer = new Timer(time * 1000); _timer.Elapsed += TimerInterval; _timer.Start(); SendMessage(":exclamation::exclamation: " + time + " second timer has started :exclamation::exclamation:", from.channel); _timerChannel = from.channel; return true; }
/// <summary> /// Sends a message to a channel, what else did you expect? /// </summary> /// <param name="message"></param> /// <param name="channel"></param> public DiscordMessage SendMessageToChannel(string message, DiscordChannel channel) { string url = Endpoints.BaseAPI + Endpoints.Channels + $"/{channel.id}" + Endpoints.Messages; try { JObject result = JObject.Parse(WebWrapper.Post(url, token, JsonConvert.SerializeObject(Utils.GenerateMessage(message)))); DiscordMessage m = new DiscordMessage { id = result["id"].ToString(), attachments = result["attachments"].ToObject<string[]>(), author = channel.parent.members.Find(x => x.ID == result["author"]["id"].ToString()), channel = channel, content = result["content"].ToString(), RawJson = result, timestamp = result["timestamp"].ToObject<DateTime>() }; return m; } catch(Exception ex) { DebugLogger.Log($"Error ocurred while sending message to channel ({channel.name}): {ex.Message}", MessageLevel.Error); } return null; }
private bool AuthorizeComm(string args, DiscordMessage from) { if (args == "password" && _admin == null) { _admin = from.author.user; SendMessage( "Successfully set " + _admin.username + " as my local admin. Password invalidated", from.channel); } else { SendMessage("Invalid login credentials. Please copy code from my console.", from.channel); } return true; }
public DiscordMessage EditMessage(string MessageID, string replacementMessage, DiscordChannel channel) { string url = Endpoints.BaseAPI + Endpoints.Channels + $"/{channel.id}" + Endpoints.Messages + $"/{MessageID}"; try { string replacement = JsonConvert.SerializeObject( new { content = replacementMessage, mentions = new string[0] } ); JObject result = JObject.Parse(WebWrapper.Patch(url, token, replacement)); DiscordMessage m = new DiscordMessage { RawJson = result, attachments = result["attachments"].ToObject<string[]>(), author = channel.parent.members.Find(x=>x.ID == result["author"]["id"].ToString()), channel = channel, content = result["content"].ToString(), id = result["id"].ToString(), timestamp = result["timestamp"].ToObject<DateTime>() }; return m; } catch(Exception ex) { DebugLogger.Log("Exception ocurred while editing: " + ex.Message, MessageLevel.Error); } return null; }
private bool ClearComm(string args, DiscordMessage from) { // NOTE: this only works on messages sent from the currently logged in user! if (_admin != null && from.author.user.username == _admin.username) { _client.DeleteAllMessagesInChannel(from.channel); SendMessage("My Channel messages were cleared at " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + " by my admin: " + _admin.username, from.channel); SendMessage("Note, clearing only works when given admin status by the Server owner", from.channel); } return true; }
private void MessageCreateEvents(JObject message) { try { string tempChannelID = message["d"]["channel_id"].ToString(); var foundServerChannel = ServersList.Find(x => x.channels.Find(y => y.id == tempChannelID) != null); if (foundServerChannel == null) { if (message["d"]["author"]["id"].ToString() != Me.ID) { var foundPM = PrivateChannels.Find(x => x.id == message["d"]["channel_id"].ToString()); DiscordPrivateMessageEventArgs dpmea = new DiscordPrivateMessageEventArgs(); dpmea.Channel = foundPM; dpmea.message = message["d"]["content"].ToString(); DiscordMember tempMember = new DiscordMember(this); tempMember.Username = message["d"]["author"]["username"].ToString(); tempMember.ID = message["d"]["author"]["id"].ToString(); dpmea.author = tempMember; if (PrivateMessageReceived != null) PrivateMessageReceived(this, dpmea); } else { //if (DebugMessageReceived != null) // DebugMessageReceived(this, new DiscordDebugMessagesEventArgs { message = "Ignoring MESSAGE_CREATE for private channel for message sent from this client." }); } } else { DiscordMessageEventArgs dmea = new DiscordMessageEventArgs(); dmea.Channel = foundServerChannel.channels.Find(y => y.id == tempChannelID); dmea.message_text = message["d"]["content"].ToString(); DiscordMember tempMember = new DiscordMember(this); tempMember = foundServerChannel.members.Find(x => x.ID == message["d"]["author"]["id"].ToString()); dmea.author = tempMember; DiscordMessage m = new DiscordMessage(); m.author = dmea.author; m.channel = dmea.Channel; m.content = dmea.message_text; m.id = message["d"]["id"].ToString(); m.RawJson = message; m.timestamp = DateTime.Now; dmea.message = m; Regex r = new Regex("\\d+"); foreach (Match mm in r.Matches(dmea.message_text)) if (mm.Value == Me.ID) if (MentionReceived != null) MentionReceived(this, dmea); KeyValuePair<string, DiscordMessage> toAdd = new KeyValuePair<string, DiscordMessage>(message["d"]["id"].ToString(), m); MessageLog.Add(toAdd); if (MessageReceived != null) MessageReceived(this, dmea); } } catch (Exception ex) { DebugLogger.Log("Error ocurred during MessageCreateEvents: " + ex.Message, MessageLevel.Error); } }
private bool DisconnectComm(string args, DiscordMessage from) { if (_admin.username == from.author.user.username) { SendMessage("Goodbye cruel digital world!", from.channel); Disconnect(); } return true; }