Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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}");
            }
        }
Пример #3
0
        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}");
            }
        }
Пример #4
0
        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);
        }