public async Task Print([Summary("The alias of the character or technique to display.\n\n" + "If its a character you own and you're on your private channel, it will display everything, otherwise only the public profile.")] string nameOrAlias, string detailed = "") { ulong chanID = Context.Channel.Id; ulong serverID = Context.Guild.Id; var emds = new List <Embed>(); using var ctx = new AvatarBotContext(); try { var player = ctx.Users.Single(x => x.DiscordID == (long)Context.User.Id); var server = ctx.Servers.Single(x => x.DiscordID == (long)Context.Guild.Id); var c = ctx.Characters.SingleOrDefault(x => x.Server.DiscordID == (long)serverID && (x.Name.Equals(nameOrAlias) || x.Alias.Equals(nameOrAlias)) && (x.Hidden == false || ctx.HasPrivilege(server.ID, player.ID))); if (c != null) { if (c is PC pc) { emds.AddRange(pc.GetProfile(Context.Guild.Id, Context.User.Id, Context.Channel.Id, detailed.Equals("full", StringComparison.OrdinalIgnoreCase))); } else if (c is NPC npc) { emds.AddRange(npc.GetProfile(Context.Guild.Id, Context.User.Id, Context.Channel.Id, detailed.Equals("full", StringComparison.OrdinalIgnoreCase))); } } else { await ReplyAsync(Localization.Format(server.Localization, "characters_header", nameOrAlias)); } foreach (var e in emds) { await ReplyAsync("", false, e); } await Context.Channel.DeleteMessageAsync(Context.Message); } catch (Exception e) { Console.WriteLine($"Exception: {e.Message}: {e.StackTrace}"); var inner = e.InnerException; while (inner != null) { Console.WriteLine($"Inner Exception:\n{inner.Message}: {inner.StackTrace}"); inner = inner.InnerException; } } }
public async Task CreateCharacter([Summary("Alias of the character to create")] string alias, [Summary("key=value pairs containing more informations about the character.\n" + "If a value contains more than one word, put it between \"\".\n" + "To learn more about the available fields, use the command **character fields**.")] [Remainder] CommandOptions <Character> options) { using var ctx = new AvatarBotContext(); using var dbTransaction = ctx.Database.BeginTransaction(); var server = ctx.Servers.Single(x => x.DiscordID == (long)Context.Guild.Id); try { var player = ctx.Users.Single(x => x.DiscordID == (long)Context.User.Id); var newChar = new PC() { Alias = alias, Name = alias, Server = server, Player = player }; ctx.Characters.Add(newChar); // Users can't have hidden characters if (!ctx.HasPrivilege(server.ID, player.ID)) { options.Params["hidden"] = "false"; } var msg = UpdateChar(ctx, newChar, options.Params); if (msg == "") { msg = Localization.Format(server.Localization, "character_created", newChar.Name); } ctx.SaveChanges(); dbTransaction.Commit(); await ReplyAsync(msg); await Context.Channel.DeleteMessageAsync(Context.Message); } catch (Exception e) { dbTransaction.Rollback(); await ReplyAsync(Localization.Format(server.Localization, "character_creation_failed", e.Message)); Console.WriteLine($"{e.Message}\n{e.StackTrace}"); } }
public async Task Update([Remainder] [Summary("key=value pairs containing more informations about the character.\n" + "If a value contains more than one word, put it between \"\"." + "To learn more about the available fields, use the command **character fields**.")] CommandOptions <Character> options) { using var ctx = new AvatarBotContext(); using var dbTransaction = ctx.Database.BeginTransaction(); try { // It's an update, I better load everything I can ctx.Characters.Attach(options.Target); //options.Target.FullLoad(ctx); var server = ctx.Servers.Single(x => x.DiscordID == (long)Context.Guild.Id); var player = ctx.Users.Single(x => x.DiscordID == (long)Context.User.Id); if (!ctx.HasPrivilege(server.ID, player.ID)) { options.Params["hidden"] = "false"; } var msg = UpdateChar(ctx, options.Target, options.Params); if (msg == "") { msg = $"{options.Target.Name} has been succesfully updated."; } ctx.SaveChanges(); dbTransaction.Commit(); await ReplyAsync(msg); await Context.Channel.DeleteMessageAsync(Context.Message); } catch (Exception e) { dbTransaction.Rollback(); var server = ctx.Servers.Single(x => x.DiscordID == (long)Context.Guild.Id); await ReplyAsync(Localization.Format(server.Localization, "character_update_failed", e.Message)); Console.WriteLine($"{e.Message}\n{e.StackTrace}"); } }
public List <string> PrintListCharacters(string filter, int detailLevel) { List <string> msg = new List <string>(); using (var ctx = new AvatarBotContext()) { var player = ctx.Users.Single(x => x.DiscordID == (long)Context.User.Id); var server = ctx.Servers.Single(x => x.DiscordID == (long)Context.Guild.Id); msg.Add(GetListHeader(filter, detailLevel)); List <PC> pcs = ctx.Characters.OfType <PC>().Where(x => x.Server.DiscordID == (long)Context.Guild.Id && (filter.Equals("") || x.Name.Contains(filter) || x.Alias.Contains(filter)) && (x.Hidden == false || ctx.HasPrivilege(server.ID, player.ID))).ToList(); foreach (var c in pcs.OrderBy(x => x.Name)) { if (detailLevel != 0 || c.Player.DiscordID == (long)Context.User.Id) { PC defPC = ctx.GetDefaultCharacter((ulong)c.Server.DiscordID, (ulong)c.Player.DiscordID); bool def = defPC != null && defPC.ID == c.ID; if (def || detailLevel != 1) { msg.Add(def ? $"**{c.Name}** (Alias: {c.Alias})" : $"{c.Name} (Alias: {c.Alias})"); } } } } return(msg); }