1
- const { ActionRowBuilder , ButtonBuilder , ButtonStyle , EmbedBuilder } = require ( "discord.js" ) ;
1
+ const { EmbedBuilder , ChannelType , GuildVerificationLevel , GuildExplicitContentFilter , GuildNSFWLevel } = require ( "discord.js" ) ;
2
2
3
3
module . exports = {
4
- name : 'serverinfo' ,
5
- description : 'Get server info/stats.' ,
6
- aliases : [ 'server' , 'guild' , 'guildinfo' ] ,
7
- execute : async function ( message , client , args ) {
8
- const guild = ( client . config . developers . includes ( message . author . id ) && args && args . length ) ? client . guilds . cache . get ( args [ 0 ] ) : message . channel . guild ;
4
+ name : "server-info" ,
5
+ aliases : [ "serverinfo" , "guildinfo" , "guild" , "server" ] ,
6
+ async execute ( message , client , args ) {
9
7
10
- const owner = client . users . cache . get ( guild . ownerId ) ;
11
-
12
- let categories = guild . channels . cache . filter ( c => c . type === 4 ) . length ;
13
- let textChannels = guild . channels . cache . filter ( c => c . type === 0 ) . length ;
14
- let voiceChannels = guild . channels . cache . filter ( c => c . type === 2 ) . length ;
15
-
16
- const {
17
- members,
18
- emojis,
19
- roles,
20
- stickers
21
- } = guild ;
8
+ const { guild } = message ;
9
+ const { members, channels, emojis, roles, stickers } = guild ;
22
10
23
11
const sortedRoles = roles . cache . map ( role => role ) . slice ( 1 , roles . cache . size ) . sort ( ( a , b ) => b . position - a . position ) ;
24
12
const userRoles = sortedRoles . filter ( role => ! role . managed ) ;
@@ -42,23 +30,98 @@ module.exports = {
42
30
return result . length ;
43
31
}
44
32
45
- const embed = new EmbedBuilder ( )
46
- . setColor ( client . config . embedInfo )
47
- . setAuthor ( { name : guild . name , iconURL : guild . iconURL ( ) } )
48
- . setThumbnail ( guild . iconURL ( ) )
49
- . setTitle ( `${ client . user . username } Server Info ${ client . config . arrowEmoji } ` )
50
- . setTimestamp ( new Date ( guild . createdAt ) )
51
- . addFields ( { name : 'Owner' , value : `${ owner . tag } ` , inline : true } )
52
- . addFields ( { name : 'Members' , value : `${ guild . memberCount . toString ( ) } ` , inline : true } )
53
- . addFields ( { name : `Users (${ guild . memberCount } )` , value : [ `👨👩👧👦 **Members** ${ guild . memberCount - botCount } ` , `🤖 **Bots** ${ botCount } ` ] . join ( "\n" ) , inline : true } )
54
- . addFields ( { name : `User Roles (${ maxDisplayRoles ( userRoles ) } of ${ userRoles . length } )` , value : `${ userRoles . slice ( 0 , maxDisplayRoles ( userRoles ) ) . join ( " " ) || "None" } ` } )
55
- . addFields ( { name : `Managed Roles (${ maxDisplayRoles ( managedRoles ) } of ${ managedRoles . length } )` , value : `${ managedRoles . slice ( 0 , maxDisplayRoles ( managedRoles ) ) . join ( " " ) || "None" } ` } )
56
- . addFields ( { name : 'Category Channels' , value : categories ? categories . toString ( ) : '0' , inline : true } )
57
- . addFields ( { name : 'Text Channels' , value : textChannels ? textChannels . toString ( ) : '0' , inline : true } )
58
- . addFields ( { name : 'Voice Channels' , value : voiceChannels ? voiceChannels . toString ( ) : '0' , inline : true } )
59
- . addFields ( { name : 'Emojis' , value : emojis . cache . size ? emojis . cache . size . toString ( ) : '0' , inline : true } )
60
- . setFooter ( { text : `ID: ${ guild . id } ${ client . config . devBy } ` } )
33
+ const splitPascal = ( string , separator ) => string . split ( / (? = [ A - Z ] ) / ) . join ( separator ) ;
34
+ const toPascalCase = ( string , separator = false ) => {
35
+ const pascal = string . charAt ( 0 ) . toUpperCase ( ) + string . slice ( 1 ) . toLowerCase ( ) . replace ( / [ ^ a - z A - Z 0 - 9 ] + ( .) / g, ( match , chr ) => chr . toUpperCase ( ) ) ;
36
+ return separator ? splitPascal ( pascal , separator ) : pascal ;
37
+ } ;
38
+
39
+ const getChannelTypeSize = type => channels . cache . filter ( channel => type . includes ( channel . type ) ) . size ;
40
+
41
+ const totalChannels = getChannelTypeSize ( [
42
+ ChannelType . GuildText ,
43
+ ChannelType . GuildNews ,
44
+ ChannelType . GuildVoice ,
45
+ ChannelType . GuildStageVoice ,
46
+ ChannelType . GuildForum ,
47
+ ChannelType . GuildPublicThread ,
48
+ ChannelType . GuildPrivateThread ,
49
+ ChannelType . GuildNewsThread ,
50
+ ChannelType . GuildCategory
51
+ ] ) ;
61
52
62
- message . channel . send ( { embeds : [ embed ] } ) ;
53
+ message . channel . send ( { embeds : [
54
+ new EmbedBuilder ( )
55
+ . setAuthor ( { name : `Server Info Command ${ client . config . devBy } ` } )
56
+ . setColor ( members . me . roles . highest . hexColor )
57
+ . setTitle ( `${ client . user . username } Server Info ${ client . config . arrowEmoji } ` )
58
+ . setFooter ( { text : `${ guild . name } | ${ guild . id } ` , iconURL : guild . iconURL ( ) } )
59
+ . setThumbnail ( guild . iconURL ( { size : 1024 } ) )
60
+ . setImage ( guild . bannerURL ( { size : 1024 } ) )
61
+ . addFields (
62
+ { name : "Description" , value : `📝 ${ guild . description || "None" } ` } ,
63
+ {
64
+ name : "General" ,
65
+ value : [
66
+ `📜 **Created** <t:${ parseInt ( guild . createdTimestamp / 1000 ) } :R>` ,
67
+ `💳 **ID** ${ guild . id } ` ,
68
+ `👑 **Owner** <@${ guild . ownerId } >` ,
69
+ `🌍 **Language** ${ new Intl . DisplayNames ( [ "en" ] , { type : "language" } ) . of ( guild . preferredLocale ) } ` ,
70
+ `💻 **Vanity URL** ${ guild . vanityURLCode || "None" } ` ,
71
+ ] . join ( "\n" )
72
+ } ,
73
+ { name : "Features" , value : guild . features ?. map ( feature => `- ${ toPascalCase ( feature , " " ) } ` ) ?. join ( "\n" ) || "None" , inline : true } ,
74
+ {
75
+ name : "Security" ,
76
+ value : [
77
+ `👀 **Explicit Filter** ${ splitPascal ( GuildExplicitContentFilter [ guild . explicitContentFilter ] , " " ) } ` ,
78
+ `🔞 **NSFW Level** ${ splitPascal ( GuildNSFWLevel [ guild . nsfwLevel ] , " " ) } ` ,
79
+ `🔒 **Verification Level** ${ splitPascal ( GuildVerificationLevel [ guild . verificationLevel ] , " " ) } `
80
+ ] . join ( "\n" ) ,
81
+ inline : true
82
+ } ,
83
+ {
84
+ name : `Users (${ guild . memberCount } )` ,
85
+ value : [
86
+ `👨👩👧👦 **Members** ${ guild . memberCount - botCount } ` ,
87
+ `🤖 **Bots** ${ botCount } `
88
+ ] . join ( "\n" ) ,
89
+ inline : true
90
+ } ,
91
+ { name : `User Roles (${ maxDisplayRoles ( userRoles ) } of ${ userRoles . length } )` , value : `${ userRoles . slice ( 0 , maxDisplayRoles ( userRoles ) ) . join ( " " ) || "None" } ` } ,
92
+ { name : `Managed Roles (${ maxDisplayRoles ( managedRoles ) } of ${ managedRoles . length } )` , value : `${ managedRoles . slice ( 0 , maxDisplayRoles ( managedRoles ) ) . join ( " " ) || "None" } ` } ,
93
+ {
94
+ name : `Channels, Threads & Categories (${ totalChannels } )` ,
95
+ value : [
96
+ `💬 **Text** ${ getChannelTypeSize ( [ ChannelType . GuildText , ChannelType . GuildForum , ChannelType . GuildNews ] ) } ` ,
97
+ `🔊 **Voice** ${ getChannelTypeSize ( [ ChannelType . GuildVoice , ChannelType . GuildStageVoice ] ) } ` ,
98
+ `🧵 **Threads** ${ getChannelTypeSize ( [ ChannelType . GuildPublicThread , ChannelType . GuildPrivateThread , ChannelType . GuildNewsThread ] ) } ` ,
99
+ `📑 **Categories** ${ getChannelTypeSize ( [ ChannelType . GuildCategory ] ) } `
100
+ ] . join ( "\n" ) ,
101
+ inline : true
102
+ } ,
103
+ {
104
+ name : `Emojis & Stickers (${ emojis . cache . size + stickers . cache . size } )` ,
105
+ value : [
106
+ `📺 **Animated** ${ emojis . cache . filter ( emoji => emoji . animated ) . size } ` ,
107
+ `🗿 **Static** ${ emojis . cache . filter ( emoji => ! emoji . animated ) . size } ` ,
108
+ `🏷 **Stickers** ${ stickers . cache . size } `
109
+ ] . join ( "\n" ) ,
110
+ inline : true
111
+ } ,
112
+ {
113
+ name : "Nitro" ,
114
+ value : [
115
+ `📈 **Tier** ${ guild . premiumTier || "None" } ` ,
116
+ `💪🏻 **Boosts** ${ guild . premiumSubscriptionCount } ` ,
117
+ `💎 **Boosters** ${ guild . members . cache . filter ( member => member . roles . premiumSubscriberRole ) . size } ` ,
118
+ `🏋🏻♀️ **Total Boosters** ${ guild . members . cache . filter ( member => member . premiumSince ) . size } `
119
+ ] . join ( "\n" ) ,
120
+ inline : true
121
+ } ,
122
+ { name : "Banner" , value : guild . bannerURL ( ) ? "** **" : "None" }
123
+ )
124
+ . setTimestamp ( )
125
+ ] , ephemeral : false } ) ;
63
126
}
64
127
}
0 commit comments