コード例 #1
0
        public static async Task DoBanMember(DiscordUserData data, DiscordGuild server, DiscordUser victim, DiscordUser cataylist, string reason, bool is_automated, DateTime expire_time)
        {
            //Apply the ban to the account
            DiscordUserDataStatusBanned status = new DiscordUserDataStatusBanned
            {
                applied_since = DateTime.UtcNow.Ticks,
                expiry        = expire_time.Ticks,
                is_applied    = true,
                is_automated  = is_automated,
                reason        = reason
            };

            if (!is_automated)
            {
                status.catalyst = cataylist.Id;
            }
            data.temp_banned = status;

            //Notify the user
            DiscordEmbedBuilder builder = new DiscordEmbedBuilder();

            builder.Title = "You have been temporarily banned from " + server.Name + ".";
            if (is_automated)
            {
                builder.Description = "You were removed from this server. You have had too many strikes applied to your account.";
            }
            else
            {
                builder.Description = "You were removed from this server. You were removed by a member.";
            }
            if (!is_automated)
            {
                builder.AddField("Banned By", $"{cataylist.Username}#{cataylist.Discriminator}");
                builder.AddField("Reason", reason);
            }
            builder.AddField("Expires", BotTools.DateTimeToString(expire_time));
            builder.AddField("Expires In", BotTools.DateTimeOffsetToString(expire_time - DateTime.UtcNow));
            builder.Color  = DiscordColor.Red;
            builder.Footer = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = Program.FOOTER_TEXT
            };
            DiscordEmbed embed = builder.Build();

            //Send
            await BotTools.SendMemberMsg(victim.Id, embed);

            //Kick
            DiscordMember victimMember = await server.GetMemberAsync(victim.Id);

            await server.RemoveMemberAsync(victimMember, "Automated temporary ban system.");

            //Save
            data.Save();
        }
コード例 #2
0
        private static async Task Discord_GuildMemberAdded(DSharpPlus.EventArgs.GuildMemberAddEventArgs e)
        {
            //Check if this user has any outstanding bans or mutes
            DiscordUserData data = BotTools.GetUserDataById(e.Member.Id);

            if (data.temp_banned.CheckIfActive())
            {
                await BanTools.OnBannedMemberJoined(data, e.Guild, e.Member);

                return;
            }
        }
コード例 #3
0
        public async Task UpdateAsync(DiscordUserData user)
        {
            if (user == null)
            {
                return;
            }

            var ctx = DbContext;

            ctx.Entry(user).State = EntityState.Modified;
            await ctx.SaveChangesAsync();
        }
コード例 #4
0
        public static async Task OnBannedMemberJoined(DiscordUserData data, DiscordGuild server, DiscordMember member)
        {
            //Gather data
            DiscordUserDataStatusBanned status = data.temp_banned;

            //Send them a message telling them why they were banned, if they have any strikes, ect.
            DiscordEmbedBuilder builder = new DiscordEmbedBuilder();

            builder.Title = "You are banned temporarily from " + server.Name + ".";
            if (status.is_automated)
            {
                builder.Description = "You cannot join this server. You were banned for having too many strikes. Your active strikes are listed below.";
                var strikes = data.GetActiveStrikes();
                for (int i = 0; i < strikes.Length; i += 1)
                {
                    DiscordUserDataStrike strike = strikes[i];
                    string message = $"*Added {BotTools.DateTimeToString(strike.GetTime())}*\n";
                    if (strike.expire_time.HasValue)
                    {
                        message += $"*__Expires {BotTools.DateTimeToString(strike.GetExpiry().Value)}__*\n";
                    }
                    else
                    {
                        message += "*__Never expires__*\n";
                    }
                    builder.AddField($"Strike {i+1} from {await BotTools.GetRemoteUsername(strike.striker)}", message + strike.message);
                }
            }
            else
            {
                DiscordUser user = await Program.discord.GetUserAsync(status.catalyst);

                builder.Description = $"You cannot join this server. You were banned by a member.";
                builder.AddField("Banned By", $"{user.Username}#{user.Discriminator}");
                builder.AddField("Reason", status.reason);
            }
            builder.AddField("Expires", $"This ban expires on {BotTools.DateTimeToString((DateTime)status.GetExpiry())}. You may rejoin after this time.");
            builder.AddField("Expires In", BotTools.DateTimeOffsetToString((DateTime)status.GetExpiry() - DateTime.UtcNow));
            builder.AddField("Added", $"You were banned on {BotTools.DateTimeToString(status.GetAppliedSince())}");
            builder.Color  = DiscordColor.Red;
            builder.Footer = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = Program.FOOTER_TEXT
            };
            DiscordEmbed embed = builder.Build();

            //DM this to the person
            await BotTools.SendMemberMsg(member.Id, embed);

            //Kick them from this server
            await server.RemoveMemberAsync(member, "Automated temp ban system.");
        }
