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 ;
2020-02-12 14:16:19 +00:00
2020-04-24 19:50:28 +00:00
using DSharpPlus ;
using DSharpPlus.Entities ;
2019-10-05 05:41:00 +00:00
2020-02-12 14:16:19 +00:00
using PluralKit.Core ;
2019-06-21 11:49:58 +00:00
2020-02-12 14:16:19 +00:00
namespace PluralKit.Bot
2019-06-21 11:49:58 +00:00
{
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-14 23:12:03 +00:00
private LoggerCleanService _cleanService ;
public ServerConfig ( IDataStore data , LoggerCleanService cleanService )
2019-06-21 11:49:58 +00:00
{
2019-10-26 17:45:30 +00:00
_data = data ;
2020-02-14 23:12:03 +00:00
_cleanService = cleanService ;
2019-10-05 05:41:00 +00:00
}
public async Task SetLogChannel ( Context ctx )
{
2020-04-24 19:50:28 +00:00
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( Permissions . ManageGuild , "Manage Server" ) ;
2019-10-05 05:41:00 +00:00
2020-04-24 19:50:28 +00:00
DiscordChannel channel = null ;
2019-10-05 05:41:00 +00:00
if ( ctx . HasNext ( ) )
channel = ctx . MatchChannel ( ) ? ? throw new PKSyntaxError ( "You must pass a #channel to set." ) ;
2020-04-24 19:50:28 +00:00
if ( channel ! = null & & channel . GuildId ! = ctx . Guild . Id ) throw new PKError ( "That channel is not in this server!" ) ;
if ( channel . Type ! = ChannelType . Text ) throw new PKError ( "The logging channel must be a text channel." ) ; //TODO: test this
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 )
{
2020-04-24 19:50:28 +00:00
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( Permissions . ManageGuild , "Manage Server" ) ;
2019-11-03 18:15:50 +00:00
2020-04-24 19:50:28 +00:00
var affectedChannels = new List < DiscordChannel > ( ) ;
2019-11-03 18:15:50 +00:00
if ( ctx . Match ( "all" ) )
2020-04-24 19:50:28 +00:00
affectedChannels = ( await ctx . Guild . GetChannelsAsync ( ) ) . Where ( x = > x . Type = = ChannelType . Text ) . ToList ( ) ;
2019-11-03 18:15:50 +00:00
else if ( ! ctx . HasNext ( ) ) throw new PKSyntaxError ( "You must pass one or more #channels." ) ;
else while ( ctx . HasNext ( ) )
{
2020-04-24 19:50:28 +00:00
var channel = ctx . MatchChannel ( ) ; //TODO: test this
if ( channel . Type ! = ChannelType . Text )
2019-11-03 18:15:50 +00:00
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 )
{
2020-04-24 19:50:28 +00:00
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( Permissions . ManageGuild , "Manage Server" ) ;
2019-11-03 18:15:50 +00:00
2020-04-24 19:50:28 +00:00
var affectedChannels = new List < DiscordChannel > ( ) ;
2019-11-03 18:15:50 +00:00
if ( ctx . Match ( "all" ) )
2020-04-24 19:50:28 +00:00
affectedChannels = ( await ctx . Guild . GetChannelsAsync ( ) ) . Where ( x = > x . Type = = ChannelType . Text ) . ToList ( ) ;
2019-11-03 18:15:50 +00:00
else if ( ! ctx . HasNext ( ) ) throw new PKSyntaxError ( "You must pass one or more #channels." ) ;
else while ( ctx . HasNext ( ) )
{
2020-04-24 19:50:28 +00:00
var channel = ctx . MatchChannel ( ) ; //TODO: test this
if ( channel . Type ! = ChannelType . Text )
2019-11-03 18:15:50 +00:00
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
}
2020-02-14 23:12:03 +00:00
public async Task SetLogCleanup ( Context ctx )
{
2020-04-24 19:50:28 +00:00
ctx . CheckGuildContext ( ) . CheckAuthorPermission ( Permissions . ManageGuild , "Manage Server" ) ;
2020-02-14 23:12:03 +00:00
var guildCfg = await _data . GetOrCreateGuildConfig ( ctx . Guild . Id ) ;
var botList = string . Join ( ", " , _cleanService . Bots . Select ( b = > b . Name ) . OrderBy ( x = > x . ToLowerInvariant ( ) ) ) ;
if ( ctx . Match ( "enable" , "on" , "yes" ) )
{
guildCfg . LogCleanupEnabled = true ;
await _data . SaveGuildConfig ( guildCfg ) ;
await ctx . Reply ( $"{Emojis.Success} Log cleanup has been **enabled** for this server. Messages deleted by PluralKit will now be cleaned up from logging channels managed by the following bots:\n- **{botList}**\n\n{Emojis.Note} Make sure PluralKit has the **Manage Messages** permission in the channels in question.\n{Emojis.Note} Also, make sure to blacklist the logging channel itself from the bots in question to prevent conflicts." ) ;
}
else if ( ctx . Match ( "disable" , "off" , "no" ) )
{
guildCfg . LogCleanupEnabled = false ;
await _data . SaveGuildConfig ( guildCfg ) ;
await ctx . Reply ( $"{Emojis.Success} Log cleanup has been **disabled** for this server." ) ;
}
else
{
2020-04-24 19:50:28 +00:00
var eb = new DiscordEmbedBuilder ( )
2020-02-14 23:12:03 +00:00
. WithTitle ( "Log cleanup settings" )
. AddField ( "Supported bots" , botList ) ;
if ( guildCfg . LogCleanupEnabled )
eb . WithDescription ( "Log cleanup is currently **on** for this server. To disable it, type `pk;logclean off`." ) ;
else
eb . WithDescription ( "Log cleanup is currently **off** for this server. To enable it, type `pk;logclean on`." ) ;
await ctx . Reply ( embed : eb . Build ( ) ) ;
}
}
2019-06-21 11:49:58 +00:00
}
}