// DMs related
 public void OnSendDirectMessage(DirectMessageEvent ev)
 {
     if (string.IsNullOrEmpty(accessToken)) return;
     if (ev.recipientUserIds.Contains(", ") && priorityDmOutbox.Count < maxQueuedDms)
     {
         // place all group DMs to priority outbox as long as there's room
         lock (priorityDmOutbox)
         {
             priorityDmOutbox.Enqueue(ev);
         }
     }
     else if (regularDmOutbox.Count < maxQueuedDms)
     {
         // place all the rest regular outbox as long as there's room
         lock (regularDmOutbox)
         {
             regularDmOutbox.Enqueue(ev);
         }
     }
     else
     {
         // drop DMs if there's no room in either outbox
         droppedDmCount++;
     }
 }
        IEnumerator SendDM(DirectMessageEvent ev)
        {
            
            if (!String.IsNullOrEmpty(ev.recipientUserIds) && !String.IsNullOrEmpty(ev.message))
            {
                string broadcasterId = "broadcaster";
                var emojifiedMessage = EmojiHandler.Instance.Emojify(ev.message);
                string payload = String.Format(
                    unformattedDmPayload,
                    broadcastId,
                    ev.recipientUserIds,
                    emojifiedMessage,
                    broadcasterId,
                    ev.user.username,
                    ev.user.ProfileImageUrl,
                    ev.ColorIdx);

                yield return HandleAPIRequest<EmptyResponse>(
                    APIHttpHost,
                    dmEndpointPath,
                    payload,
                    AccessToken,
                    (EmptyResponse r) =>
                    {
                        deliveredDmCount++;
                    },
                    (APIResponse r) => { });
                processedDmCount++;
            }
            lock (dmLock)
            {
                dmsInFlight--;
            }
            yield return null;
        }