コード例 #5
0
        public static async Task OnCmd(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content, DiscordMember member, DiscordPermissionLevel perms, DiscordUserData data)
        {
            if (content.Length == 0)
            {
                await ReturnHelp(e);

                return;
            }

            //Do it

            //Find the user
            DiscordUser victim = await BotTools.ParseOfflineName(content.Trim(' '));

            //If not found, complain
            if (victim == null)
            {
                DiscordEmbedBuilder badBuilder = new DiscordEmbedBuilder();
                badBuilder.Title       = "User Not Found";
                badBuilder.Description = $"\"{content.Trim(' ')}\" was not found. Try their ID.";
                badBuilder.Color       = DiscordColor.Yellow;
                badBuilder.Footer      = new DiscordEmbedBuilder.EmbedFooter
                {
                    Text = Program.FOOTER_TEXT
                };
                await e.Message.RespondAsync(embed : badBuilder.Build());

                return;
            }

            //Get user
            DiscordUserData victimData = BotTools.GetUserDataById(victim.Id);

            //Set as not active
            victimData.temp_banned.is_applied = false;

            //Save
            victimData.Save();

            //Write OK
            DiscordEmbedBuilder okBuilder = new DiscordEmbedBuilder();

            okBuilder.Title       = "User Unbanned";
            okBuilder.Description = $"{victim.Username}#{victim.Discriminator} ({victim.Id}) was unbanned.";
            okBuilder.Color       = DiscordColor.Green;
            okBuilder.Footer      = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = Program.FOOTER_TEXT
            };
            await e.Message.RespondAsync(embed : okBuilder.Build());
        }
コード例 #6
0
        public async Task CreateTelegramUser(ulong identifier, string nickName)
        {
            var ctx  = DbContext;
            var user = new DiscordUserData
            {
                Identifier      = identifier,
                NickName        = nickName,
                FirstActionTime = now()
            };

            ctx.Users.Add(user);

            await ctx.SaveChangesAsync();
        }
コード例 #7
0
        private string GetAddress(string token, DiscordUserData data)
        {
            if (token.ToUpperInvariant() == "BNB")
            {
                return(data.BinanceAddress);
            }

            if (token.ToUpperInvariant() == "ETH")
            {
                return(data.EthereumAddress);
            }

            throw new NotSupportedException();
        }
コード例 #8
0
        public static async Task OnCommand(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content)
        {
            //Get Discord member and user data
            DiscordMember member = await e.Guild.GetMemberAsync(e.Author.Id);

            DiscordUserData data = BotTools.GetUserDataById(e.Author.Id);

            data.latest_name = $"{e.Author.Username}#{e.Author.Discriminator}";

            //Identify the permission level of this member
            DiscordPermissionLevel perms = DiscordPermissionLevel.Default;

            if (member.Roles.Where(x => x.Id == Program.config.muted_role).Count() > 0)
            {
                perms = DiscordPermissionLevel.Moderator;
            }
            if (member.Roles.Where(x => x.Id == Program.config.admin_role).Count() > 0)
            {
                perms = DiscordPermissionLevel.Admin;
            }

            //Now, find a command we can use.
            foreach (var c in commands)
            {
                if (c.prefix.ToLower() != prefix.ToLower())
                {
                    continue;
                }
                if (c.requiredLevel > perms)
                {
                    //Tell the user that they're not allowed to do that.
                    await OnCommandAuthFailed(e, c);

                    return;
                }
                try
                {
                    await c.callback(e, prefix, content, member, perms, data);
                } catch (Exception ex)
                {
                    //Failed!
                    Program.LogMessage("cmd-error", ex.Message + ex.StackTrace);
                    await OnCommandExceptionFailed(e, c, ex);
                }
            }
        }
コード例 #9
0
        public static DiscordUserData GetUserDataById(ulong id)
        {
            //Check if this is on the database.
            var collection = Program.db_users;
            var matches    = collection.FindOne(x => x._id == id);

            if (matches != null)
            {
                return(matches);
            }

            //We'll need to create one for this user.
            matches = new DiscordUserData
            {
                _id           = id,
                firstSeenDate = DateTime.UtcNow.Ticks,
                latest_name   = "invalid"
            };
            collection.Insert(matches);
            return(matches);
        }
