mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	add: setserverbanner and setservericon commands
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
using NadekoBot.Common.TypeReaders.Models;
 | 
			
		||||
using NadekoBot.Modules.Administration._common.results;
 | 
			
		||||
using NadekoBot.Modules.Administration.Services;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration;
 | 
			
		||||
@@ -405,4 +406,92 @@ public partial class Administration : NadekoModule<AdministrationService>
 | 
			
		||||
            await Response().Confirm(strs.autopublish_disable).SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    [Cmd]
 | 
			
		||||
    [UserPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
    [BotPerm(GuildPerm.ChangeNickname)]
 | 
			
		||||
    [Priority(0)]
 | 
			
		||||
    public async Task SetNick([Leftover] string newNick = null)
 | 
			
		||||
    {
 | 
			
		||||
        if (string.IsNullOrWhiteSpace(newNick))
 | 
			
		||||
            return;
 | 
			
		||||
        var curUser = await ctx.Guild.GetCurrentUserAsync();
 | 
			
		||||
        await curUser.ModifyAsync(u => u.Nickname = newNick);
 | 
			
		||||
 | 
			
		||||
        await Response().Confirm(strs.bot_nick(Format.Bold(newNick) ?? "-")).SendAsync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [Cmd]
 | 
			
		||||
    [BotPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
    [UserPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
    [Priority(1)]
 | 
			
		||||
    public async Task SetNick(IGuildUser gu, [Leftover] string newNick = null)
 | 
			
		||||
    {
 | 
			
		||||
        var sg = (SocketGuild)ctx.Guild;
 | 
			
		||||
        if (sg.OwnerId == gu.Id
 | 
			
		||||
            || gu.GetRoles().Max(r => r.Position) >= sg.CurrentUser.GetRoles().Max(r => r.Position))
 | 
			
		||||
        {
 | 
			
		||||
            await Response().Error(strs.insuf_perms_i).SendAsync();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        await gu.ModifyAsync(u => u.Nickname = newNick);
 | 
			
		||||
 | 
			
		||||
        await Response()
 | 
			
		||||
              .Confirm(strs.user_nick(Format.Bold(gu.ToString()), Format.Bold(newNick) ?? "-"))
 | 
			
		||||
              .SendAsync();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    [Cmd]
 | 
			
		||||
    [RequireContext(ContextType.Guild)]
 | 
			
		||||
    [UserPerm(GuildPermission.ManageGuild)]
 | 
			
		||||
    public async Task SetServerBanner([Leftover] string img = null)
 | 
			
		||||
    {
 | 
			
		||||
        // Tier2 or higher is required to set a banner.
 | 
			
		||||
        if (ctx.Guild.PremiumTier is PremiumTier.Tier1 or PremiumTier.None) return;
 | 
			
		||||
        
 | 
			
		||||
        var result = await _service.SetServerBannerAsync(ctx.Guild, img);
 | 
			
		||||
 | 
			
		||||
        switch (result)
 | 
			
		||||
        {
 | 
			
		||||
            case SetServerBannerResult.Success:
 | 
			
		||||
                await Response().Confirm(strs.set_srvr_banner).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            case SetServerBannerResult.InvalidFileType:
 | 
			
		||||
                await Response().Error(strs.srvr_banner_invalid).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            case SetServerBannerResult.Toolarge:
 | 
			
		||||
                await Response().Error(strs.srvr_banner_too_large).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            case SetServerBannerResult.InvalidURL:
 | 
			
		||||
                await Response().Error(strs.srvr_banner_invalid_url).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new ArgumentOutOfRangeException();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    [Cmd]
 | 
			
		||||
    [RequireContext(ContextType.Guild)]
 | 
			
		||||
    [UserPerm(GuildPermission.ManageGuild)]
 | 
			
		||||
    public async Task SetServerIcon([Leftover] string img = null)
 | 
			
		||||
    {
 | 
			
		||||
        var result = await _service.SetServerIconAsync(ctx.Guild, img);
 | 
			
		||||
 | 
			
		||||
        switch (result)
 | 
			
		||||
        {
 | 
			
		||||
            case SetServerIconResult.Success:
 | 
			
		||||
                await Response().Confirm(strs.set_srvr_icon).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            case SetServerIconResult.InvalidFileType:
 | 
			
		||||
                await Response().Error(strs.srvr_banner_invalid).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            case SetServerIconResult.InvalidURL:
 | 
			
		||||
                await Response().Error(strs.srvr_banner_invalid_url).SendAsync();
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new ArgumentOutOfRangeException();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using NadekoBot.Db;
 | 
			
		||||
using NadekoBot.Db.Models;
 | 
			
		||||
using NadekoBot.Modules.Administration._common.results;
 | 
			
		||||
 | 
			
		||||
namespace NadekoBot.Modules.Administration.Services;
 | 
			
		||||
 | 
			
		||||
@@ -13,17 +14,20 @@ public class AdministrationService : INService
 | 
			
		||||
    private readonly DbService _db;
 | 
			
		||||
    private readonly IReplacementService _repSvc;
 | 
			
		||||
    private readonly ILogCommandService _logService;
 | 
			
		||||
    private readonly IHttpClientFactory _httpFactory;
 | 
			
		||||
 | 
			
		||||
    public AdministrationService(
 | 
			
		||||
        IBot bot,
 | 
			
		||||
        CommandHandler cmdHandler,
 | 
			
		||||
        DbService db,
 | 
			
		||||
        IReplacementService repSvc,
 | 
			
		||||
        ILogCommandService logService)
 | 
			
		||||
        ILogCommandService logService,
 | 
			
		||||
        IHttpClientFactory factory)
 | 
			
		||||
    {
 | 
			
		||||
        _db = db;
 | 
			
		||||
        _repSvc = repSvc;
 | 
			
		||||
        _logService = logService;
 | 
			
		||||
        _httpFactory = factory;
 | 
			
		||||
 | 
			
		||||
        DeleteMessagesOnCommand = new(bot.AllGuildConfigs.Where(g => g.DeleteMessageOnCommand).Select(g => g.GuildId));
 | 
			
		||||
 | 
			
		||||
@@ -158,4 +162,45 @@ public class AdministrationService : INService
 | 
			
		||||
 | 
			
		||||
        await umsg.EditAsync(text);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<SetServerBannerResult> SetServerBannerAsync(IGuild guild, string img)
 | 
			
		||||
    {
 | 
			
		||||
        if (!IsValidUri(img)) return SetServerBannerResult.InvalidURL;
 | 
			
		||||
        
 | 
			
		||||
        var uri = new Uri(img);
 | 
			
		||||
 | 
			
		||||
        using var http = _httpFactory.CreateClient();
 | 
			
		||||
        using var sr = await http.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);
 | 
			
		||||
        
 | 
			
		||||
        if (!sr.IsImage()) return SetServerBannerResult.InvalidFileType;
 | 
			
		||||
 | 
			
		||||
        if (sr.GetContentLength() > 8.Megabytes())
 | 
			
		||||
        {
 | 
			
		||||
            return SetServerBannerResult.Toolarge;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        await using var imageStream = await sr.Content.ReadAsStreamAsync();
 | 
			
		||||
 | 
			
		||||
        await guild.ModifyAsync(x => x.Banner = new Image(imageStream));
 | 
			
		||||
        return SetServerBannerResult.Success;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public async Task<SetServerIconResult> SetServerIconAsync(IGuild guild, string img)
 | 
			
		||||
    {
 | 
			
		||||
        if (!IsValidUri(img)) return SetServerIconResult.InvalidURL;
 | 
			
		||||
        
 | 
			
		||||
        var uri = new Uri(img);
 | 
			
		||||
 | 
			
		||||
        using var http = _httpFactory.CreateClient();
 | 
			
		||||
        using var sr = await http.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);
 | 
			
		||||
        
 | 
			
		||||
        if (!sr.IsImage()) return SetServerIconResult.InvalidFileType;
 | 
			
		||||
        
 | 
			
		||||
        await using var imageStream = await sr.Content.ReadAsStreamAsync();
 | 
			
		||||
 | 
			
		||||
        await guild.ModifyAsync(x => x.Icon = new Image(imageStream));
 | 
			
		||||
        return SetServerIconResult.Success;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
    private bool IsValidUri(string img) => !string.IsNullOrWhiteSpace(img) && Uri.IsWellFormedUriString(img, UriKind.Absolute);
 | 
			
		||||
}
 | 
			
		||||
@@ -459,42 +459,7 @@ public partial class Administration
 | 
			
		||||
 | 
			
		||||
            await Response().Confirm(strs.bot_name(Format.Bold(newName))).SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Cmd]
 | 
			
		||||
        [UserPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
        [BotPerm(GuildPerm.ChangeNickname)]
 | 
			
		||||
        [Priority(0)]
 | 
			
		||||
        public async Task SetNick([Leftover] string newNick = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrWhiteSpace(newNick))
 | 
			
		||||
                return;
 | 
			
		||||
            var curUser = await ctx.Guild.GetCurrentUserAsync();
 | 
			
		||||
            await curUser.ModifyAsync(u => u.Nickname = newNick);
 | 
			
		||||
 | 
			
		||||
            await Response().Confirm(strs.bot_nick(Format.Bold(newNick) ?? "-")).SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Cmd]
 | 
			
		||||
        [BotPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
        [UserPerm(GuildPerm.ManageNicknames)]
 | 
			
		||||
        [Priority(1)]
 | 
			
		||||
        public async Task SetNick(IGuildUser gu, [Leftover] string newNick = null)
 | 
			
		||||
        {
 | 
			
		||||
            var sg = (SocketGuild)ctx.Guild;
 | 
			
		||||
            if (sg.OwnerId == gu.Id
 | 
			
		||||
                || gu.GetRoles().Max(r => r.Position) >= sg.CurrentUser.GetRoles().Max(r => r.Position))
 | 
			
		||||
            {
 | 
			
		||||
                await Response().Error(strs.insuf_perms_i).SendAsync();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await gu.ModifyAsync(u => u.Nickname = newNick);
 | 
			
		||||
 | 
			
		||||
            await Response()
 | 
			
		||||
                  .Confirm(strs.user_nick(Format.Bold(gu.ToString()), Format.Bold(newNick) ?? "-"))
 | 
			
		||||
                  .SendAsync();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        [Cmd]
 | 
			
		||||
        [OwnerOnly]
 | 
			
		||||
        public async Task SetStatus([Leftover] SettableUserStatus status)
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
namespace NadekoBot.Modules.Administration._common.results;
 | 
			
		||||
 | 
			
		||||
public enum SetServerBannerResult
 | 
			
		||||
{
 | 
			
		||||
    Success,
 | 
			
		||||
    InvalidFileType,
 | 
			
		||||
    Toolarge,
 | 
			
		||||
    InvalidURL
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,8 @@
 | 
			
		||||
namespace NadekoBot.Modules.Administration._common.results;
 | 
			
		||||
 | 
			
		||||
public enum SetServerIconResult
 | 
			
		||||
{
 | 
			
		||||
    Success,
 | 
			
		||||
    InvalidFileType,
 | 
			
		||||
    InvalidURL
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#nullable disable warnings
 | 
			
		||||
#nullable disable warnings
 | 
			
		||||
using NadekoBot.Common.Yml;
 | 
			
		||||
using NadekoBot.Db;
 | 
			
		||||
using NadekoBot.Db.Models;
 | 
			
		||||
 
 | 
			
		||||
@@ -195,6 +195,12 @@ setname:
 | 
			
		||||
  - newnm
 | 
			
		||||
setnick:
 | 
			
		||||
  - setnick
 | 
			
		||||
setserverbanner:
 | 
			
		||||
  - setserverbanner
 | 
			
		||||
  - serverbanner
 | 
			
		||||
setservericon:
 | 
			
		||||
  - setservericon
 | 
			
		||||
  - servericon
 | 
			
		||||
setavatar:
 | 
			
		||||
  - setavatar
 | 
			
		||||
  - setav
 | 
			
		||||
 
 | 
			
		||||
@@ -809,6 +809,20 @@ setgame:
 | 
			
		||||
        desc: "The activity type determines whether the bot is engaged in a game, listening to audio, or watching a video."
 | 
			
		||||
      game:
 | 
			
		||||
        desc: "The current state of the bot's activity in the game."
 | 
			
		||||
setserverbanner:
 | 
			
		||||
  desc: Sets a new banner image for the current server. Parameter is a direct link to an image.
 | 
			
		||||
  ex:
 | 
			
		||||
    - https://i.imgur.com/xTG3a1I.jpg
 | 
			
		||||
  params:
 | 
			
		||||
    - img:
 | 
			
		||||
        desc: "The URL of the image file to be displayed as the bot's banner."
 | 
			
		||||
setservericon:
 | 
			
		||||
  desc: Sets a new icon image for the current server. Parameter is a direct link to an image.
 | 
			
		||||
  ex:
 | 
			
		||||
    - https://i.imgur.com/xTG3a1I.jpg
 | 
			
		||||
  params:
 | 
			
		||||
    - img:
 | 
			
		||||
        desc: "The URL of the image file to be displayed as the bot's banner."
 | 
			
		||||
send:
 | 
			
		||||
  desc: 'Sends a message to a channel or user. Channel or user can be '
 | 
			
		||||
  ex:
 | 
			
		||||
 
 | 
			
		||||
@@ -188,6 +188,11 @@
 | 
			
		||||
  "setrole_err": "Failed to add role. I have insufficient permissions.",
 | 
			
		||||
  "set_avatar": "New avatar set!",
 | 
			
		||||
  "set_banner": "New banner set!",
 | 
			
		||||
  "set_srvr_icon": "New server icon set!",
 | 
			
		||||
  "set_srvr_banner": "New server banner set!",
 | 
			
		||||
  "srvr_banner_invalid": "Specified image has an invalid filetype. Make sure you're specifying a direct image url.",
 | 
			
		||||
  "srvr_banner_too_large": "Specified image is too large! Maximum size is 8MB.",
 | 
			
		||||
  "srvr_banner_invalid_url": "Specified url is not valid. Make sure you're specifying a direct image url.",
 | 
			
		||||
  "set_channel_name": "New channel name set.",
 | 
			
		||||
  "set_game": "New game set!",
 | 
			
		||||
  "set_stream": "New stream set!",
 | 
			
		||||
@@ -875,7 +880,7 @@
 | 
			
		||||
  "club_disband_error": "Error. You are either not in a club, or you are not the owner of your club.",
 | 
			
		||||
  "club_icon_too_large": "Image is too large.",
 | 
			
		||||
  "club_icon_invalid_filetype": "Specified image has an invalid filetype. Make sure you're specifying a direct image url.",
 | 
			
		||||
  "club_icon_url_format": "You must specify an absolute image url/.",
 | 
			
		||||
  "club_icon_url_format": "You must specify an absolute image url.",
 | 
			
		||||
  "club_icon_set": "New club icon set.",
 | 
			
		||||
  "club_bans_for": "Bans for {0} club",
 | 
			
		||||
  "club_apps_for": "Applicants for {0} club",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user