Пример #1
0
 /// <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);
     }
 }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 /// <summary> Attempts to combine this message with a prior message to reduce API calls </summary>
 public virtual bool CombineWith(DiscordApiMessage prior)
 {
     return(false);
 }
Пример #6
0
 /// <summary> Asynchronously sends a message to the Discord API </summary>
 public void SendAsync(DiscordApiMessage msg)
 {
     lock (reqLock) requests.Enqueue(msg);
     WakeupWorker();
 }
Пример #7
0
 public override bool CombineWith(DiscordApiMessage prior)
 {
     return(false);
 }