mirror of
				https://gitlab.com/Kwoth/nadekobot.git
				synced 2025-11-04 00:34:26 -05:00 
			
		
		
		
	Merge branch 'stickeradd' into 'v4'
See merge request Kwoth/nadekobot!276
This commit is contained in:
		@@ -147,6 +147,7 @@ This section will guide you through how to create a simple custom medusa. You ca
 | 
				
			|||||||
        <!-- Use latest .net features -->
 | 
					        <!-- Use latest .net features -->
 | 
				
			||||||
        <LangVersion>preview</LangVersion>
 | 
					        <LangVersion>preview</LangVersion>
 | 
				
			||||||
        <EnablePreviewFeatures>true</EnablePreviewFeatures>
 | 
					        <EnablePreviewFeatures>true</EnablePreviewFeatures>
 | 
				
			||||||
 | 
					        <GenerateRequiresPreviewFeaturesAttribute>true</GenerateRequiresPreviewFeaturesAttribute>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        <!-- tell .net that this library will be used as a plugin -->
 | 
					        <!-- tell .net that this library will be used as a plugin -->
 | 
				
			||||||
        <EnableDynamicLoading>true</EnableDynamicLoading>
 | 
					        <EnableDynamicLoading>true</EnableDynamicLoading>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -402,6 +402,99 @@ public partial class Utility : NadekoModule
 | 
				
			|||||||
        await ctx.OkAsync();
 | 
					        await ctx.OkAsync();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [Cmd]
 | 
				
			||||||
 | 
					    [RequireContext(ContextType.Guild)]
 | 
				
			||||||
 | 
					    [BotPerm(GuildPerm.ManageEmojisAndStickers)]
 | 
				
			||||||
 | 
					    [UserPerm(GuildPerm.ManageEmojisAndStickers)]
 | 
				
			||||||
 | 
					    public async Task StickerAdd(string name = null, string description = null, params string[] tags)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        string format;
 | 
				
			||||||
 | 
					        Stream stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ctx.Message.Stickers.Count is 1 && ctx.Message.Stickers.First() is SocketSticker ss)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            name ??= ss.Name;
 | 
				
			||||||
 | 
					            description = ss.Description;
 | 
				
			||||||
 | 
					            format = FormatToExtension(ss.Format);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            using var http = _httpFactory.CreateClient();
 | 
				
			||||||
 | 
					            stream = await http.GetStreamAsync(ss.GetStickerUrl());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // else if (ctx.Message.Attachments.FirstOrDefault() is { } attachment)
 | 
				
			||||||
 | 
					        // {
 | 
				
			||||||
 | 
					        //     var url = attachment?.Url;
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     if (url is null)
 | 
				
			||||||
 | 
					        //         return;
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     if (name is null)
 | 
				
			||||||
 | 
					        //     {
 | 
				
			||||||
 | 
					        //         await ReplyErrorLocalizedAsync(strs.sticker_missing_name);
 | 
				
			||||||
 | 
					        //         return;
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     format = Path.GetExtension(attachment.Filename);
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     if (attachment is not { Width: 300, Height: 300 })
 | 
				
			||||||
 | 
					        //     {
 | 
				
			||||||
 | 
					        //         await ReplyErrorLocalizedAsync(strs.sticker_invalid_size);
 | 
				
			||||||
 | 
					        //         return;
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     using var http = _httpFactory.CreateClient();
 | 
				
			||||||
 | 
					        //     
 | 
				
			||||||
 | 
					        //     using var res = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
 | 
				
			||||||
 | 
					        //     if (res.GetContentLength() > 512.Kilobytes().Bytes)
 | 
				
			||||||
 | 
					        //     {
 | 
				
			||||||
 | 
					        //         await ReplyErrorLocalizedAsync(strs.invalid_emoji_link);
 | 
				
			||||||
 | 
					        //         return;
 | 
				
			||||||
 | 
					        //     }
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        //     stream = await res.Content.ReadAsStreamAsync();
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await ReplyErrorLocalizedAsync(strs.sticker_error);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await ctx.Guild.CreateStickerAsync(name,
 | 
				
			||||||
 | 
					                string.IsNullOrWhiteSpace(description) ? "Missing description" : description,
 | 
				
			||||||
 | 
					                tags,
 | 
				
			||||||
 | 
					                stream,
 | 
				
			||||||
 | 
					                $"{name}.{format}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await ctx.OkAsync();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        catch (Exception ex)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Log.Warning(ex, "Error occurred while adding a sticker: {Message}", ex.Message);
 | 
				
			||||||
 | 
					            await ReplyErrorLocalizedAsync(strs.error_occured);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        finally
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            await stream.DisposeAsync();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private static string FormatToExtension(StickerFormatType format)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      switch (format)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        case StickerFormatType.None:
 | 
				
			||||||
 | 
					        case StickerFormatType.Png:
 | 
				
			||||||
 | 
					        case StickerFormatType.Apng:
 | 
				
			||||||
 | 
					          return "png";
 | 
				
			||||||
 | 
					        case StickerFormatType.Lottie:
 | 
				
			||||||
 | 
					          return "lottie";
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          throw new ArgumentException(nameof (format));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [Cmd]
 | 
					    [Cmd]
 | 
				
			||||||
    [OwnerOnly]
 | 
					    [OwnerOnly]
 | 
				
			||||||
    public async Task ListServers(int page = 1)
 | 
					    public async Task ListServers(int page = 1)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -728,6 +728,9 @@ showemojis:
 | 
				
			|||||||
emojiadd:
 | 
					emojiadd:
 | 
				
			||||||
  - emojiadd
 | 
					  - emojiadd
 | 
				
			||||||
  - ea
 | 
					  - ea
 | 
				
			||||||
 | 
					stickeradd:
 | 
				
			||||||
 | 
					  - stickeradd
 | 
				
			||||||
 | 
					  - sa
 | 
				
			||||||
emojiremove:
 | 
					emojiremove:
 | 
				
			||||||
  - emojiremove
 | 
					  - emojiremove
 | 
				
			||||||
  - emojirm
 | 
					  - emojirm
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1245,6 +1245,10 @@ emojiremove:
 | 
				
			|||||||
  desc: "Removes the specified emoji or emojis from this server."
 | 
					  desc: "Removes the specified emoji or emojis from this server."
 | 
				
			||||||
  args:
 | 
					  args:
 | 
				
			||||||
    - ":eagleWarrior: :plumedArcher:"
 | 
					    - ":eagleWarrior: :plumedArcher:"
 | 
				
			||||||
 | 
					stickeradd:
 | 
				
			||||||
 | 
					  desc: "Adds the sticker from your message to this server. Send the sticker along with this command (in the same message)."
 | 
				
			||||||
 | 
					  args:
 | 
				
			||||||
 | 
					    - "optionalname \"optional description\" tag1 tag2 tagN"
 | 
				
			||||||
deckshuffle:
 | 
					deckshuffle:
 | 
				
			||||||
  desc: "Reshuffles all cards back into the deck."
 | 
					  desc: "Reshuffles all cards back into the deck."
 | 
				
			||||||
  args:
 | 
					  args:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1052,6 +1052,9 @@
 | 
				
			|||||||
  "xpshop_already_owned": "You already own this item.",
 | 
					  "xpshop_already_owned": "You already own this item.",
 | 
				
			||||||
  "xpshop_item_not_found": "An item with that key doesn't exist.",
 | 
					  "xpshop_item_not_found": "An item with that key doesn't exist.",
 | 
				
			||||||
  "xpshop_website": "You can see the list of all Xp Shop items here: <https://xpshop.nadeko.bot>",
 | 
					  "xpshop_website": "You can see the list of all Xp Shop items here: <https://xpshop.nadeko.bot>",
 | 
				
			||||||
 | 
					  "sticker_invalid_size": "Stickers must be exactly 300x300 pixels.",
 | 
				
			||||||
 | 
					  "sticker_error": "You must either send a sticker along with this command, or upload a 300x300 .png or .apng image.",
 | 
				
			||||||
 | 
					  "sticker_missing_name": "Please specify a name for the sticker.",
 | 
				
			||||||
  "thread_deleted": "Thread Deleted",
 | 
					  "thread_deleted": "Thread Deleted",
 | 
				
			||||||
  "thread_created": "Thread Created"
 | 
					  "thread_created": "Thread Created"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user