tgstation-server
The /tg/station 13 server suite
Provider.cs
Go to the documentation of this file.
1 using System.Collections.Generic;
2 using System.Threading;
3 using System.Threading.Tasks;
5 
6 namespace Tgstation.Server.Host.Components.Chat.Providers
7 {
9  abstract class Provider : IProvider
10  {
14  readonly Queue<Message> messageQueue;
15 
19  TaskCompletionSource<object> nextMessage;
20 
24  protected Provider()
25  {
26  messageQueue = new Queue<Message>();
27  nextMessage = new TaskCompletionSource<object>();
28  }
29 
31  public abstract bool Connected { get; }
32 
34  public abstract string BotMention { get; }
35 
40  protected void EnqueueMessage(Message message)
41  {
42  lock (messageQueue)
43  {
44  messageQueue.Enqueue(message);
45  nextMessage.TrySetResult(null);
46  }
47  }
48 
50  public abstract void Dispose();
51 
53  public abstract Task<bool> Connect(CancellationToken cancellationToken);
54 
56  public abstract Task Disconnect(CancellationToken cancellationToken);
57 
59  public abstract Task<IReadOnlyList<Channel>> MapChannels(IEnumerable<ChatChannel> channels, CancellationToken cancellationToken);
60 
62  public async Task<Message> NextMessage(CancellationToken cancellationToken)
63  {
64  var cancelTcs = new TaskCompletionSource<object>();
65  using (cancellationToken.Register(() => cancelTcs.SetCanceled()))
66  await Task.WhenAny(nextMessage.Task, cancelTcs.Task).ConfigureAwait(false);
67  cancellationToken.ThrowIfCancellationRequested();
68  lock (messageQueue)
69  {
70  var result = messageQueue.Dequeue();
71  if (messageQueue.Count == 0)
72  nextMessage = new TaskCompletionSource<object>();
73  return result;
74  }
75  }
76 
78  public abstract Task SendMessage(ulong channelId, string message, CancellationToken cancellationToken);
79  }
80 }
Represents a message recieved by a IProvider
Definition: Message.cs:6
For interacting with a chat service
Definition: IProvider.cs:11
async Task< Message > NextMessage(CancellationToken cancellationToken)
Get a Task<TResult> resulting in the next Message the IProvider recieves or on a disconnect ...
Definition: Provider.cs:62
TaskCompletionSource< object > nextMessage
TaskCompletionSource<TResult> that completes while messageQueue isn&#39;t empty
Definition: Provider.cs:19
readonly Queue< Message > messageQueue
Queue<T> of received Messages
Definition: Provider.cs:14
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken)
Definition: Provider.cs:40