public async Task DeleteAsync(CommandContext ctx,
                                          [Description("IP.")] CustomIPFormat ip)
            {
                await this.Database.RemoveSwatIpBanAsync(ip.Content);

                await this.InformAsync(ctx, $"Removed an IP ban rule for {Formatter.InlineCode(ip.Content)}.", important : false);
            }
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [Description("Query port")] int queryport = 10481)
            {
                if (string.IsNullOrWhiteSpace(name))
                {
                    throw new InvalidCommandUsageException("Invalid name.");
                }

                if (queryport <= 0 || queryport > 65535)
                {
                    throw new InvalidCommandUsageException("Port range invalid (must be in range [1, 65535])!");
                }

                using (DatabaseContext db = this.Database.CreateContext()) {
                    var newServer = DatabaseSwatServer.FromIP(ip.Content, queryport, name);
                    if (db.SwatServers.Any(s => s.Name == name || (s.IP == newServer.IP && s.JoinPort == newServer.JoinPort && s.QueryPort == newServer.QueryPort)))
                    {
                        throw new CommandFailedException("A server with such name/IP is already listed!");
                    }
                    db.SwatServers.Add(newServer);
                    await db.SaveChangesAsync();
                }

                await this.InformAsync(ctx, "Server added. You can now query it using the name provided.", important : false);
            }
            public async Task AliasAsync(CommandContext ctx,
                                         [Description("Player alias.")] string alias,
                                         [Description("Player IP.")] CustomIPFormat ip)
            {
                using (DatabaseContext db = this.Database.CreateContext()) {
                    DatabaseSwatPlayer player = db.SwatPlayers
                                                .Include(p => p.DbAliases)
                                                .Include(p => p.DbIPs)
                                                .AsEnumerable()
                                                .FirstOrDefault(p => p.IPs.Contains(ip.Content));
                    if (player is null)
                    {
                        throw new CommandFailedException($"A player with IP {Formatter.Bold(ip.Content)} is not present in the database!");
                    }

                    if (alias.Equals(player.Name, StringComparison.InvariantCultureIgnoreCase))
                    {
                        throw new InvalidCommandUsageException("Alias cannot be same as player's main name.");
                    }

                    if (!player.Aliases.Contains(alias))
                    {
                        player.DbAliases.Add(new DatabaseSwatPlayerAlias {
                            Alias = alias, PlayerId = player.Id
                        });
                    }
                    db.SwatPlayers.Update(player);
                    await db.SaveChangesAsync();

                    await this.InformAsync(ctx, $"Added an alias {Formatter.Bold(alias)} for player {Formatter.Bold(player.Name)}.", important : false);
                }
            }
Пример #4
0
            public async Task SearchIpAsync(CommandContext ctx,
                                            [Description("IP or range.")] CustomIPFormat ip,
                                            [Description("Number of results")] int amount = 10)
            {
                if (amount < 1 || amount > 100)
                {
                    throw new InvalidCommandUsageException("Amount of results to fetch is out of range [1, 100].");
                }

                List <DatabaseSwatPlayer> matches;

                using (DatabaseContext db = this.Database.CreateContext()) {
                    matches = db.SwatPlayers
                              .Include(p => p.DbAliases)
                              .Include(p => p.DbIPs)
                              .AsEnumerable()
                              .Where(p => p.IPs.Any(dbip => dbip.StartsWith(ip.Content)))
                              .ToList();
                }

                if (!matches.Any())
                {
                    throw new CommandFailedException("No results.");
                }

                await ctx.SendCollectionInPagesAsync($"Search matches for {ip.Content}", matches, p => p.Stringify(), this.ModuleColor, 1);
            }
Пример #5
0
            public async Task DeleteAsync(CommandContext ctx,
                                          [Description("IP or range.")] CustomIPFormat ip)
            {
                await this.Database.RemoveSwatIpEntryAsync(ip.Content);

                await this.InformAsync(ctx, $"Removed {Formatter.Bold(ip.Content)} from database.", important : false);
            }
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Player name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [RemainingText, Description("Reason for ban.")] string reason = null)
            {
                await this.Database.AddSwatIpBanAsync(ip.Content, name, reason);

                await this.InformAsync(ctx, $"Added a ban entry for {Formatter.Bold(name)} ({Formatter.InlineCode(ip.Content)})", important : false);
            }
