/[sudobot]/trunk/src/commands/information/ProfileCommand.ts
ViewVC logotype

Diff of /trunk/src/commands/information/ProfileCommand.ts

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 64 by rakin, Mon Jul 29 17:28:27 2024 UTC revision 393 by rakin, Mon Jul 29 17:29:59 2024 UTC
# Line 1  Line 1 
1  import { ColorResolvable, CommandInteraction, GuildMember, Message, User } from 'discord.js';  /**
2    * This file is part of SudoBot.
3    *
4    * Copyright (C) 2021-2022 OSN Inc.
5    *
6    * SudoBot is free software; you can redistribute it and/or modify it
7    * under the terms of the GNU Affero General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10    *
11    * SudoBot is distributed in the hope that it will be useful, but
12    * WITHOUT ANY WARRANTY; without even the implied warranty of
13    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14    * GNU Affero General Public License for more details.
15    *
16    * You should have received a copy of the GNU Affero General Public License
17    * along with SudoBot. If not, see <https://www.gnu.org/licenses/>.
18    */
19    
20    import { CommandInteraction, GuildMember, Message, User, UserFlags } from 'discord.js';
21  import BaseCommand from '../../utils/structures/BaseCommand';  import BaseCommand from '../../utils/structures/BaseCommand';
22  import DiscordClient from '../../client/Client';  import DiscordClient from '../../client/Client';
23  import CommandOptions from '../../types/CommandOptions';  import CommandOptions from '../../types/CommandOptions';
24  import InteractionOptions from '../../types/InteractionOptions';  import InteractionOptions from '../../types/InteractionOptions';
25  import MessageEmbed from '../../client/MessageEmbed';  import MessageEmbed from '../../client/MessageEmbed';
 import e from 'express';  
 import getUser from '../../utils/getUser';  
