/// <summary> Asynchronously sends a message to the discord API </summary> public void Send(DiscordApiMessage msg) { // can be null in gap between initial connection and ready event received if (api != null) { api.SendAsync(msg); } }
void HandleNext() { DiscordApiMessage msg = null; WebResponse res = null; lock (reqLock) { msg = GetNextRequest(); } if (msg == null) { handle.WaitOne(); return; } for (int retry = 0; retry < 10; retry++) { try { HttpWebRequest req = HttpUtil.CreateRequest(host + msg.Path); req.Method = "POST"; req.ContentType = "application/json"; req.Headers[HttpRequestHeader.Authorization] = "Bot " + Token; string data = Json.SerialiseObject(msg.ToJson()); HttpUtil.SetRequestData(req, Encoding.UTF8.GetBytes(data)); res = req.GetResponse(); HttpUtil.GetResponseText(res); break; } catch (Exception ex) { if (Handle429(ex)) { continue; } Logger.LogError(ex); return; } } // Avoid triggering HTTP 429 error if possible string remaining = res.Headers["X-RateLimit-Remaining"]; if (remaining == "1") { SleepForRetryPeriod(res); } }
public override bool CombineWith(DiscordApiMessage prior) { ChannelSendMessage msg = prior as ChannelSendMessage; if (msg == null || msg.Path != Path) { return(false); } if (content.Length + msg.content.Length > 1024) { return(false); } // TODO: is stringbuilder even beneficial here msg.content.Append('\n'); msg.content.Append(content.ToString()); content.Clear(); return(true); }
DiscordApiMessage GetNextRequest() { if (requests.Count == 0) { return(null); } DiscordApiMessage first = requests.Dequeue(); // try to combine messages to minimise API calls while (requests.Count > 0) { DiscordApiMessage next = requests.Peek(); if (!next.CombineWith(first)) { break; } requests.Dequeue(); } return(first); }
/// <summary> Attempts to combine this message with a prior message to reduce API calls </summary> public virtual bool CombineWith(DiscordApiMessage prior) { return(false); }
/// <summary> Asynchronously sends a message to the Discord API </summary> public void SendAsync(DiscordApiMessage msg) { lock (reqLock) requests.Enqueue(msg); WakeupWorker(); }
public override bool CombineWith(DiscordApiMessage prior) { return(false); }