Пример #7
0
        public Task QueryAsync(CommandContext ctx,
                               [Description("Server IP.")] CustomIPFormat ip,
                               [Description("Query port")] int queryport = 10481)
        {
            if (queryport <= 0 || queryport > 65535)
            {
                throw new InvalidCommandUsageException("Port range invalid (must be in range [1, 65535])!");
            }

            var server = DatabaseSwatServer.FromIP(ip.Content, queryport);

            return(this.QueryAndPrintInfoAsync(ctx, server));
        }
Пример #8
0
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Player name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [RemainingText, Description("Additional info.")] string info = null)
            {
                if (info?.Length > 120)
                {
                    throw new InvalidCommandUsageException("Info cannot exceed 120 characters.");
                }

                await this.Database.AddSwatIpEntryAsync(ip.Content, name, info);

                await this.InformAsync(ctx, $"Added a database entry for {Formatter.Bold(name)} ({Formatter.InlineCode(ip.Content)})", important : false);
            }
            public async Task DeleteAsync(CommandContext ctx,
                                          [Description("IP.")] CustomIPFormat ip)
            {
                using (DatabaseContext db = this.Database.CreateContext()) {
                    DatabaseSwatPlayer player = db.SwatPlayers
                                                .Include(p => p.DbIPs)
                                                .FirstOrDefault(p => p.IPs.Contains(ip.Content));
                    if (!(player is null) && player.IsBlacklisted)
                    {
                        player.IsBlacklisted = false;
                        db.SwatPlayers.Update(player);
                    }
                    await db.SaveChangesAsync();
                }

                await this.InformAsync(ctx, $"Removed an IP ban rule for {Formatter.InlineCode(ip.Content)}.", important : false);
            }
Пример #10
0
            public async Task SearchIpAsync(CommandContext ctx,
                                            [Description("IP.")] CustomIPFormat ip,
                                            [Description("Number of results")] int amount = 10)
            {
                if (amount < 1 || amount > 100)
                {
                    throw new InvalidCommandUsageException("Amount of results to fetch is out of range [1, 100].");
                }

                IReadOnlyList <SwatDatabaseEntry> res = await this.Database.SwatDatabaseIpSearchAsync(ip.Content, amount);

                await ctx.SendCollectionInPagesAsync(
                    $"Search matches for {ip.Content}",
                    res,
                    entry => $"{Formatter.InlineCode(entry.Ip)} | {Formatter.Bold(entry.Name)} | {Formatter.Italic(entry.AdditionalInfo ?? "(no details)")}",
                    DiscordColor.Black
                    );
            }
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Player name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [RemainingText, Description("Additional info.")] string info = null)
            {
                using (DatabaseContext db = this.Database.CreateContext()) {
                    DatabaseSwatPlayer player = db.SwatPlayers
                                                .Include(p => p.DbIPs)
                                                .Include(p => p.DbAliases)
                                                .AsEnumerable()
                                                .FirstOrDefault(p => p.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase) || p.IPs.Contains(ip.Content));
                    if (player is null)
                    {
                        var toAdd = new DatabaseSwatPlayer {
                            Info          = info,
                            IsBlacklisted = false,
                            Name          = name
                        };
                        toAdd.DbIPs.Add(new DatabaseSwatPlayerIP {
                            PlayerId = toAdd.Id, IP = ip.Content
                        });
                        db.SwatPlayers.Add(toAdd);
                    }
                    else
                    {
                        if (player.Name != name && !player.Aliases.Contains(name))
                        {
                            player.DbAliases.Add(new DatabaseSwatPlayerAlias {
                                Alias = name, PlayerId = player.Id
                            });
                        }
                        if (!player.IPs.Contains(ip.Content))
                        {
                            player.DbIPs.Add(new DatabaseSwatPlayerIP {
                                PlayerId = player.Id, IP = ip.Content
                            });
                        }
                        db.SwatPlayers.Update(player);
                    }
                    await db.SaveChangesAsync();
                }

                await this.InformAsync(ctx, $"Added a database entry for {Formatter.Bold(name)} ({Formatter.InlineCode(ip.Content)})", important : false);
            }
Пример #12
0
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [Description("Query port")] int queryport = 10481)
            {
                if (string.IsNullOrWhiteSpace(name))
                {
                    throw new InvalidCommandUsageException("Invalid name.");
                }

                if (queryport <= 0 || queryport > 65535)
                {
                    throw new InvalidCommandUsageException("Port range invalid (must be in range [1, 65535])!");
                }

                await this.Database.AddSwatServerAsync(SwatServer.FromIP(ip.Content, queryport, name));

                await this.InformAsync(ctx, "Server added. You can now query it using the name provided.", important : false);
            }