26  import getMember from '../../utils/getMember';  import getMember from '../../utils/getMember';
27  import { timeSince } from '../../utils/util';  import { timeSince } from '../../utils/util';
28  import { roleMention } from '@discordjs/builders';  import { roleMention } from '@discordjs/builders';
29    
30    export const getUserBadges = (user: User) => {
31        const { FLAGS } = UserFlags;
32        
33        const badges = [];
34    
35        if (user.flags?.has(FLAGS.BUGHUNTER_LEVEL_1))
36            badges.push('Bughunter Level 1');
37        if (user.flags?.has(FLAGS.BUGHUNTER_LEVEL_2))
38            badges.push('Bughunter Level 2');
39        if (user.flags?.has(FLAGS.DISCORD_CERTIFIED_MODERATOR))
40            badges.push('Discord Certified Moderator');
41        if (user.flags?.has(FLAGS.DISCORD_EMPLOYEE))
42            badges.push('Discord Staff');
43        if (user.flags?.has(FLAGS.EARLY_SUPPORTER))
44            badges.push('Early Nitro Supporter');
45        if (user.flags?.has(FLAGS.EARLY_VERIFIED_BOT_DEVELOPER))
46            badges.push('Early Verified Bot Developer');
47        if (user.flags?.has(FLAGS.HOUSE_BALANCE))
48            badges.push('HypeSquad Balance');
49        if (user.flags?.has(FLAGS.HOUSE_BRILLIANCE))
50            badges.push('HypeSquad Brilliance');
51        if (user.flags?.has(FLAGS.HOUSE_BRAVERY))
52            badges.push('HypeSquad Bravery');
53        if (user.flags?.has(FLAGS.HYPESQUAD_EVENTS))
54            badges.push('HypeSquad Events');
55        if (user.flags?.has(FLAGS.PARTNERED_SERVER_OWNER))
56            badges.push('Partnered Server Owner');
57        if (user.flags?.has(FLAGS.BOT_HTTP_INTERACTIONS))
58            badges.push('Supports Interactions');
59        if (user.flags?.has(FLAGS.VERIFIED_BOT))
60            badges.push('Verified Bot');
61        
62        return badges.map(b => `🔵 ${b}`);
63    };
64    
65  export default class ProfileCommand extends BaseCommand {  export default class ProfileCommand extends BaseCommand {
66      supportsInteractions: boolean = true;      supportsInteractions: boolean = true;
67    
# Line 69  export default class ProfileCommand exte Line 121  export default class ProfileCommand exte
121          };              };    
122    
123          const statusText = '' + ((user?.presence?.clientStatus?.desktop ? 'Desktop (' + status(user?.presence?.clientStatus?.desktop) + ')\n' : '') + (user?.presence?.clientStatus?.web ? 'Web (' + status(user?.presence?.clientStatus?.web) + ')\n' : '') + (user?.presence?.clientStatus?.mobile ? 'Mobile (' + status(user?.presence?.clientStatus?.mobile) + ')' : ''));          const statusText = '' + ((user?.presence?.clientStatus?.desktop ? 'Desktop (' + status(user?.presence?.clientStatus?.desktop) + ')\n' : '') + (user?.presence?.clientStatus?.web ? 'Web (' + status(user?.presence?.clientStatus?.web) + ')\n' : '') + (user?.presence?.clientStatus?.mobile ? 'Mobile (' + status(user?.presence?.clientStatus?.mobile) + ')' : ''));
124          const state = user?.presence?.activities.find(a => a.type === 'CUSTOM')?.state;          // const state = user?.presence?.activities.find(a => a.type === 'CUSTOM')?.state;
125            let activities: string[] | string = [];
126    
127            if (user?.presence) {
128                for (const a of user?.presence?.activities.values()!) {
129                    console.log(a);
130                    
131                    if (a.type === 'CUSTOM') {
132                        activities.push(`${a.emoji ? `${a.emoji.toString()} ` : ''}${a.state}`);
133                    }
134                    else if (a.type === 'LISTENING') {
135                        if (a.name === 'Spotify') {
136                            activities.push(`:notes: Listening to **Spotify**: **${a.state?.replace(/\;/, ',')} - ${a.details}**`);
137                            continue;
138                        }
139    
140                        activities.push(`:musical_note: Listening to **${a.name}**`);
141                    }
142                    else if (a.type === 'COMPETING') {
143                        activities.push(`:fire: Competing **${a.name}**`);
144                    }
145                    else if (a.type === 'PLAYING') {
146                        activities.push(`:video_game: Playing **${a.name}**`);
147                    }
148                    else if (a.type === 'STREAMING') {
149                        activities.push(`:video_camera: Streaming **${a.name}**`);
150                    }
151                    else if (a.type === 'WATCHING') {
152                        activities.push(`:tv: Watching **${a.name}**`);
153                    }
154                }
155            }
156    
157            activities = activities.join('\n');
158    
159            const fields = [
160                {
161                    name: "Nickname",
162                    value: `${user!.nickname?.replace(/\*\<\>\@\_\~\|/g, '') ?? '*Nickname not set*'}`
163                },
164                {
165                    name: "Account Created",
166                    value: `${user!.user.createdAt.toLocaleDateString('en-US')} (${timeSince(user!.user.createdTimestamp)})`
167                },
168                {
169                    name: "Joined at",
170                    value: `${user!.joinedAt!.toLocaleDateString('en-US')} (${timeSince(user!.joinedTimestamp!)})`
171                },
172                {
173                    name: 'Active Devices',
174                    value: `${statusText === '' ? 'Offline/Invisible' : statusText}`
175                },
176                {
177                    name: 'Status',
178                    value: `${activities?.trim() === '' ? '*No status set*' : activities}`
179                },
180                {
181                    name: 'Roles',
182                    value: user?.roles.cache.filter(role => role.id !== msg.guild!.id).sort((role1, role2) => {
183                        return role2.position - role1.position;
184                    }).reduce((acc, value) => `${acc} ${roleMention(value.id)}`, '')!.trim()!
185                }
186            ];
187    
188            const badges = getUserBadges(user!.user);
189    
190            if (badges.length > 0) {
191                fields.push({
192                    name: 'Badges',
193                    value: badges.join("\n")
194                });
195            }
196    
197          await msg.reply({          await msg.reply({
198              embeds: [              embeds: [
# Line 79  export default class ProfileCommand exte Line 202  export default class ProfileCommand exte
202                      name: user?.user.tag!,                      name: user?.user.tag!,
203                      iconURL: user!.user.displayAvatarURL()                      iconURL: user!.user.displayAvatarURL()
204                  })                  })
205                  .setImage(user!.displayAvatarURL({                  .setThumbnail(user!.displayAvatarURL({
                     size: 4096  
                 }))  
                 .setURL(user!.displayAvatarURL({  
206                      size: 4096                      size: 4096
207                  }))                  }))
208                  .setFields([                  .setFields(fields)
209                      {                  .setFooter({
210                          name: "ID",                      text: `${user!.id} - ${user?.user.bot ? 'Bot' : 'User'}`
211                          value: `${user!.id}`                  })
                     },  
                     {  
                         name: "Nickname",  
                         value: `${user!.nickname?.replace(/\*\<\>\@\_\~\|/g, '') ?? '*Nickname not set*'}`  
                     },  
                     {  
                         name: "Account Created",  
                         value: `${user!.user.createdAt.toLocaleDateString('en-US')} (${timeSince(user!.user.createdTimestamp)})`  
                     },  
                     {  
                         name: "Joined at",  
                         value: `${user!.joinedAt!.toLocaleDateString('en-US')} (${timeSince(user!.joinedTimestamp!)})`  
                     },  
                     {  
                         name: 'Active Devices',  
                         value: `${statusText === '' ? 'Offline/Invisible' : statusText}`  
                     },  
                     {  
                         name: 'Custom Status',  
                         value: `${state ?? '*No custom status set*'}`  
                     },  
                     {  
                         name: 'Roles',  
                         value: user?.roles.cache.filter(role => role.id !== msg.guild!.id).reduce((acc, value) => `${acc} ${roleMention(value.id)}`, '')!.trim()!  
                     }  
                 ])  
212              ]              ]
213          });          });
214      }      }

Legend:
Removed from v.64  
changed lines
  Added in v.393

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26