コード例 #1
0
        public async Task <ulong?> SendAsync(IPendingMessage message)
        {
            var webHook = await GetWebHookClientAsync(message.Channel);

            var messageId = await webHook.SendMessageAsync(message.Content, username : message.BridgeAuthor.Username,
                                                           avatarUrl : message.BridgeAuthor.Avatar);

            return(messageId);
        }
コード例 #2
0
        public async Task DeleteAsync(IPendingMessage message)
        {
            if (message.MessageId == null)
            {
                throw new ArgumentNullException(nameof(message.MessageId));
            }

            var webHook = await GetWebHookClientAsync(message.Channel);

            await webHook.DeleteMessageAsync(message.MessageId.Value);
        }
コード例 #3
0
        public async Task UpdateAsync(IPendingMessage message)
        {
            if (message.MessageId == null)
            {
                throw new ArgumentNullException(nameof(message.MessageId));
            }

            var webHook = await GetWebHookClientAsync(message.Channel);

            await webHook.ModifyMessageAsync(message.MessageId.Value, props => props.Content = message.Content);
        }
コード例 #4
0
		/// <summary>
		/// Try to fire actions for a message
		/// </summary>
		public void TryHandle(IPendingMessage<object> pendingMessage)
		{
			var messageObject = pendingMessage.Message;
// ReSharper disable InvokeAsExtensionMethod
			var type = TypeExtensions.DirectlyImplementedInterfaces(messageObject.GetType()).Single();
// ReSharper restore InvokeAsExtensionMethod

			var matchingHandlers = GetMatchingHandlers(type).ToList();

			if (!matchingHandlers.Any())
			{
				pendingMessage.Finish();
				Log.Warning("Ignoring message of type " + type + " because there are no handlers");
				return;
			}

			HandleMessageWithInstancesOfHandlers(pendingMessage, matchingHandlers, messageObject);
		}
コード例 #5
0
		void HandleMessageWithInstancesOfHandlers(IPendingMessage<object> pendingMessage, 
			IEnumerable<Type> matchingHandlers, object messageObject)
		{
			foreach (var handler in matchingHandlers)
			{
				var hooks = ObjectFactory.GetAllInstances<IEventHook>();

				try
				{
					var instance = ObjectFactory.GetInstance(handler);
					handler.GetMethod("Handle", new[] { messageObject.GetType() }).Invoke(instance, new[] { messageObject });
					FireHandledOkHooks((IMessage)messageObject, hooks);
					_sleeper.Reset();
				}
				catch (Exception ex)
				{
					if (ex is TargetInvocationException)
					{
						ex = ex.InnerException;
					}
					try
					{
						if (ShouldRetry(ex.GetType(), handler))
						{
							RetryFailedMessage(pendingMessage);
						}
						else pendingMessage.Finish();

						FireHandlerFailedHooks((IMessage)messageObject, hooks, ex, handler);
					}
					catch (Exception exinner)
					{
						Log.Warning("Firing handler failed hooks didn't succeed: " + exinner.Message);
					}
					return;
				}
			}
			pendingMessage.Finish();
		}
コード例 #6
0
		/// <summary>
		/// Not currently implemented. Will throw an exception.
		/// </summary>
		/// <remarks>This might be useful at some point to inject test messages?</remarks>
		public void Enqueue(IPendingMessage<object> work)
		{
			throw new InvalidOperationException("This queue self populates and doesn't currently support direct injection.");
		}
コード例 #7
0
		void RetryFailedMessage(IPendingMessage<object> pendingMessage)
		{
			pendingMessage.Cancel();
			_sleeper.SleepMore();
		}