Пример #13
0
        public async Task StartCheckAsync(CommandContext ctx,
                                          [Description("IP.")] CustomIPFormat ip,
                                          [Description("Query port")] int queryport = 10481)
        {
            if (queryport <= 0 || queryport > 65535)
            {
                throw new InvalidCommandUsageException("Port range invalid (must be in range [1, 65535])!");
            }

            if (SwatSpaceCheckService.IsListening(ctx.Channel))
            {
                throw new CommandFailedException("Already checking space in this channel!");
            }

            var server = SwatServer.FromIP(ip.Content, queryport);

            SwatSpaceCheckService.AddListener(server, ctx.Channel);

            await this.InformAsync(ctx, $"Starting space listening on {server.Ip}:{server.JoinPort}... Use command {Formatter.Bold("swat stopcheck")} to stop the check.", important : false);
        }
Пример #14
0
        public async Task QueryAsync(CommandContext ctx,
                                     [Description("Server IP.")] CustomIPFormat ip,
                                     [Description("Query port")] int queryport = 10481)
        {
            if (queryport <= 0 || queryport > 65535)
            {
                throw new InvalidCommandUsageException("Port range invalid (must be in range [1, 65535])!");
            }

            var            server = SwatServer.FromIP(ip.Content, queryport);
            SwatServerInfo info   = await SwatServerInfo.QueryIPAsync(server.Ip, server.QueryPort);

            if (info != null)
            {
                await ctx.RespondAsync(embed : info.ToDiscordEmbed(this.ModuleColor));
            }
            else
            {
                await this.InformFailureAsync(ctx, "No reply from server.");
            }
        }
            public async Task DeleteAsync(CommandContext ctx,
                                          [Description("IP or range.")] CustomIPFormat ip)
            {
                using (DatabaseContext db = this.Database.CreateContext()) {
                    DatabaseSwatPlayer player = db.SwatPlayers.Include(p => p.DbIPs).FirstOrDefault(p => p.IPs.Contains(ip.Content));
                    if (!(player is null))
                    {
                        player.DbIPs.Remove(new DatabaseSwatPlayerIP {
                            IP = ip.Content, PlayerId = player.Id
                        });
                        if (player.DbIPs.Any())
                        {
                            db.SwatPlayers.Update(player);
                        }
                        else
                        {
                            db.SwatPlayers.Remove(player);
                        }
                    }
                    await db.SaveChangesAsync();
                }

                await this.InformAsync(ctx, $"Removed {Formatter.Bold(ip.Content)} from the database.", important : false);
            }
Пример #16
0
            public async Task AddAsync(CommandContext ctx,
                                       [Description("Player name.")] string name,
                                       [Description("IP.")] CustomIPFormat ip,
                                       [RemainingText, Description("Reason for ban.")] string reason = null)
            {
                using (DatabaseContext db = this.Database.CreateContext()) {
                    DatabaseSwatPlayer player = db.SwatPlayers.FirstOrDefault(p => p.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase));
                    if (player is null)
                    {
                        db.SwatPlayers.Add(new DatabaseSwatPlayer {
                            Info          = reason,
                            IsBlacklisted = true
                        });
                    }
                    else
                    {
                        player.IsBlacklisted = true;
                        db.SwatPlayers.Update(player);
                    }
                    await db.SaveChangesAsync();
                }

                await this.InformAsync(ctx, $"Added a ban entry for {Formatter.Bold(name)} ({Formatter.InlineCode(ip.Content)})", important : false);
            }
Пример #17
0
 public Task AddAsync(CommandContext ctx,
                      [Description("IP.")] CustomIPFormat ip,
                      [Description("Player name.")] string name,
                      [RemainingText, Description("Additional info.")] string reason = null)
 => this.AddAsync(ctx, name, ip, reason);
Пример #18
0
 public Task ExecuteGroupAsync(CommandContext ctx,
                               [Description("IP or range.")] CustomIPFormat ip,
                               [Description("Number of results")] int amount = 10)
 => this.SearchIpAsync(ctx, ip, amount);
 public Task AliasAsync(CommandContext ctx,
                        [Description("Player IP.")] CustomIPFormat ip,
                        [Description("Player alias.")] string alias)
 => this.AliasAsync(ctx, alias, ip);
Пример #20
0
 public Task AddAsync(CommandContext ctx,
                      [Description("IP.")] CustomIPFormat ip,
                      [Description("Name.")] string name,
                      [Description("Query port")] int queryport = 10481)
 => this.AddAsync(ctx, name, ip, queryport);