コード例 #10
0
        private static async Task Discord_MessageCreated(DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            //Check if this a command
            try
            {
                string message = e.Message.Content;
                if (message.StartsWith(config.command_prefix[0]) && !e.Author.IsBot && e.Guild != null)
                {
                    //Get the command
                    message = message.Substring(1);
                    int indexOfBreak = message.IndexOf(' ');
                    if (indexOfBreak != -1)
                    {
                        string prefix = message.Substring(0, indexOfBreak).TrimEnd(' ');
                        message = message.Substring(indexOfBreak).TrimStart(' ');
                        await CommandProcessor.OnCommand(e, prefix, message);
                    }
                    else
                    {
                        await CommandProcessor.OnCommand(e, message, "");
                    }
                }
            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message + ex.StackTrace);
            }

            if (e.Guild != null)
            {
                //Get the member data and update if needed
                DiscordUserData data = BotTools.GetUserDataById(e.Author.Id);
                string          name = $"{e.Author.Username}#{e.Author.Discriminator}";
                if (data.latest_name != name)
                {
                    data.latest_name = name;
                    data.Save();
                }
            }
        }
コード例 #11
0
        public static async Task OnCmd(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content, DiscordMember member, DiscordPermissionLevel perms, DiscordUserData data)
        {
            //Check if this is prompting for help
            string[] split = content.Split(',');
            if (content.Length == 0 || split.Length < 3)
            {
                await ReturnHelp(e);

                return;
            }

            //Parse the message parts
            string memberString  = split[0];
            string timeString    = split[1];
            string messageString = content.Substring(2 + memberString.Length + timeString.Length);

            //Find the user
            DiscordUser victim = await BotTools.ParseName(e.Guild, memberString.Trim(' '));

            //If the bot failed to find the user, throw an error
            if (victim == null)
            {
                await ReturnError(e, "Failed to Find User", $"Failed to find the user, ``{memberString.Trim(' ')}``. You can use their ID, their full name, or their first name. You can also mention them.");

                return;
            }

            //Find time
            DateTime time;
            int      timeParseErrorCount = 0;
            int      timeParseCount      = 0;

            if (timeString.Trim(' ').ToLower() != "never")
            {
                time = BotTools.ParseTime(timeString.Trim(' '), out timeParseErrorCount, out timeParseCount);
            }
            else
            {
                await ReturnError(e, "Cannot Perma Ban", "Please use the ban function built into Discord to permaban a member.");

                return;
            }

            //If the time parse didn't find any, or if there were any errors, stop
            if ((timeParseCount == 0 || timeParseErrorCount > 0))
            {
                await ReturnError(e, "Failed to Parse Time", "There was a problem parsing the time you entered. Do not include commas in the time, make sure you use spaces to separate each part, and make sure you do not use weeks. For help, do not include any arguments and run the command again.");

                return;
            }

            //Limit message to 900 characters
            if (messageString.Length > 900)
            {
                await ReturnError(e, "Reason is Too Long", "Sorry, the reason is limited by Discord to 900 characters.");

                return;
            }

            //Get the user data for the person we just banned and apply.
            DiscordUserData victimUserData = BotTools.GetUserDataById(victim.Id);

            victimUserData.latest_name = $"{victim.Username}#{victim.Discriminator}";
            victimUserData.temp_banned = new DiscordUserDataStatusBanned
            {
                applied_since = DateTime.UtcNow.Ticks,
                catalyst      = e.Author.Id,
                expiry        = time.Ticks,
                is_applied    = true,
                is_automated  = false,
                reason        = messageString
            };

            //Apply the ban to the account
            await ActionTools.BanTools.DoBanMember(victimUserData, e.Guild, victim, e.Author, messageString, false, time);

            //Save
            victimUserData.Save();

            //Write OK
            await ReturnOk(e, victim, time);
        }
コード例 #12
0
        public static async Task NotifyStrike(DiscordUser victim, DiscordUser striker, DiscordUserDataStrike strike, DiscordGuild guild, DiscordUserData data)
        {
            //Notify a user that they've been struck
            DiscordEmbedBuilder builder = new DiscordEmbedBuilder();

            builder.Title       = "You have been struck in " + guild.Name + "!";
            builder.Description = $"{striker.Username}#{striker.Discriminator} struck you. You now have {data.GetActiveStrikes().Length} strikes. When you hit {Program.config.ban_strikes} strikes, you will be **banned** from {guild.Name}.";
            if (strike.expire_time.HasValue)
            {
                builder.AddField("Expires", BotTools.DateTimeToString(strike.GetExpiry().Value));
            }
            else
            {
                builder.AddField("Expires", "*Never*");
            }
            builder.AddField("Striked By", $"{striker.Username}#{striker.Discriminator}");
            builder.AddField("Added", BotTools.DateTimeToString(strike.GetTime()));
            builder.AddField("Message", strike.message);
            builder.Color  = DiscordColor.Yellow;
            builder.Footer = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = Program.FOOTER_TEXT
            };
            await BotTools.SendMemberMsg(victim.Id, builder.Build());
        }
