Exemple #1
0
        public async Task StartAsync(IDiscordChannel channel)
        {
            message = await Root.Build().SendToChannel(channel);

            (Root as BaseItem).SetMenu(this);
            (Root as BaseItem).SetParent(null);
            await Root.SelectAsync();
        }
Exemple #2
0
 public static void QueueMessageAsync(this IDiscordChannel channel, string message)
 => MessageBucket.Add(new MessageBucketArgs()
 {
     properties = new MessageArgs()
     {
         content = message
     },
     channel = channel
 });
Exemple #3
0
 private void SendNotADonatorError(IDiscordChannel channel)
 {
     new EmbedBuilder()
     {
         Title       = "Sorry!",
         Description = "... but you haven't donated yet, please support us with a small donation to unlock these commands!",
     }.AddField("Already donated?", "Make sure to join the Miki Support server and claim your donator status!")
     .AddField("Where do I donate?", "You can find our patreon at https://patreon.com/mikibot")
     .ToEmbed().QueueToChannel(channel);
 }
Exemple #4
0
 public static void QueueToChannel(this DiscordEmbed embed, IDiscordChannel channel)
 {
     MessageBucket.Add(new MessageBucketArgs()
     {
         properties = new MessageArgs()
         {
             embed = embed
         },
         channel = channel
     });
 }
Exemple #5
0
        /// <summary>
        /// Unlocks the achievement and if not yet added to the database, It'll add it to the database.
        /// </summary>
        /// <param name="context">sql context</param>
        /// <param name="id">user id</param>
        /// <param name="r">rank set to (optional)</param>
        /// <returns></returns>
        internal async Task UnlockAsync(IDiscordChannel channel, IDiscordUser user, int r = 0)
        {
            long userid = user.Id.ToDbLong();

            if (await UnlockIsValid(userid, r))
            {
                await AchievementManager.Instance.CallAchievementUnlockEventAsync(this, user, channel);

                Notification.SendAchievement(this, channel, user);
            }
        }
