public async Task DeclineMarriageAsync(EventContext e) { using (MikiContext context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); ArgObject selection = e.Arguments.FirstOrDefault(); int? selectionId = null; if (selection != null) { selectionId = selection.AsInt(); } var marriages = await repository.GetProposalsReceived(e.Author.Id.ToDbLong()); if (marriages.Count == 0) { throw BotException.CreateCustom("error_proposals_empty"); } marriages = marriages.OrderByDescending(x => x.Marriage.TimeOfMarriage).ToList(); if (selectionId != null) { var m = marriages[selectionId.Value - 1]; string otherName = (await Global.Client.Client.GetUserAsync(m.GetOther(e.Author.Id.ToDbLong()).FromDbLong())).Username; new EmbedBuilder() { Title = $"🔫 You shot down {otherName}!", Description = $"Aww, don't worry {otherName}. There is plenty of fish in the sea!", Color = new Color(191, 105, 82) }.ToEmbed().QueueToChannel(e.Channel); m.Remove(context); await context.SaveChangesAsync(); } else { var embed = new EmbedBuilder() { Title = "💍 Proposals", Footer = new EmbedFooter() { Text = $"Use {await e.Prefix.GetForGuildAsync(Global.RedisClient, e.Guild.Id)}declinemarriage <number> to decline", }, Color = new Color(154, 170, 180) }; await BuildMarriageEmbedAsync(embed, e.Author.Id.ToDbLong(), context, marriages); embed.ToEmbed().QueueToChannel(e.Channel); } } }
public async Task DivorceAsync(EventContext e) { using (MikiContext context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); ArgObject selection = e.Arguments.FirstOrDefault(); int? selectionId = null; if (selection != null) { selectionId = selection.AsInt(); } var marriages = await repository.GetMarriagesAsync((long)e.Author.Id); if (marriages.Count == 0) { throw BotException.CreateCustom("error_proposals_empty"); } marriages = marriages.OrderByDescending(x => x.Marriage.TimeOfMarriage).ToList(); if (selectionId != null) { var m = marriages[selectionId.Value - 1]; var otherUser = await Global.Client.Client.GetUserAsync(m.GetOther(e.Author.Id.ToDbLong()).FromDbLong()); EmbedBuilder embed = Utils.Embed; embed.Title = $"🔔 {e.Locale.GetString("miki_module_accounts_divorce_header")}"; embed.Description = e.Locale.GetString("miki_module_accounts_divorce_content", e.Author.Username, otherUser.Username); embed.Color = new Color(0.6f, 0.4f, 0.1f); embed.ToEmbed().QueueToChannel(e.Channel); m.Remove(context); await context.SaveChangesAsync(); } else { var embed = new EmbedBuilder() { Title = "💍 Marriages", Footer = new EmbedFooter() { Text = $"Use {await e.Prefix.GetForGuildAsync(Global.RedisClient, e.Guild.Id)}divorce <number> to decline", }, Color = new Color(154, 170, 180) }; await BuildMarriageEmbedAsync(embed, e.Author.Id.ToDbLong(), context, marriages); embed.ToEmbed().QueueToChannel(e.Channel); } } }
private async Task HandlerError(BotException exception, BotEventArgs botEventArgs) { LoggerHolder.Instance.Error(exception.Message); if (_sendErrorLogToUser) { var errorLogMessage = new BotTextMessage(exception.Message); await errorLogMessage.SendAsync(_apiProvider, botEventArgs.SenderInfo); } else { var errorMessage = new BotTextMessage("Something went wrong."); await errorMessage.SendAsync(_apiProvider, botEventArgs.SenderInfo); } }
public Task SendExceptionResponse(BotException botException) { var responseName = botException.GetType().Name.Replace("Exception", string.Empty); var responseManagerMethod = typeof(ResponsesManager).GetMethod(responseName); if (responseManagerMethod == null) { Log.Error("{name} doesn't exists as a response", responseName); return(this.SendMessage($"{responseName} doesn't exists as a response")); // message typed into code, bcs it's called only when there is a problem with responses } return(this.SendResponse(x => { var arg = new object[] { x }; if (botException.Value != null) { arg = arg.Append(botException.Value).ToArray(); } return (string)responseManagerMethod.Invoke(null, arg); })); }
public async Task LogBotException(BotException ex) { var toLog = ex.InnerException ?? ex; var descArgs = new List <string> { toLog.Message, ex.ModuleName }; var footerArgs = new List <string> { toLog.Source }; var fields = new List <(string, string, bool)> { (_resources.GetResource("stacktrace_field_title"), toLog.StackTrace, false) }; var payload = _embedPayloadFactory.CreateEmbedPayload(EmbedStruct.Exception, EmbedPayloadType.Error, "module_exception", null, descArgs, null, footerArgs, fields); var embed = _embedService.CreateFieldEmbed(payload); await _ownerDMChannel.SendEmbedAsync(embed); }
private void OnError(MessageEventArgs request, BotException ex) { if (ex.StatusCode == StatusCodes.InternalError) { logger.Error(ex, request.ToJson()); } else { logger.Warn(ex, request.ToJson()); } /// We assume that in the production version you do not need to send an error message to the chat if (settings.IsProd) { SendShortError(request); } else { SendFullError(request, ex); } }
private async void BotOnMessageReceived(object sender, MessageEventArgs request) { logger.Trace($"Message received {request.Message.Text}"); try { var context = await contextFactory.CreateContext(request); var userTextMessage = request.GetClearedTextMessage(); var handler = handlerFactory.CreateHandlerForCommand(userTextMessage); handler.Execute(context, request); logger.Trace($"Message processed {request.Message.Text}"); return; } catch (BotException botException) { OnError(request, botException); } catch (Exception exception) { var internalException = BotException.CreateInternalException(exception); OnError(request, internalException); } logger.Trace($"Message failed {request.Message.Text}"); }
private void SendFullError(MessageEventArgs request, BotException ex) { var sender = serviceFactory.SenderFactory.CreateSender(request); sender.Send($"Unhandled error: {ex.Message}", request); }
public async static Task Exception(BotException exception) { await Mensagem(exception.Message, TipoLog.Erro); }