コード例 #13
0
        public static async Task OnCmd(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content, DiscordMember member, DiscordPermissionLevel perms, DiscordUserData data)
        {
            //Check if this is prompting for help
            string[] split = content.Split(',');
            if (content.Length == 0 || split.Length < 3)
            {
                await ReturnHelp(e);

                return;
            }

            //Parse the message parts
            string memberString  = split[0];
            string timeString    = split[1];
            string messageString = content.Substring(2 + memberString.Length + timeString.Length);

            //Find the user
            DiscordUser victim = await BotTools.ParseName(e.Guild, memberString.Trim(' '));

            //If the bot failed to find the user, throw an error
            if (victim == null)
            {
                await ReturnError(e, "Failed to Find User", $"Failed to find the user, ``{memberString.Trim(' ')}``. You can use their ID, their full name, or their first name. You can also mention them.");

                return;
            }

            //Find time
            bool     isForever = true;
            DateTime?time;
            int      timeParseErrorCount = 0;
            int      timeParseCount      = 0;

            if (timeString.Trim(' ').ToLower() != "never")
            {
                time      = BotTools.ParseTime(timeString.Trim(' '), out timeParseErrorCount, out timeParseCount);
                isForever = false;
            }
            else
            {
                time = null;
            }

            //If the time parse didn't find any, or if there were any errors, stop
            if (time != null && (timeParseCount == 0 || timeParseErrorCount > 0))
            {
                await ReturnError(e, "Failed to Parse Time", "There was a problem parsing the time you entered. Do not include commas in the time, make sure you use spaces to separate each part, and make sure you do not use weeks. For help, do not include any arguments and run the command again.");

                return;
            }

            //Limit message to 900 characters
            if (messageString.Length > 900)
            {
                await ReturnError(e, "Reason is Too Long", "Sorry, the reason is limited by Discord to 900 characters.");

                return;
            }

            //Awesome. Now, create the strike
            DiscordUserDataStrike strike = new DiscordUserDataStrike
            {
                time    = DateTime.UtcNow.Ticks,
                striker = e.Author.Id,
                message = messageString
            };

            if (time.HasValue)
            {
                strike.expire_time = time.Value.Ticks;
            }

            //Get the user data for the person we just struck and apply.
            DiscordUserData victimUserData = BotTools.GetUserDataById(victim.Id);

            victimUserData.strikes.Add(strike);

            //Send a notification of this to the person
            await NotifyStrike(victim, member, strike, e.Guild, victimUserData);

            //Check if we need to issue a ban for this member
            var activeStrikes = victimUserData.GetActiveStrikes();

            if (activeStrikes.Length >= Program.config.ban_strikes)
            {
                //Ban time! Find when the latest ban expire happens
                DateTime latest_expire = DateTime.MaxValue;
                bool     does_expire   = false;
                foreach (var a in activeStrikes)
                {
                    if (a.expire_time.HasValue)
                    {
                        does_expire = true;
                        if (a.GetExpiry().Value < latest_expire)
                        {
                            latest_expire = a.GetExpiry().Value;
                        }
                    }
                }
                if (does_expire)
                {
                    //Temp ban
                    await ActionTools.BanTools.DoBanMember(victimUserData, e.Guild, victim, e.Author, "You are banned for having too many strikes.", true, latest_expire);
                }
                else
                {
                    //Send message
                    await ActionTools.BanTools.NotifyPermaBan(e.Guild, victim, e.Author, "You are banned for having too many strikes.", true);

                    //Ban from the server
                    DiscordMember victimMember = await e.Guild.GetMemberAsync(victim.Id);

                    await e.Guild.BanMemberAsync(victimMember, 0, "Temporary ban system.");
                }
            }

            //Save
            victimUserData.Save();

            //Return OK
            await ReturnOk(e, victim, activeStrikes.Length);
        }
コード例 #14
0
        public static async Task OnCmd(DSharpPlus.EventArgs.MessageCreateEventArgs e, string prefix, string content, DiscordMember member, DiscordPermissionLevel perms, DiscordUserData data)
        {
            //Create an embed with all of the commands this user has access to
            var cmds = CommandProcessor.commands.Where(x => x.requiredLevel <= perms);
            DiscordEmbedBuilder builder = new DiscordEmbedBuilder();

            builder.Title       = "Command Help";
            builder.Description = "With any command, run it without any parameters for help.";
            builder.Color       = DiscordColor.Grayple;
            builder.Footer      = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = Program.FOOTER_TEXT
            };
            foreach (var c in cmds)
            {
                builder.AddField(Program.config.command_prefix + c.prefix, c.info, true);
            }
            await e.Message.RespondAsync(embed : builder.Build());
        }
コード例 #15
0
 private string GetAddress(string token, DiscordUserData data)
 {
     return(data.BinanceAddress);
 }