2019-11-03 18:15:50 +00:00
using System.Collections.Generic ;
using System.Linq ;
2019-06-21 11:49:58 +00:00
using System.Threading.Tasks ;
using Discord ;
2019-10-05 05:41:00 +00:00
using PluralKit.Bot.CommandSystem ;
2019-06-21 11:49:58 +00:00
namespace PluralKit.Bot.Commands
{
2020-02-01 12:03:02 +00:00
public class ServerConfig
2019-06-21 11:49:58 +00:00
{
2019-10-26 17:45:30 +00:00
private IDataStore _data ;
2020-02-01 12:03:02 +00:00
public ServerConfig ( IDataStore data )
2019-06-21 11:49:58 +00:00
{
2019-10-26 17:45:30 +00:00
_data = data ;
2019-10-05 05:41:00 +00:00
}
public async Task SetLogChannel ( Context ctx )
{
2019-10-27 22:01:20 +00:00
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( GuildPermission . ManageGuild , "Manage Server" ) ;
2019-10-05 05:41:00 +00:00
ITextChannel channel = null ;
if ( ctx . HasNext ( ) )
channel = ctx . MatchChannel ( ) ? ? throw new PKSyntaxError ( "You must pass a #channel to set." ) ;
2019-11-03 18:15:50 +00:00
if ( channel ! = null & & channel . GuildId ! = ctx . Guild . Id ) throw new PKError ( "That channel is not in this server!" ) ;
2019-06-21 11:49:58 +00:00
2019-11-03 18:15:50 +00:00
var cfg = await _data . GetOrCreateGuildConfig ( ctx . Guild . Id ) ;
2019-10-27 22:01:20 +00:00
cfg . LogChannel = channel ? . Id ;
await _data . SaveGuildConfig ( cfg ) ;
2019-06-21 11:49:58 +00:00
if ( channel ! = null )
2019-10-18 11:14:36 +00:00
await ctx . Reply ( $"{Emojis.Success} Proxy logging channel set to #{channel.Name.SanitizeMentions()}." ) ;
2019-06-21 11:49:58 +00:00
else
2019-10-05 05:41:00 +00:00
await ctx . Reply ( $"{Emojis.Success} Proxy logging channel cleared." ) ;
2019-06-21 11:49:58 +00:00
}
2019-11-03 18:15:50 +00:00
public async Task SetLogEnabled ( Context ctx , bool enable )
{
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( GuildPermission . ManageGuild , "Manage Server" ) ;
var affectedChannels = new List < ITextChannel > ( ) ;
if ( ctx . Match ( "all" ) )
affectedChannels = ( await ctx . Guild . GetChannelsAsync ( ) ) . OfType < ITextChannel > ( ) . ToList ( ) ;
else if ( ! ctx . HasNext ( ) ) throw new PKSyntaxError ( "You must pass one or more #channels." ) ;
else while ( ctx . HasNext ( ) )
{
if ( ! ( ctx . MatchChannel ( ) is ITextChannel channel ) )
throw new PKSyntaxError ( $"Channel \" { ctx . PopArgument ( ) . SanitizeMentions ( ) } \ " not found." ) ;
if ( channel . GuildId ! = ctx . Guild . Id ) throw new PKError ( $"Channel {ctx.Guild.Id} is not in this server." ) ;
affectedChannels . Add ( channel ) ;
}
var guildCfg = await _data . GetOrCreateGuildConfig ( ctx . Guild . Id ) ;
if ( enable ) guildCfg . LogBlacklist . ExceptWith ( affectedChannels . Select ( c = > c . Id ) ) ;
else guildCfg . LogBlacklist . UnionWith ( affectedChannels . Select ( c = > c . Id ) ) ;
await _data . SaveGuildConfig ( guildCfg ) ;
await ctx . Reply (
$"{Emojis.Success} Message logging for the given channels {(enable ? " enabled " : " disabled ")}." +
( guildCfg . LogChannel = = null ? $"\n{Emojis.Warn} Please note that no logging channel is set, so there is nowhere to log messages to. You can set a logging channel using `pk;log channel #your-log-channel`." : "" ) ) ;
}
public async Task SetBlacklisted ( Context ctx , bool onBlacklist )
{
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( GuildPermission . ManageGuild , "Manage Server" ) ;
var affectedChannels = new List < ITextChannel > ( ) ;
if ( ctx . Match ( "all" ) )
affectedChannels = ( await ctx . Guild . GetChannelsAsync ( ) ) . OfType < ITextChannel > ( ) . ToList ( ) ;
else if ( ! ctx . HasNext ( ) ) throw new PKSyntaxError ( "You must pass one or more #channels." ) ;
else while ( ctx . HasNext ( ) )
{
if ( ! ( ctx . MatchChannel ( ) is ITextChannel channel ) )
throw new PKSyntaxError ( $"Channel \" { ctx . PopArgument ( ) . SanitizeMentions ( ) } \ " not found." ) ;
if ( channel . GuildId ! = ctx . Guild . Id ) throw new PKError ( $"Channel {ctx.Guild.Id} is not in this server." ) ;
affectedChannels . Add ( channel ) ;
}
var guildCfg = await _data . GetOrCreateGuildConfig ( ctx . Guild . Id ) ;
if ( onBlacklist ) guildCfg . Blacklist . UnionWith ( affectedChannels . Select ( c = > c . Id ) ) ;
else guildCfg . Blacklist . ExceptWith ( affectedChannels . Select ( c = > c . Id ) ) ;
await _data . SaveGuildConfig ( guildCfg ) ;
await ctx . Reply ( $"{Emojis.Success} Channels {(onBlacklist ? " added to " : " removed from ")} the proxy blacklist." ) ;
2019-06-21 11:49:58 +00:00
}
}
}