From 14af94e7a39c6b745d0ef88f8acc38139d19533d Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Wed, 5 Aug 2020 22:54:14 +0300 Subject: [PATCH] Add !channel/!channelinfo --- assets/icons/announcement-channel.png | Bin 0 -> 3078 bytes assets/icons/announcement-channel.svg | 1 + assets/icons/text-channel.png | Bin 0 -> 3408 bytes assets/icons/text-channel.svg | 1 + assets/icons/voice-channel.png | Bin 0 -> 4167 bytes assets/icons/voice-channel.svg | 1 + backend/src/plugins/Utility/UtilityPlugin.ts | 4 + .../Utility/commands/ChannelInfoCmd.ts | 25 ++++ .../Utility/functions/getChannelInfoEmbed.ts | 111 ++++++++++++++++++ backend/src/plugins/Utility/types.ts | 1 + 10 files changed, 144 insertions(+) create mode 100644 assets/icons/announcement-channel.png create mode 100644 assets/icons/announcement-channel.svg create mode 100644 assets/icons/text-channel.png create mode 100644 assets/icons/text-channel.svg create mode 100644 assets/icons/voice-channel.png create mode 100644 assets/icons/voice-channel.svg create mode 100644 backend/src/plugins/Utility/commands/ChannelInfoCmd.ts create mode 100644 backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts diff --git a/assets/icons/announcement-channel.png b/assets/icons/announcement-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..7fbf8dd3f474b4b895928df3abbb487ca3beebfc GIT binary patch literal 3078 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 t_6HCQ \ No newline at end of file diff --git a/assets/icons/text-channel.png b/assets/icons/text-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfd3079b4c80caa4f3015c6588e3a01750afe3a GIT binary patch literal 3408 zcmai130M=?7M>7{h(S<97PklQ#jY?bE*ZeVI(|{OA00&VSB5_se%a+g+6u zwG;sWP;z&3Cc}5J>{39%-)*+^8vr1G38K&hG%rtL2q(gX&fo-tCZY%~j01p;orp^h z2?GU~V2}kxlCYycwO}z2gMoj^9^7Q+MmVzyI4V!}eK8CW}8MH>+jCWrt9 zbc`q>Jd#fok+Ac;MEJMtF%FBFHxY!9urx0pj1z|kVk}H7Oz>D+MT`xP!6cHMw|;bn zS0pT3Am9>lxTvTolPEJ24v&R1wYIj#;R!eb!5FqM=0`^g=py4t{stMv0*5om58**v z0mO;K$T;c29HD@O#lkq|BRMF7KC?&iKc){0fs-LPQxiPyujT@X`48qY^cah$Dl1 zj*u4uy6gud1smp-km*A7fka?9%^8XSBl)npB&;dH>c7w(|Aabm!Z|!YxUE3gZQeP=ElU*G#?k-N2rq-60#srgvRN%r9VPA+D?MxTI zRs=i&Z;ZDx##>Mb1R}wdXll9%Z$`u~#4~RV?*|55K>vUCvaZJ1z#d*+L^p^p;P9g7 zA1$=HAGmK}wXh6_=6f82nXfdF9wHNogyr%$3}Fb!m`@9)TR{07rXY&W107g!kx5tw zCKH0?jK;v*2VzBnJdCM{)kgt8`9!fnnD3vn!+nemC);;_24{o&B7B>9gTHK4*l*z( zJOJQHg8MW|;Kiq51V+LWhzF0F1`Z<~01)vIT$nEk0s#6M!i<(}j=n3~?V#WZByzQu zmQIC1n__Vms>G-aW$|M0Y}elS`%g$4i!In{if6M9C{3#OYnd;0@RjfB@7~o<9w&Mu zH;(UlLpnX%{QH{QBz2>VwC@LUo6~PStMlm|4W#Yj-P_B)lIT~eCwVa(E+RO#{VUr0 zIK&|_E3Y4zJ9~ytBjt%+EuMvo$}hy#oXULL$^y@wy3i}C3huB+svuw_1w_q;m(Z5p;P7o#?dvc#+Ixjcv9sN{4@WcC2WPULqEqlQ@R_lM>$Zar z083S67Xrx1(*OX}MR#WhiYRX+e|MQ0b!Gd(n1SBQb~jI8E|Qy=w4R;I!3nIIuR}Vn zS&e;F{w>+5+ei5=e!`(UWa9o#nu_LxietR;fl@GQik`h<^V`|-B%nS&{v=#cZybIdtz;g;FA2<7=NZt-jhtwc0mQpGj9spGYg**PljMBEp6xzjW7K z>SRP$Yl#-sU+8L2itma)IV`ccd#-9-pT*?~a>sZu`kjU-CzWGsez1=uZ8XAFj*uTP zYMN-MZ=C0HmAQ+?jK&-Sa&(X9A;d}XY69U9ksw?9TelwI``m*^i>^>Q z(nG0z*=G@1TdqbfEe%$zX*#v+myPJ5733RuvbpqOYyCqZb)BMwVU;SjZoPX;`!ITg z0g@4Iiqud~EI%SyXOjIhL7aYV;`H<%P7##Jbf#ey8l(H2?|_qJQm4wSIGvtWgQztV zQ(pZcq!yqh425%=_BsB?5I;F8YHrO^=Zm)-ek{p0v_QJK4oo!~dM~CD^7cKwaPJnd zqNb@{i>8kr+&<^-32190F$d4dz4QdG5X7f^^MDV?_v^?Vlwt;OvR0ChC=UFwpBimh z_Pv2yC(!F#*HZa&OM;=MW0v|`aYHM2#4|Gy0cV%kR;GB)#oi;^PzeeA2n;HO)VWeU z_?ZlJdT$x8M{;Rb+))ZT{bmcbqwYgR(=H`>eZ`UHs%Vr5y~Fy%p;+k7;KqugXtj!K zsvZ7D%D~>(ncKUiNkZzIeWdPkM9lHJN$CdLuCQb)g|tCx!_YI#&@r)Vb?$|0O47HL zi>EE6$bv3bz3GEVURjt?YBJqfHsgQap zkd`u&o&W4wtTd4RE}_xzkHh_DX-2py#O9@rE$7O|uXM*0U%jlMvwO!Dh4-4|4m>PO z>g(sRmPfI6TX(OqjC)U@jC47pi{lIq2x5)#5K?(KTowYgn_Na_T#L=P$OBj~iBpGR(`$OOX z-2Q5mPVV)Ly=^ZF=2XtWrL0%1_tK~&Nys_n6B~)hpnQAc#;wR=fp1Bmo_NSn5lYp3 z)awQ|#9$0oKLQ$EFq;u?4?XtX4rmjQ_50novTdXBsRSb&XKizeCW4agbutP zR5!`J%wwbN{p7I^mu;Orn}d*plauPF!v4C*;@TSB0ZHT9v_q%Rn6*^X@Wsak%R8ov z*}#Kk*EjfT6b8uG_-Itd`MNUY6pUwN8*Hh5{DArBno@~ zQt+jWWn(M7MxW`$71ZC_@Q8X^4z1@uV|(T}A|@aIe0CK**?M^PP^G4n7(e`592r8n zEgcmuszh-O?peMsDnMktTNPw=rU238?T9u_O2#0Yy#0=Z2)c5$iDzn~Ro|(Mt>G3W zjjk_>zM}m&;L%Ryp?g_7<7W?7uNK?c#Er_2Evd4-s+AmCe%A<>1#CI=m@`P74s;{6 zb&UTe%n5k3!oQz-PZAq7$i|_L1TXJ^o|gLSZA7v!R5S?Wtk+S#bFEdvoUgD(yw{j- zzWOyZBlMu9MD;!#qFj&B`M{KK)F~sbnW~{En9}2Et|xR%a$;C5zxyW8J0&T!gR5Ra zJOhbOY|W&+lD{>Z!ss@)_bBp^2*WC5E#!!DgSKcy6cLMpf%cIg%bj}ZTsA27eYos8 zL9B9eN#T@>utzIGFWrHyi7BZy9MF2WAHO2F3osDM_1vbMPbMMXGxF_QdmCU$?XMqx ze80%Bq`_m8IYAm6REqbHrIeTlK!+0%#Rh6Q#xE^0LP@CiDr7f(b9B|(d%4Z|QdWGO z=e2;=`lygmc|!7SC7*z2%Y)R$)^ba|I}9HA1qpX&>NWP?Ny5cjNO4Hpx!h9n%=t=r i&99vl@bTe!ZEmnC?%$y+P1I$7gxp=WJ6AdeCHx2fDp;TZ literal 0 HcmV?d00001 diff --git a/assets/icons/text-channel.svg b/assets/icons/text-channel.svg new file mode 100644 index 00000000..fb328cb6 --- /dev/null +++ b/assets/icons/text-channel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/voice-channel.png b/assets/icons/voice-channel.png new file mode 100644 index 0000000000000000000000000000000000000000..311ce3c90a98f93277c39047607ecfd1b17aa09e GIT binary patch literal 4167 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 Uz#@;IwEF+w8Si0VZA&=(KcJhru>b%7 literal 0 HcmV?d00001 diff --git a/assets/icons/voice-channel.svg b/assets/icons/voice-channel.svg new file mode 100644 index 00000000..79f0cf72 --- /dev/null +++ b/assets/icons/voice-channel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index 0e52f5bf..628871d4 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -28,6 +28,7 @@ import { AvatarCmd } from "./commands/AvatarCmd"; import { CleanCmd } from "./commands/CleanCmd"; import { Message } from "eris"; import { InviteInfoCmd } from "./commands/InviteInfoCmd"; +import { ChannelInfoCmd } from "./commands/ChannelInfoCmd"; const defaultOptions: PluginOptions = { config: { @@ -38,6 +39,7 @@ const defaultOptions: PluginOptions = { can_info: false, can_server: false, can_invite: false, + can_channel: false, can_reload_guild: false, can_nickname: false, can_ping: false, @@ -62,6 +64,7 @@ const defaultOptions: PluginOptions = { can_info: true, can_server: true, can_invite: true, + can_channel: true, can_nickname: true, can_vcmove: true, can_help: true, @@ -112,6 +115,7 @@ export const UtilityPlugin = zeppelinPlugin()("utility", { AvatarCmd, CleanCmd, InviteInfoCmd, + ChannelInfoCmd, ], onLoad(pluginData) { diff --git a/backend/src/plugins/Utility/commands/ChannelInfoCmd.ts b/backend/src/plugins/Utility/commands/ChannelInfoCmd.ts new file mode 100644 index 00000000..c65ab41d --- /dev/null +++ b/backend/src/plugins/Utility/commands/ChannelInfoCmd.ts @@ -0,0 +1,25 @@ +import { utilityCmd } from "../types"; +import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { sendErrorMessage } from "../../../pluginUtils"; +import { getChannelInfoEmbed } from "../functions/getChannelInfoEmbed"; + +export const ChannelInfoCmd = utilityCmd({ + trigger: ["channel", "channelinfo"], + description: "Show information about a channel", + usage: "!channel 534722016549404673", + permission: "can_channel", + + signature: { + channel: ct.channelId({ required: false }), + }, + + async run({ message, args, pluginData }) { + const embed = await getChannelInfoEmbed(pluginData, args.channel); + if (!embed) { + sendErrorMessage(pluginData, message.channel, "Unknown channel"); + return; + } + + message.channel.createMessage({ embed }); + }, +}); diff --git a/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts b/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts new file mode 100644 index 00000000..6206dc5a --- /dev/null +++ b/backend/src/plugins/Utility/functions/getChannelInfoEmbed.ts @@ -0,0 +1,111 @@ +import { PluginData } from "knub"; +import { UtilityPluginType } from "../types"; +import { Constants, EmbedOptions } from "eris"; +import moment from "moment-timezone"; +import humanizeDuration from "humanize-duration"; +import { formatNumber, preEmbedPadding, trimLines } from "../../../utils"; + +const TEXT_CHANNEL_ICON = + "https://cdn.discordapp.com/attachments/740650744830623756/740656843545772062/text-channel.png"; +const VOICE_CHANNEL_ICON = + "https://cdn.discordapp.com/attachments/740650744830623756/740656845982662716/voice-channel.png"; +const ANNOUNCEMENT_CHANNEL_ICON = + "https://cdn.discordapp.com/attachments/740650744830623756/740656841687564348/announcement-channel.png"; + +export async function getChannelInfoEmbed( + pluginData: PluginData, + channelId: string, +): Promise { + const channel = pluginData.guild.channels.get(channelId); + if (!channel) { + return null; + } + + const embed: EmbedOptions = { + fields: [], + }; + + let icon; + if (channel.type === Constants.ChannelTypes.GUILD_VOICE) { + icon = VOICE_CHANNEL_ICON; + } else if (channel.type === Constants.ChannelTypes.GUILD_NEWS) { + icon = ANNOUNCEMENT_CHANNEL_ICON; + } else { + icon = TEXT_CHANNEL_ICON; + } + + const channelType = + { + [Constants.ChannelTypes.GUILD_TEXT]: "Text channel", + [Constants.ChannelTypes.GUILD_VOICE]: "Voice channel", + [Constants.ChannelTypes.GUILD_CATEGORY]: "Category", + [Constants.ChannelTypes.GUILD_NEWS]: "Announcement channel", + [Constants.ChannelTypes.GUILD_STORE]: "Store channel", + }[channel.type] || "Channel"; + + embed.author = { + name: `${channelType}: ${channel.name}`, + icon_url: icon, + }; + + let channelName; + if (channel.type === Constants.ChannelTypes.GUILD_VOICE || channel.type === Constants.ChannelTypes.GUILD_CATEGORY) { + channelName = channel.name; + } else { + channelName = `#${channel.name}`; + } + + const createdAt = moment(channel.createdAt, "x"); + const channelAge = humanizeDuration(Date.now() - channel.createdAt, { + largest: 2, + round: true, + }); + + const showMention = + channel.type !== Constants.ChannelTypes.GUILD_VOICE && channel.type !== Constants.ChannelTypes.GUILD_CATEGORY; + + embed.fields.push({ + name: preEmbedPadding + "Channel information", + value: trimLines(` + Name: **${channelName}** + ID: \`${channel.id}\` + Created: **${channelAge} ago** (\`${createdAt.format("MMM D, YYYY [at] H:mm [UTC]")}\`) + Type: **${channelType}** + ${showMention ? `Mention: <#${channel.id}>` : ""} + `), + }); + + if (channel.type === Constants.ChannelTypes.GUILD_VOICE) { + const voiceMembers = Array.from(channel.voiceMembers.values()); + const muted = voiceMembers.filter(vm => vm.voiceState.mute || vm.voiceState.selfMute); + const deafened = voiceMembers.filter(vm => vm.voiceState.deaf || vm.voiceState.selfDeaf); + + embed.fields.push({ + name: preEmbedPadding + "Voice information", + value: trimLines(` + Users on voice channel: **${formatNumber(voiceMembers.length)}** + Muted: **${formatNumber(muted.length)}** + Deafened: **${formatNumber(deafened.length)}** + `), + }); + } + + if (channel.type === Constants.ChannelTypes.GUILD_CATEGORY) { + const textChannels = pluginData.guild.channels.filter( + ch => ch.parentID === channel.id && ch.type !== Constants.ChannelTypes.GUILD_VOICE, + ); + const voiceChannels = pluginData.guild.channels.filter( + ch => ch.parentID === channel.id && ch.type === Constants.ChannelTypes.GUILD_VOICE, + ); + + embed.fields.push({ + name: preEmbedPadding + "Category information", + value: trimLines(` + Text channels: **${textChannels.length}** + Voice channels: **${voiceChannels.length}** + `), + }); + } + + return embed; +} diff --git a/backend/src/plugins/Utility/types.ts b/backend/src/plugins/Utility/types.ts index 868f917a..5efbadc3 100644 --- a/backend/src/plugins/Utility/types.ts +++ b/backend/src/plugins/Utility/types.ts @@ -14,6 +14,7 @@ export const ConfigSchema = t.type({ can_info: t.boolean, can_server: t.boolean, can_invite: t.boolean, + can_channel: t.boolean, can_reload_guild: t.boolean, can_nickname: t.boolean, can_ping: t.boolean,