Exemple #6
0
        public bool HasPermissions(IDiscordChannel channel, params DiscordGuildPermission[] permissions)
        {
            foreach (DiscordGuildPermission p in permissions)
            {
                GuildPermission newP = (GuildPermission)Enum.Parse(typeof(DiscordGuildPermission), p.ToString());

                if (!(user as IGuildUser).GuildPermissions.Has(newP))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #7
0
        private async Task Client_JoinedGuild(IDiscordGuild arg)
        {
            using (var scope = MikiApp.Instance.Services.CreateScope())
            {
                var context = scope.ServiceProvider.GetService <DbContext>();

                IDiscordChannel defaultChannel = await arg.GetDefaultChannelAsync();

                if (defaultChannel != null)
                {
                    LocaleInstance i = await Locale.GetLanguageInstanceAsync(context, defaultChannel.Id);

                    (defaultChannel as IDiscordTextChannel).QueueMessage(i.GetString("miki_join_message"));
                }

                List <string> allArgs      = new List <string>();
                List <object> allParams    = new List <object>();
                List <object> allExpParams = new List <object>();

                try
                {
                    var members = await arg.GetMembersAsync();

                    for (int i = 0; i < members.Length; i++)
                    {
                        allArgs.Add($"(@p{i * 2}, @p{i * 2 + 1})");

                        allParams.Add(members.ElementAt(i).Id.ToDbLong());
                        allParams.Add(members.ElementAt(i).Username);

                        allExpParams.Add(arg.Id.ToDbLong());
                        allExpParams.Add(members.ElementAt(i).Id.ToDbLong());
                    }

                    await context.Database.ExecuteSqlCommandAsync(
                        $"INSERT INTO dbo.\"Users\" (\"Id\", \"Name\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allParams);

                    await context.Database.ExecuteSqlCommandAsync(
                        $"INSERT INTO dbo.\"LocalExperience\" (\"ServerId\", \"UserId\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allExpParams);

                    await context.SaveChangesAsync();
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }

                DogStatsd.Increment("guilds.joined");
            }
        }
Exemple #8
0
        private async Task Client_JoinedGuild(IDiscordGuild arg)
        {
            IDiscordChannel defaultChannel = await arg.GetDefaultChannelAsync();

            if (defaultChannel != null)
            {
                using (var context = new MikiContext())
                {
                    LocaleInstance i = await Locale.GetLanguageInstanceAsync(context, defaultChannel.Id);

                    (defaultChannel as IDiscordTextChannel).QueueMessage(i.GetString("miki_join_message"));
                }
            }

            //List<string> allArgs = new List<string>();
            //List<object> allParams = new List<object>();
            //List<object> allExpParams = new List<object>();

            //try
            //{
            //	for (int i = 0; i < arg.Members.Count; i++)
            //	{
            //		allArgs.Add($"(@p{i * 2}, @p{i * 2 + 1})");

            //		allParams.Add(arg.Members.ElementAt(i).Id.ToDbLong());
            //		allParams.Add(arg.Members.ElementAt(i).Username);

            //		allExpParams.Add(arg.Id.ToDbLong());
            //		allExpParams.Add(arg.Members.ElementAt(i).Id.ToDbLong());
            //	}

            //	using (var context = new MikiContext())
            //	{
            //		await context.Database.ExecuteSqlCommandAsync(
            //			$"INSERT INTO dbo.\"Users\" (\"Id\", \"Name\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allParams);

            //		await context.Database.ExecuteSqlCommandAsync(
            //			$"INSERT INTO dbo.\"LocalExperience\" (\"ServerId\", \"UserId\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allExpParams);

            //		await context.SaveChangesAsync();
            //	}
            //}
            //catch (Exception e)
            //{
            //	Log.Error(e.ToString());
            //}

            DogStatsd.Increment("guilds.joined");
        }
        public static async Task AddCurrencyAsync(this User user, int amount, IDiscordChannel channel = null, User fromUser = null)
        {
            if (amount < 0)
            {
                throw new ArgumentLessThanZeroException();
            }

            DogStatsd.Counter("currency.change", amount);

            user.Currency += amount;

            if (channel is IDiscordGuildChannel guildchannel)
            {
                await AchievementManager.Instance.CallTransactionMadeEventAsync(guildchannel, user, fromUser, amount);
            }
        }
        public async Task ResetAsync(IDiscordChannel channel, string permission)
        {
            if (!ValidatePermission(permission))
            {
                return;
            }

            if (!await _permissionManager.ResetChannelPermissionAsync(_guild.Id, channel.Id, permission))
            {
                Response.AddError(GetString("Command.Reset.Failed", "Channel", permission, channel));
            }
            else
            {
                Response.AddSuccess(GetString("Command.Reset.Success", "Channel", permission, channel));
            }
        }
Exemple #11
0
        public static async Task <IDiscordUser> ParseUserAsync(IDiscordChannel channel, string name)
        {
            if (!string.IsNullOrWhiteSpace(name))
            {
                if (ulong.TryParse(name.Trim('<', '@', '!', '>'), out ulong l))
                {
                    return(await channel.Guild.GetUserAsync(l));
                }

                string s = name.ToLower();
                List <IDiscordUser> users = await channel.GetUsersAsync();

                return(users
                       .Where(x => x.GetName().ToLower() == s)
                       .First());
            }
            return(null);
        }
Exemple #12
0
        private async Task Client_JoinedGuild(IDiscordGuild arg)
        {
            IDiscordChannel defaultChannel = await arg.GetDefaultChannelAsync();

            defaultChannel.QueueMessageAsync(Locale.GetString(defaultChannel.Id, "miki_join_message"));

            List <string> allArgs      = new List <string>();
            List <object> allParams    = new List <object>();
            List <object> allExpParams = new List <object>();

            try
            {
                var users = await arg.GetUsersAsync();

                for (int i = 0; i < users.Count; i++)
                {
                    allArgs.Add($"(@p{i * 2}, @p{i * 2 + 1})");

                    allParams.Add(users.ElementAt(i).Id.ToDbLong());
                    allParams.Add(users.ElementAt(i).Username);

                    allExpParams.Add((await users.ElementAt(i).GetGuildAsync()).Id.ToDbLong());
                    allExpParams.Add(users.ElementAt(i).Id.ToDbLong());
                }

                using (var context = new MikiContext())
                {
                    await context.Database.ExecuteSqlCommandAsync(
                        $"INSERT INTO dbo.\"Users\" (\"Id\", \"Name\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allParams);

                    await context.Database.ExecuteSqlCommandAsync(
                        $"INSERT INTO dbo.\"LocalExperience\" (\"ServerId\", \"UserId\") VALUES {string.Join(",", allArgs)} ON CONFLICT DO NOTHING", allExpParams);

                    await context.SaveChangesAsync();
                }
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }

            DogStatsd.Increment("guilds.joined");
            //	DogStatsd.Set("guilds", Bot.Instance.Client.Guilds.Count, Bot.Instance.Client.Guilds.Count);
        }
Exemple #13
0
        public async Task AddCurrencyAsync(int amount, IDiscordChannel channel = null, User fromUser = null)
        {
            if (Banned)
            {
                return;
            }

            if (amount < 0)
            {
                if (Currency < Math.Abs(amount))
                {
                    throw new InsufficientCurrencyException(Currency, Math.Abs(amount));
                }
            }

            DogStatsd.Counter("currency.change", amount);

            Currency += amount;

            if (channel != null)
            {
                await AchievementManager.Instance.CallTransactionMadeEventAsync((IDiscordGuildChannel)channel, this, fromUser, Currency);
            }
        }
 public ValueTask OnChannelDelete(IDiscordChannel channel)
 {
     return(_eventManager.CallAsync(new ChannelDeleteEvent(channel)));
 }
 public ChannelCreateEvent(IDiscordChannel channel)
 {
     Channel = channel;
 }
Exemple #16
0
        public async Task CallAchievementUnlockEventAsync(BaseAchievement achievement, IDiscordUser user, IDiscordChannel channel)
        {
            DogStatsd.Counter("achievements.gained", 1);

            if (achievement as AchievementAchievement != null)
            {
                return;
            }

            long id = user.Id.ToDbLong();

            using (var context = new MikiContext())
            {
                int achievementCount = await context.Achievements
                                       .Where(q => q.UserId == id)
                                       .CountAsync();

                AchievementPacket p = new AchievementPacket()
                {
                    discordUser    = user,
                    discordChannel = channel,
                    achievement    = achievement,
                    count          = achievementCount
                };

                await OnAchievementUnlocked?.Invoke(p);
            }
        }
        // TODO: rework this
        public async Task <EventAccessibility> GetUserAccessibility(IDiscordMessage e, IDiscordChannel channel)
        {
            if (e.Author.Id == 121919449996460033)
            {
                return(EventAccessibility.DEVELOPERONLY);
            }

            if (channel is IDiscordGuildChannel guildChannel)
            {
                IDiscordGuildUser u = await(await guildChannel.GetGuildAsync()).GetUserAsync(e.Author.Id);
                if (u != null)
                {
                    if ((await guildChannel.GetPermissionsAsync(u)).HasFlag(GuildPermission.ManageRoles))
                    {
                        return(EventAccessibility.ADMINONLY);
                    }
                }
            }

            return(EventAccessibility.PUBLIC);
        }
Exemple #18
0
 public ScriptChannel(IDiscordChannel channel)
 {
     this.channel = channel;
 }
Exemple #19
0
        public GamblingModule()
        {
            if (!Global.Config.IsMainBot)
            {
                lotteryId = taskScheduler.AddTask(0, (s) =>
                {
                    long size = (Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListLength(lotteryKey);

                    if (size == 0)
                    {
                        return;
                    }

                    string value = (Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListGetByIndex(lotteryKey, MikiRandom.Next(size));

                    ulong winnerId = ulong.Parse(value);
                    int wonAmount  = (int)Math.Round(size * 100 * 0.75);

                    IDiscordUser user = null;                     //Bot.Instance.ChatClient.GetUser(winnerId);

                    using (var context = new MikiContext())
                    {
                        long id          = winnerId.ToDbLong();
                        User profileUser = context.Users.Find(id);

                        if (user != null)
                        {
                            IDiscordChannel channel = user.GetDMChannel().Result;

                            EmbedBuilder embed = new EmbedBuilder()
                            {
                                Author = new EmbedAuthor()
                                {
                                    Name    = "Winner winner chicken dinner",
                                    IconUrl = user.GetAvatarUrl()
                                },
                                Description = $"Wow! You won the lottery and gained {wonAmount} mekos!"
                            };

                            profileUser.AddCurrencyAsync(wonAmount, channel);

                            embed.ToEmbed().QueueToChannel(channel);

                            context.SaveChanges();

                            Global.RedisClient.RemoveAsync(lotteryKey);
                            Global.RedisClient.UpsertAsync("lottery:winner", profileUser.Name ?? "unknown");
                            lotteryDict.ClearAsync();

                            var lotteryAchievement = AchievementManager.Instance.GetContainerById("lottery");

                            if (wonAmount > 100000)
                            {
                                lotteryAchievement.Achievements[0].UnlockAsync(channel, user, 0);
                            }

                            if (wonAmount > 10000000)
                            {
                                lotteryAchievement.Achievements[1].UnlockAsync(channel, user, 1);
                            }

                            if (wonAmount > 250000000)
                            {
                                lotteryAchievement.Achievements[2].UnlockAsync(channel, user, 1);
                            }
                        }
                    }
                }, "", new TimeSpan(0, 1, 0, 0), true);
            }
        }
Exemple #20
0
        public static async Task <IDiscordMessage> SendToChannel(this DiscordEmbed embed, IDiscordChannel channel)
        {
            //if (!(await (await (channel as IDiscordGuildChannel).GetGuildAsync()).GetSelfAsync())
            //	.GuildPermissions.HasFlag (GuildPermission.EmbedLinks))
            //{
            //	if (!string.IsNullOrEmpty(embed.Image?.Url ?? ""))
            //	{
            //		return await channel.SendMessageAsync(embed.ToMessageBuilder().Build());
            //	}

            //	using (WebClient wc = new WebClient())
            //	{
            //		byte[] image = wc.DownloadData(embed.Image.Url);
            //		using (MemoryStream ms = new MemoryStream(image))
            //		{
            //			return await channel.SendFileAsync(ms, embed.ToMessageBuilder().Build());
            //		}
            //	}
            //}
            return(await channel.SendMessageAsync("", false, embed));
        }
 public ChannelDeleteEvent(IDiscordChannel channel)
 {
     Channel = channel;
 }
Exemple #22
0
 public virtual bool HasPermissions(IDiscordChannel channel, params DiscordGuildPermission[] permissions)
 {
     throw new NotImplementedException();
 }
Exemple #23
0
 public async Task <ContextObject> CreateFromUserChannelAsync(IDiscordUser user, IDiscordChannel channel)
 {
     // TODO : Resolve this in a better way.
     DiscordMessage message = new DiscordMessage(
         new DiscordMessagePacket
     {
         Author = new DiscordUserPacket
         {
             Avatar        = user.AvatarId,
             Discriminator = user.Discriminator,
             Id            = user.Id,
             Username      = user.Username,
             IsBot         = user.IsBot
         },
         ChannelId = channel.Id,
         GuildId   = (channel as IDiscordGuildChannel)?.GuildId,
         Content   = "no content",
         Member    = user is IDiscordGuildUser a
                 ? new DiscordGuildMemberPacket
         {
             JoinedAt = a.JoinedAt.UtcDateTime,
             GuildId  = a.GuildId,
             Nickname = a.Nickname,
             Roles    = a.RoleIds.ToList(),
         } : null,
     },
        public async Task PermissionsAsync(IDiscordChannel channel)
        {
            var allowedPermissions = await _permissionManager.GetAllowedChannelPermissionAsync(channel.Id, _guild.Id);

            await PermissionsAsync("Channel", channel, allowedPermissions);
        }
Exemple #25
0
 public static void SendAchievement(AchievementDataContainer d, int rank, IDiscordChannel channel, IDiscordUser user)
 {
     SendAchievement(d.Achievements[rank], channel, user);
 }
 public LocalizableString WithToken(string name, IDiscordChannel channel)
 {
     _tokens[name]         = channel.Name;
     _tokens[name + ".Id"] = channel.Id.ToString();
     return(this);
 }
Exemple #27
0
 public static void SendAchievement(BaseAchievement d, IDiscordChannel channel, IDiscordUser user)
 {
     CreateAchievementEmbed(d, user).QueueToChannel(channel);
 }