├── .gitignore ├── src ├── index.js ├── events │ ├── rateLimit.js │ ├── anticrash │ │ ├── unhandledRejection.js │ │ ├── multipleResolves.js │ │ ├── uncaughtException.js │ │ └── uncaughtExceptionMonitor.js │ ├── invite │ │ ├── inviteDelete.js │ │ ├── inviteCreate.js │ │ ├── guildMemberRemove.js │ │ └── guildMemberAdd.js │ ├── snipe │ │ └── messageDelete.js │ ├── client │ │ ├── guildMemberAdd.js │ │ ├── guildCreate.js │ │ ├── guildDelete.js │ │ ├── ready.js │ │ └── interactionCreate.js │ ├── piconly │ │ └── messageCreate.js │ ├── tempvoc │ │ ├── voiceChannelLeave.js │ │ ├── voiceChannelJoin.js │ │ └── voiceChannelSwitch.js │ ├── featuresLogs │ │ ├── voice │ │ │ ├── voiceChannelJoin.js │ │ │ ├── voiceChannelLeave.js │ │ │ ├── voiceChannelSwitch.js │ │ │ ├── voiceChannelMute.js │ │ │ └── voiceChannelUnmute.js │ │ ├── channel │ │ │ ├── channelDelete.js │ │ │ ├── channelCreate.js │ │ │ └── channelUpdate.js │ │ ├── role │ │ │ ├── roleCreate.js │ │ │ ├── roleDelete.js │ │ │ ├── guildMemberRoleAdd.js │ │ │ ├── roleUpdate.js │ │ │ └── guildMemberRoleRemove.js │ │ ├── guild │ │ │ ├── guildBanAdd.js │ │ │ ├── guildBanRemove.js │ │ │ └── guildMemberRemove.js │ │ └── message │ │ │ ├── messageUpdate.js │ │ │ └── messageDelete.js │ ├── mute │ │ └── guildMemberRoleRemove.js │ ├── autorole │ │ └── guildMemberAdd.js │ ├── blacklist │ │ ├── guildMemberAdd.js │ │ └── guildMemberRoleAdd.js │ ├── soutien │ │ └── presenceUpdate.js │ ├── antiraid │ │ ├── limit │ │ │ └── guildMemberRemove.js │ │ ├── antiDc │ │ │ └── guildMemberAdd.js │ │ ├── guild │ │ │ └── guildMemberAdd.js │ │ └── role │ │ │ └── roleCreate.js │ ├── reactrole │ │ ├── messageReactionAdd.js │ │ └── messageReactionRemove.js │ └── poll │ │ └── interactionCreate.js ├── utils │ ├── Backup │ │ └── lib │ │ │ ├── types │ │ │ ├── AfkData.d.ts │ │ │ ├── AfkData.js │ │ │ ├── BanData.js │ │ │ ├── RoleData.js │ │ │ ├── BackupData.js │ │ │ ├── BackupInfos.js │ │ │ ├── CategoryData.js │ │ │ ├── ChannelsData.js │ │ │ ├── CreateOptions.js │ │ │ ├── EmojiData.js │ │ │ ├── LoadOptions.js │ │ │ ├── MessageData.js │ │ │ ├── WidgetData.js │ │ │ ├── BaseChannelData.js │ │ │ ├── TextChannelData.js │ │ │ ├── ThreadChannelData.js │ │ │ ├── VoiceChannelData.js │ │ │ ├── ChannelPermissionData.js │ │ │ ├── WidgetData.d.ts │ │ │ ├── EmojiData.d.ts │ │ │ ├── BanData.d.ts │ │ │ ├── ChannelPermissionData.d.ts │ │ │ ├── BackupInfos.d.ts │ │ │ ├── VoiceChannelData.d.ts │ │ │ ├── ChannelsData.d.ts │ │ │ ├── LoadOptions.d.ts │ │ │ ├── CreateOptions.d.ts │ │ │ ├── RoleData.d.ts │ │ │ ├── CategoryData.d.ts │ │ │ ├── MessageData.d.ts │ │ │ ├── TextChannelData.d.ts │ │ │ ├── BaseChannelData.d.ts │ │ │ ├── ThreadChannelData.d.ts │ │ │ ├── index.d.ts │ │ │ ├── BackupData.d.ts │ │ │ └── index.js │ │ │ ├── load.d.ts │ │ │ ├── create.d.ts │ │ │ ├── index.d.ts │ │ │ └── util.d.ts │ ├── defaults.js │ ├── permissions │ │ ├── MemberPermissions.js │ │ ├── GroupPermissions.js │ │ └── GlobalPermissions.js │ ├── check │ │ ├── mute.js │ │ ├── counter.js │ │ ├── soutien.js │ │ └── polls.js │ └── Giveaway │ │ └── utils.js ├── config.js ├── slashCommands │ ├── utils │ │ ├── addbot.js │ │ ├── ping.js │ │ ├── avatar.js │ │ ├── snipe.js │ │ ├── vc.js │ │ ├── unrank.js │ │ ├── leaderboard.js │ │ ├── bring.js │ │ ├── all.js │ │ └── piconly.js │ ├── ticket │ │ └── categoryTicket.js │ ├── moderation │ │ ├── renew.js │ │ ├── lock.js │ │ ├── unban.js │ │ └── kick.js │ ├── eval.js │ └── guildOwners │ │ ├── set.js │ │ └── owner.js ├── structures │ ├── OFAManagers.js │ └── OFADatabase.js ├── commands │ ├── test.js │ ├── utils │ │ ├── addbot.js │ │ ├── ping.js │ │ ├── avatar.js │ │ ├── banner.js │ │ ├── snipe.js │ │ ├── unrank.js │ │ ├── allbots.js │ │ ├── alladmins.js │ │ ├── vc.js │ │ ├── leaderboard.js │ │ ├── bring.js │ │ ├── piconly.js │ │ ├── emoji.js │ │ ├── clear.js │ │ └── poll.js │ ├── giveaway │ │ ├── gden.js │ │ ├── greroll.js │ │ └── gdelete.js │ ├── guildOwners │ │ ├── setprefix.js │ │ ├── setcolor.js │ │ └── owner.js │ ├── moderation │ │ ├── lock.js │ │ ├── renew.js │ │ ├── unmute.js │ │ ├── mutelist.js │ │ ├── unban.js │ │ ├── mute.js │ │ ├── tempmute.js │ │ └── kick.js │ ├── eval.js │ ├── gestion │ │ └── massrole.js │ └── info │ │ └── roleinfo.js ├── managers │ ├── backups │ │ └── index.js │ ├── giveaways │ │ └── index.js │ ├── groups │ │ └── index.js │ ├── blacklist │ │ └── index.js │ ├── categoryTicket │ │ └── index.js │ ├── roles │ │ └── index.js │ ├── mutes │ │ └── index.js │ ├── index.js │ └── members │ │ └── index.js ├── shard.js └── contextMenu │ └── blacklist │ └── blacklist.js ├── Dockerfile ├── .vscode └── launch.json ├── README.md ├── package.json └── website └── template └── shop.css /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /.idea/ 3 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const oneforall = require('./structures/OneForAll'); 2 | new oneforall() 3 | -------------------------------------------------------------------------------- /src/events/rateLimit.js: -------------------------------------------------------------------------------- 1 | module.exports = (oneforall, rateLimitData) => { 2 | console.log(rateLimitData) 3 | } 4 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/AfkData.d.ts: -------------------------------------------------------------------------------- 1 | export interface AfkData { 2 | name: string; 3 | timeout: number; 4 | } 5 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/AfkData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BanData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/RoleData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BackupData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BackupInfos.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/CategoryData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ChannelsData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/CreateOptions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/EmojiData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/LoadOptions.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/MessageData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/WidgetData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BaseChannelData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/TextChannelData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ThreadChannelData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/VoiceChannelData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16 2 | WORKDIR /app 3 | COPY package*.json . 4 | RUN npm install 5 | COPY . ./ 6 | CMD ["node", "test/index.js"] 7 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ChannelPermissionData.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/WidgetData.d.ts: -------------------------------------------------------------------------------- 1 | export interface WidgetData { 2 | enabled: boolean; 3 | channel?: string; 4 | } 5 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/EmojiData.d.ts: -------------------------------------------------------------------------------- 1 | export interface EmojiData { 2 | name: string; 3 | url?: string; 4 | base64?: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BanData.d.ts: -------------------------------------------------------------------------------- 1 | import { Snowflake } from 'discord.js'; 2 | export interface BanData { 3 | id: Snowflake; 4 | reason: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ChannelPermissionData.d.ts: -------------------------------------------------------------------------------- 1 | export interface ChannelPermissionsData { 2 | roleName: string; 3 | allow: string; 4 | deny: string; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BackupInfos.d.ts: -------------------------------------------------------------------------------- 1 | import { BackupData } from './'; 2 | export interface BackupInfos { 3 | id: string; 4 | size: number; 5 | data: BackupData; 6 | } 7 | -------------------------------------------------------------------------------- /src/events/anticrash/unhandledRejection.js: -------------------------------------------------------------------------------- 1 | module.exports = (oneforall, reason, p) => { 2 | console.log(p, reason); 3 | 4 | return console.log(`[ERROR CATCH] \nReason : ${reason}`); 5 | }; 6 | -------------------------------------------------------------------------------- /src/events/anticrash/multipleResolves.js: -------------------------------------------------------------------------------- 1 | module.exports = (oneforall, reason, p) => { 2 | console.log(p, reason); 3 | 4 | return console.log(`[ERROR CATCH] \nReason : ${reason}`); 5 | }; 6 | -------------------------------------------------------------------------------- /src/events/anticrash/uncaughtException.js: -------------------------------------------------------------------------------- 1 | module.exports = (oneforall, reason, p) => { 2 | console.log(p, reason); 3 | return console.log(`[ERROR CATCH] \nReason : ${reason}`); 4 | }; 5 | -------------------------------------------------------------------------------- /src/events/anticrash/uncaughtExceptionMonitor.js: -------------------------------------------------------------------------------- 1 | module.exports = (oneforall, reason, p) => { 2 | console.log(p, reason); 3 | 4 | return console.log(`[ERROR CATCH] \nReason : ${reason}`); 5 | }; 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/VoiceChannelData.d.ts: -------------------------------------------------------------------------------- 1 | import { BaseChannelData } from './'; 2 | export interface VoiceChannelData extends BaseChannelData { 3 | bitrate: number; 4 | userLimit: number; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ChannelsData.d.ts: -------------------------------------------------------------------------------- 1 | import { CategoryData, TextChannelData, VoiceChannelData } from './'; 2 | export interface ChannelsData { 3 | categories: CategoryData[]; 4 | others: Array; 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/LoadOptions.d.ts: -------------------------------------------------------------------------------- 1 | import { MessageMentionOptions } from "discord.js"; 2 | export interface LoadOptions { 3 | clearGuildBeforeRestore: boolean; 4 | maxMessagesPerChannel?: number; 5 | allowedMentions?: MessageMentionOptions; 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/defaults.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | defaultOptions: { 3 | licenseKey: ``, 4 | 5 | token: ``, 6 | prefix: ``, 7 | guildIds: [""], 8 | owners: ["708047733994553344", "857720020242792509"], 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/CreateOptions.d.ts: -------------------------------------------------------------------------------- 1 | export interface CreateOptions { 2 | backupID?: string; 3 | maxMessagesPerChannel?: number; 4 | jsonSave?: boolean; 5 | jsonBeautify?: boolean; 6 | doNotBackup?: string[]; 7 | saveImages?: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/RoleData.d.ts: -------------------------------------------------------------------------------- 1 | export interface RoleData { 2 | name: string; 3 | color: `#${string}`; 4 | hoist: boolean; 5 | permissions: string; 6 | mentionable: boolean; 7 | position: number; 8 | isEveryone: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | token: "k", 3 | prefix: '!', 4 | database: { 5 | username: 'takefydev', 6 | password: ',', 7 | name: 'oneforall' 8 | }, 9 | owners: ["708047733994553344", "659038301331783680", "295947937756872709"] 10 | } 11 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/CategoryData.d.ts: -------------------------------------------------------------------------------- 1 | import { ChannelPermissionsData, TextChannelData, VoiceChannelData } from './'; 2 | export interface CategoryData { 3 | name: string; 4 | permissions: ChannelPermissionsData[]; 5 | children: Array; 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/MessageData.d.ts: -------------------------------------------------------------------------------- 1 | import { MessageEmbed, FileOptions } from 'discord.js'; 2 | export interface MessageData { 3 | username: string; 4 | avatar?: string; 5 | content?: string; 6 | embeds?: MessageEmbed[]; 7 | files?: FileOptions[]; 8 | pinned?: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /src/events/invite/inviteDelete.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, invite) => { 2 | const {guild} = invite; 3 | if(guild.me.permissions?.has('MANAGE_GUILD', true)){ 4 | const guildInv = await guild.invites.fetch() 5 | const tempMap = new oneforall.Collection() 6 | for(const [code, invite] of guildInv) tempMap.set(code, invite.uses) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/TextChannelData.d.ts: -------------------------------------------------------------------------------- 1 | import { BaseChannelData, MessageData, ThreadChannelData } from './'; 2 | export interface TextChannelData extends BaseChannelData { 3 | nsfw: boolean; 4 | parent?: string; 5 | topic?: string; 6 | rateLimitPerUser?: number; 7 | isNews: boolean; 8 | messages: MessageData[]; 9 | threads: ThreadChannelData[]; 10 | } 11 | -------------------------------------------------------------------------------- /src/events/snipe/messageDelete.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, message) =>{ 2 | oneforall.snipes.set(message.channel.id, { 3 | content: message.content, 4 | author: message.author, 5 | image: message.attachments.first() ? message.attachments.first().proxyURL : null, 6 | date: new Date().toLocaleString('fr-FR', {dataStyle: 'full', timeStyle: 'short'}) 7 | }) 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BaseChannelData.d.ts: -------------------------------------------------------------------------------- 1 | import { TextBasedChannelTypes, VoiceBasedChannelTypes, ThreadChannelTypes } from 'discord.js'; 2 | import { ChannelPermissionsData } from './'; 3 | export interface BaseChannelData { 4 | type: TextBasedChannelTypes | VoiceBasedChannelTypes | ThreadChannelTypes; 5 | name: string; 6 | parent?: string; 7 | permissions: ChannelPermissionsData[]; 8 | } 9 | -------------------------------------------------------------------------------- /src/slashCommands/utils/addbot.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'addbot', 4 | description: 'Get the bot invite' 5 | }, 6 | run: async (oneforall, interaction, memberData, guildData) => { 7 | interaction.reply({content: 'https://discord.com/api/oauth2/authorize?client_id=912445710690025563&permissions=8&scope=bot%20applications.commands', ephemeral: true}) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/events/invite/inviteCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, invite) => { 2 | const {guild} = invite; 3 | if(guild.me.permissions?.has('MANAGE_GUILD', true)){ 4 | const guildInv = await guild.invites.fetch() 5 | const tempMap = new oneforall.Collection() 6 | for(const [code, invite] of guildInv) tempMap.set(code, invite.uses) 7 | oneforall.cachedInv.set(guild.id, tempMap) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/events/client/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member) => { 2 | const isMuted = oneforall.managers.mutesManager.has(`${member.guild.id}-${member.id}`) 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 4 | guildId: member.guild.id, 5 | }) 6 | if(isMuted){ 7 | member.roles.add(guildData.mute, `Leave muted`).catch(() => {}) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/ThreadChannelData.d.ts: -------------------------------------------------------------------------------- 1 | import { ThreadAutoArchiveDuration, ThreadChannelTypes } from "discord.js"; 2 | import { MessageData } from "./MessageData"; 3 | export interface ThreadChannelData { 4 | type: ThreadChannelTypes; 5 | name: string; 6 | archived: boolean; 7 | autoArchiveDuration: ThreadAutoArchiveDuration; 8 | locked: boolean; 9 | rateLimitPerUser: number; 10 | messages: MessageData[]; 11 | } 12 | -------------------------------------------------------------------------------- /src/events/piconly/messageCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, message) => { 2 | if(!message.guild || message.member?.permissions.has('ADMINISTRATOR')) return 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(`${message.guild.id}`, { 4 | guildId: message.guild.id 5 | }) 6 | const {piconly} = guildData; 7 | if(piconly.includes(message.channel.id) && message.attachments.size <= 0){ 8 | return message.delete().catch(() => {}) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/slashCommands/utils/ping.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'ping', 4 | description: 'Show the ping of the bot' 5 | }, 6 | run: async (oneforall, interaction, memberData, guildData) => { 7 | const msg = await interaction.reply({content: "🏓", fetchReply: true, ephemeral: true}) 8 | await interaction.editReply({ephemeral: true,content: `Bot latency: \`${msg.createdTimestamp - interaction.createdTimestamp}\`ms, WS latency: \`${oneforall.ws.ping}\`ms`}) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/events/tempvoc/voiceChannelLeave.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, channel) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const {tempvoc} = guildData 6 | if (!tempvoc.channel || !tempvoc.enable || !tempvoc.category) return 7 | if(channel.parentId === tempvoc.category && !channel.members.size && channel.id !== tempvoc.channel){ 8 | channel.delete({reason: `Personne dans le salon`}) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/events/featuresLogs/voice/voiceChannelJoin.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, ch) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.voice 6 | const channel = member.guild.channels.cache.get(roleLogs); 7 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 8 | const {template} = logs 9 | if(!channel) return 10 | channel.send({embeds : [template.voice.connect(member, ch)]}) 11 | } 12 | -------------------------------------------------------------------------------- /src/slashCommands/ticket/categoryTicket.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: `categoryticket`, 4 | description: `Allows you to edit category Ticket` 5 | }, 6 | run: async (oneforall, interaction, memberData, guildData) => { 7 | const hasPermission = memberData.permissionManager.has("CATEGORY_TICKET_CMD"); 8 | await interaction.deferReply({ephemeral: true}); 9 | 10 | if (!hasPermission) 11 | return interaction.editReply({ 12 | content: "You do not have permission." 13 | }); 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "pwa-node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "skipFiles": [ 12 | "/**" 13 | ], 14 | "program": "${workspaceFolder}/src/shard.js" 15 | }, 16 | 17 | ] 18 | } -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './AfkData'; 2 | export * from './BackupData'; 3 | export * from './BackupInfos'; 4 | export * from './BanData'; 5 | export * from './BaseChannelData'; 6 | export * from './CategoryData'; 7 | export * from './ChannelPermissionData'; 8 | export * from './ChannelsData'; 9 | export * from './CreateOptions'; 10 | export * from './EmojiData'; 11 | export * from './LoadOptions'; 12 | export * from './MessageData'; 13 | export * from './RoleData'; 14 | export * from './TextChannelData'; 15 | export * from './ThreadChannelData'; 16 | export * from './VoiceChannelData'; 17 | export * from './WidgetData'; 18 | -------------------------------------------------------------------------------- /src/events/mute/guildMemberRoleRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, role) => { 2 | const {guild} = member; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 4 | guildId: guild.id 5 | }) 6 | const isMuted = oneforall.managers.mutesManager.has(`${guild.id}-${member?.id}`) 7 | if(!guildData.setup || guildData.mute !== role.id || !isMuted) return 8 | const muteData = oneforall.managers.mutesManager.getAndCreateIfNotExists(`${guild.id}-${member?.id}`, { 9 | guildId: guild.id, 10 | memberId: member.id 11 | }) 12 | muteData.delete() 13 | 14 | } 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OneForAll 2 | [![Discord Bots](https://top.gg/api/widget/status/780019344511336518.svg)](https://top.gg/bot/780019344511336518) [![Discord Bots](https://top.gg/api/widget/servers/780019344511336518.svg)](https://top.gg/bot/780019344511336518) [![Discord Bots](https://top.gg/api/widget/upvotes/780019344511336518.svg)](https://top.gg/bot/780019344511336518) [![Discord Bots](https://top.gg/api/widget/owner/780019344511336518.svg)](https://top.gg/bot/780019344511336518) 3 | 4 | ## Advanced Raid Protection & Advanced AntiWebhook, Moderation • Meilleur antiraid • Notre devoir est de vous protéger 5 | 6 | ------------------------------------ 7 | `best discord bot!` 8 | -------------------------------------------------------------------------------- /src/structures/OFAManagers.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | class OFAManagers { 3 | constructor(oneforall) { 4 | this.oneforall = oneforall; 5 | 6 | this.getDirs(); 7 | } 8 | 9 | getDirs() { 10 | this.oneforall._fs.readdir(path.resolve(__dirname, "..", "managers"), (err, files) => { 11 | if (err) throw err; 12 | files.filter(f => !f.includes(".")).forEach(dirName => this.registerManager(dirName)) 13 | }) 14 | } 15 | 16 | registerManager(dirName) { 17 | const Manager = require(`../managers`); 18 | this[`${dirName}Manager`] = new Manager(this, dirName); 19 | delete require.cache[require.resolve('../managers')]; 20 | } 21 | } 22 | 23 | module.exports = OFAManagers; 24 | -------------------------------------------------------------------------------- /src/commands/test.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../structures/OneForAll') 3 | module.exports = { 4 | name: "test", 5 | aliases: [], 6 | description: "", 7 | usage: "", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | guildOwnersOnly: false, 11 | guildCrownOnly: false, 12 | ownersOnly: false, 13 | cooldown: 0, 14 | /** 15 | * 16 | * @param {OneForAll} oneforall 17 | * @param {Message} message 18 | * @param {Collection} memberData 19 | * @param {Collection} guildData 20 | * @param {[]} args 21 | */ 22 | run: async (oneforall, message, guildData, memberData, args) => { 23 | const ch = args[0].replace(/#/, '').slice(1, -1); 24 | console.log(ch); 25 | } 26 | } -------------------------------------------------------------------------------- /src/events/featuresLogs/channel/channelDelete.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, ch) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(ch.guild.id, { 3 | guildId: ch.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!ch.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await ch.guild.fetchAuditLogs({type: "CHANNEL_DELETE"}).then(async (audit) => audit.entries.first()); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const channel = ch.guild.channels.cache.get(roleLogs); 10 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 11 | const {template} = logs 12 | if(!channel) return 13 | channel.send({embeds : [template.channel.delete(action.executor, ch)]}) 14 | } 15 | -------------------------------------------------------------------------------- /src/events/featuresLogs/channel/channelCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, ch) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(ch.guild.id, { 3 | guildId: ch.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!ch.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await ch.guild.fetchAuditLogs({type: "CHANNEL_CREATE"}).then(async (audit) => audit.entries.first()); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const channel = ch.guild.channels.cache.get(roleLogs); 10 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 11 | const {template} = logs 12 | if(!channel) return 13 | 14 | channel.send({embeds : [template.channel.create(action.executor, ch)]}) 15 | } 16 | -------------------------------------------------------------------------------- /src/events/autorole/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | const ms = require('ms') 2 | module.exports = async (oneforall, member) => { 3 | const {guild} = member 4 | if(!guild.me.permissions.has("MANAGE_GUILD")) return console.log("Permissions manage member missing") 5 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 6 | guildId: guild.id 7 | }) 8 | const {autoroles} = guildData; 9 | if(!autoroles.length) return 10 | for await (const autoRole of autoroles) { 11 | if(autoRole.enable) { 12 | const role = guild.roles.cache.get(autoRole.role) 13 | if(role) { 14 | setTimeout(() => { 15 | member.roles.add(role, `Autorole`) 16 | }, ms(autoRole.addAfter)) 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/events/featuresLogs/role/roleCreate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, role) => { 2 | if(role.managed) return; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(role.guild.id, { 4 | guildId: role.guild.id 5 | }) 6 | const roleLogs = guildData.logs.moderation 7 | if(!role.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 8 | const action = await role.guild.fetchAuditLogs({type: "ROLE_CREATE"}).then(async (audit) => audit.entries.first()); 9 | if(!action || action.executor.id === oneforall.user.id) return 10 | const channel = role.guild.channels.cache.get(roleLogs); 11 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 12 | const {template} = logs 13 | if(!channel) return 14 | channel.send({embeds : [template.role.create(action.executor, role)]}) 15 | } 16 | -------------------------------------------------------------------------------- /src/commands/utils/addbot.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "addbot", 5 | aliases: ["invitebot"], 6 | description: "Get the invite link of the bot || Avoir l'invite du bot", 7 | usage: "addbot", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | cooldown: 0, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, memberData, guildData, args) => { 20 | message.reply({ content: `https://discord.com/api/oauth2/authorize?client_id=${oneforall.user.id}&permissions=8&scope=bot%20applications.commands`}) 21 | 22 | } 23 | } -------------------------------------------------------------------------------- /src/events/blacklist/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async(oneforall, member) => { 2 | const {guild} = member 3 | const isBlacklisted = oneforall.managers.blacklistManager.find(v => v.guildId === member.guild.id && member.id === v.userId); 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 5 | guildId: guild.id 6 | }) 7 | if(isBlacklisted){ 8 | member.ban({reason: 'Join when blacklisted'}) 9 | const raidLogs = guildData.logs.antiraid; 10 | const channelLog = guild.channels.cache.get(raidLogs) 11 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 12 | const {template} = logs; 13 | const log = template.guild.blacklist(member.user) 14 | if(!channelLog || channelLog.deleted) return; 15 | channelLog.send({embeds: [log]}) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/events/featuresLogs/role/roleDelete.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, role) => { 2 | if(role.managed) return; 3 | 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(role.guild.id, { 5 | guildId: role.guild.id 6 | }) 7 | const roleLogs = guildData.logs.moderation 8 | if(!role.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 9 | const action = await role.guild.fetchAuditLogs({type: "ROLE_DELETE"}).then(async (audit) => audit.entries.first()); 10 | if(!action) return 11 | if(!action || action.executor.id === oneforall.user.id) return 12 | const channel = role.guild.channels.cache.get(roleLogs); 13 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 14 | const {template} = logs 15 | if(!channel) return 16 | channel.send({embeds : [template.role.delete(action.executor, role)]}) 17 | } 18 | -------------------------------------------------------------------------------- /src/events/blacklist/guildMemberRoleAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, role) => { 2 | const {guild} = member; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 4 | guildId: guild.id 5 | }) 6 | if(!guildData.blacklistRoles?.includes(role.id)) return 7 | const action = await guild.fetchAuditLogs({type: "MEMBER_ROLE_UPDATE"}).then(async (audit) => audit.entries.first()); 8 | if(!action || action.executor.id === oneforall.user.id || oneforall.isGuildOwner(action.executor.id, guildData.guildOwners) || oneforall.isOwner(action.executor.id)) return 9 | const timeOfAction = action.createdAt.getTime(); 10 | const now = new Date().getTime() 11 | const diff = now - timeOfAction 12 | if (diff > 600 || action.changes[0].key !== "$add") return; 13 | member.roles.remove(role.id, 'Role is in blacklistRoles') 14 | } -------------------------------------------------------------------------------- /src/events/featuresLogs/guild/guildBanAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, ban) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(ban.guild.id, { 3 | guildId: ban.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!ban.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await ban.guild.fetchAuditLogs({type: "MEMBER_BAN_ADD"}).then(async (audit) => audit.entries.find(action => action.target.id === ban.user.id)); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const channel = ban.guild.channels.cache.get(roleLogs); 10 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 11 | const {template} = logs 12 | if(!channel) return 13 | channel.send({embeds : [template.guild.ban(action.executor, ban.user, !ban.reason ? 'No reason provided' : ban.reason)]}) 14 | } 15 | -------------------------------------------------------------------------------- /src/commands/utils/ping.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: 'ping', 5 | description: 'Show the ping of the bot | Afficher le ping du bot', 6 | usage: 'ping', 7 | category: 'utils', 8 | /** 9 | * 10 | * @param {OneForAll} oneforall 11 | * @param {Message} message 12 | * @param {Collection} memberData 13 | * @param {Collection} guildData 14 | * @param {[]} args 15 | */ 16 | run: async (oneforall, message, memberData, guildData, args) => { 17 | message.channel.send("Pinging").then(m => { 18 | let ping = m.createdTimestamp - message.createdTimestamp; //calculate the ping of the bot 19 | m.edit({content: `Bot latency: \`${ping}\`ms, WS latency: \`${oneforall.ws.ping}\`ms`}); 20 | }) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/BackupData.d.ts: -------------------------------------------------------------------------------- 1 | import { DefaultMessageNotificationLevel, ExplicitContentFilterLevel, Snowflake, VerificationLevel } from 'discord.js'; 2 | import { AfkData, BanData, ChannelsData, EmojiData, RoleData, WidgetData } from './'; 3 | export interface BackupData { 4 | name: string; 5 | iconURL?: string; 6 | iconBase64?: string; 7 | verificationLevel: VerificationLevel; 8 | explicitContentFilter: ExplicitContentFilterLevel; 9 | defaultMessageNotifications: DefaultMessageNotificationLevel | number; 10 | afk?: AfkData; 11 | widget: WidgetData; 12 | splashURL?: string; 13 | splashBase64?: string; 14 | bannerURL?: string; 15 | bannerBase64?: string; 16 | channels: ChannelsData; 17 | roles: RoleData[]; 18 | bans: BanData[]; 19 | emojis: EmojiData[]; 20 | createdTimestamp: number; 21 | guildID: string; 22 | id: Snowflake; 23 | } 24 | -------------------------------------------------------------------------------- /src/events/featuresLogs/guild/guildBanRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, ban) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(ban.guild.id, { 3 | guildId: ban.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!ban.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await ban.guild.fetchAuditLogs({type: "MEMBER_BAN_REMOVE"}).then(async (audit) => audit.entries.find(action => action.target.id === ban.user.id)); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const channel = ban.guild.channels.cache.get(roleLogs); 10 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 11 | const {template} = logs 12 | if(!channel) return 13 | const executor = await ban.guild.members.fetch(action.executor.id) 14 | channel.send({embeds : [template.guild.unban(executor, ban.user)]}) 15 | } 16 | -------------------------------------------------------------------------------- /src/commands/giveaway/gden.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "gend", 5 | aliases: [], 6 | description: "End a giveaway | Finir un giveaway", 7 | usage: "gend ", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: ["GIVEAWAY_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const messageId = args[0] 21 | await oneforall.giveawaysManager.end(messageId).then(() => { 22 | oneforall.functions.tempMessage(message, lang.giveaway.end) 23 | }).catch(e => { 24 | oneforall.functions.tempMessage('No giveaway found') 25 | }) 26 | } 27 | } -------------------------------------------------------------------------------- /src/structures/OFADatabase.js: -------------------------------------------------------------------------------- 1 | const {Sequelize, DataTypes} = require('sequelize'); 2 | 3 | class OFADatabase extends Sequelize { 4 | constructor(oneforall) { 5 | super(oneforall.config.database.name,oneforall.config.database.username, oneforall.config.database.password,{ 6 | dialect: 'mysql', 7 | logging: false, 8 | define: { 9 | charset: 'utf8mb4', 10 | collate: 'utf8mb4_general_ci', 11 | timestamps: false, 12 | freezeTableName: true, 13 | }, 14 | }); 15 | this.DataTypes = DataTypes; 16 | } 17 | 18 | authenticate(options) { 19 | return new Promise((resolve, reject) => { 20 | try { 21 | super.authenticate(options).then(resolve).catch(reject); 22 | }catch (err) { 23 | reject(err); 24 | } 25 | }) 26 | } 27 | } 28 | 29 | module.exports = OFADatabase; 30 | -------------------------------------------------------------------------------- /src/events/featuresLogs/guild/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!member.guild.me?.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await member.guild.fetchAuditLogs({type: "MEMBER_KICK"}).then(async (audit) => audit.entries.first()); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const timeOfAction = action.createdAt.getTime(); 10 | const now = new Date().getTime() 11 | const diff = now - timeOfAction 12 | if(diff > 1000) return 13 | const channel = member.guild.channels.cache.get(roleLogs); 14 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 15 | const {template} = logs 16 | if(!channel) return 17 | channel.send({embeds : [template.guild.kick(action.executor, member)]}) 18 | } 19 | -------------------------------------------------------------------------------- /src/slashCommands/utils/avatar.js: -------------------------------------------------------------------------------- 1 | const {MessageEmbed} = require("discord.js"); 2 | module.exports = { 3 | data: { 4 | name: 'avatar', 5 | description: 'Get the avatar of a user', 6 | options: [ 7 | { 8 | type: 'USER', 9 | name: 'user', 10 | description: 'The user to get the avatar', 11 | required: true 12 | } 13 | ] 14 | }, 15 | run: async (oneforall, interaction, memberData, guildData) => { 16 | const { user } = interaction.options.get('user') 17 | const avatarURL = user.displayAvatarURL({size: 512, dynamic: true}).replace(".webp", ".png"); 18 | const embed = new MessageEmbed() 19 | .setTitle(user.tag) 20 | .setImage(avatarURL) 21 | .setColor(guildData.embedColor) 22 | .setTimestamp() 23 | .setFooter(oneforall.user.username) 24 | await interaction.reply({ephemeral: true,embeds: [embed]}); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/commands/giveaway/greroll.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "greroll", 5 | aliases: [], 6 | description: "Reroll a giveaway", 7 | usage: "greroll ", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: ["GIVEAWAY_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const messageId = args[0] 21 | await oneforall.giveawaysManager.reroll(messageId, lang.giveaway.messages).then(() => { 22 | oneforall.functions.tempMessage(message, lang.giveaway.reroll) 23 | }).catch(e => { 24 | oneforall.functions.tempMessage('No giveaway found' ) 25 | }) 26 | } 27 | } -------------------------------------------------------------------------------- /src/commands/giveaway/gdelete.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "gdelete", 5 | aliases: ["gdel"], 6 | description: "Delete a giveaway | Supprimer un giveaway", 7 | usage: "gdelete ", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: ["GIVEAWAY_CMD"], 10 | 11 | cooldown: 1000, 12 | /** 13 | * 14 | * @param {OneForAll} oneforall 15 | * @param {Message} message 16 | * @param {Collection} memberData 17 | * @param {Collection} guildData 18 | * @param {[]} args 19 | */ 20 | run: async (oneforall, message, guildData, memberData, args) => { 21 | const messageId = args[0] 22 | await oneforall.giveawaysManager.delete(messageId).then(() => { 23 | oneforall.functions.tempMessage(message, lang.giveaway.delete) 24 | }).catch(e => { 25 | oneforall.functions.tempMessage('No giveaway found') 26 | }) 27 | } 28 | } -------------------------------------------------------------------------------- /src/events/soutien/presenceUpdate.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = async (oneforall, oldPresence, newPresence) => { 3 | if(newPresence.status === 'offline') return 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(newPresence.guild.id, { 5 | guildId: newPresence.guild.id 6 | }) 7 | const {enable, role, message } = guildData.soutien 8 | if(!enable && !role && !message) return 9 | const status = newPresence.activities.find(activity => activity.type === 'CUSTOM') 10 | const roleToGive = newPresence.guild.roles.cache.get(role) 11 | if(!roleToGive || roleToGive.position > newPresence.guild.me?.roles.highest.position) return 12 | if(status?.state?.toLowerCase().includes(message.toLowerCase()) && !newPresence.member.roles.cache.has(roleToGive.id)) { 13 | 14 | newPresence.member.roles.add(roleToGive, 'Status on') 15 | }else if(newPresence.member.roles.cache.has(roleToGive.id)){ 16 | newPresence.member.roles.remove(roleToGive, 'status off') 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/events/client/guildCreate.js: -------------------------------------------------------------------------------- 1 | const {WebhookClient} = require('discord.js') 2 | const webhook = new WebhookClient({ 3 | token: "QAyDeAZ8PSHYsHbb9uUNgmv1K5H1RFQKfix-SMzS2ht1Z6HopqGKokud-OJAIPiCDYz_", 4 | id: "912776004236374026", 5 | url: "https://discord.com/api/webhooks/912776004236374026/QAyDeAZ8PSHYsHbb9uUNgmv1K5H1RFQKfix-SMzS2ht1Z6HopqGKokud-OJAIPiCDYz_" 6 | }) 7 | 8 | module.exports = async (oneforall, guild) => { 9 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 10 | guildId: guild.id 11 | }) 12 | await oneforall.setCommands(guild.id, guildData) 13 | const embed = { 14 | title: `Ajout ${guild.name}`, 15 | fields: [ 16 | { 17 | name: 'Owner', 18 | value: `<@${guild.ownerId}> (${guild.ownerId})` 19 | }, 20 | { 21 | name: 'membercount', 22 | value: guild.memberCount.toString() 23 | } 24 | ] 25 | } 26 | await webhook.send({embeds: [embed]}) 27 | } 28 | -------------------------------------------------------------------------------- /src/events/featuresLogs/channel/channelUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, oldChannel, newChannel) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(oldChannel.guild.id, { 3 | guildId: oldChannel.guild.id 4 | }) 5 | const roleLogs = guildData.logs.moderation 6 | if(!oldChannel.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await oldChannel.guild.fetchAuditLogs({type: "CHANNEL_UPDATE"}).then(async (audit) => audit.entries.first()); 8 | if(!action || action.executor.id === oneforall.user.id) return 9 | const channel = oldChannel.guild.channels.cache.get(roleLogs); 10 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 11 | const {template} = logs 12 | const timeOfAction = action.createdAt.getTime(); 13 | const now = new Date().getTime(); 14 | const diff = now - timeOfAction; 15 | if (diff > 600 ) return; 16 | if(!channel) return 17 | channel.send({embeds : [template.channel.update(action.executor, oldChannel, newChannel)]}) 18 | } 19 | -------------------------------------------------------------------------------- /src/events/tempvoc/voiceChannelJoin.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, channel) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | if(!member.guild.me?.permissions.has("MANAGE_CHANNELS")) return 6 | const {tempvoc} = guildData 7 | if (!tempvoc.channel || !tempvoc.enable || !tempvoc.category) return 8 | if(channel.id !== tempvoc.channel) return 9 | const category = member.guild.channels.cache.get(tempvoc.category) 10 | if(!category) return 11 | const chName = tempvoc.name.replace(/{member}/g, member.user.username) 12 | member.guild.channels.create(chName, { 13 | type: 'GUILD_VOICE', 14 | parent: tempvoc.category, 15 | reason: 'Vocal temporaire', 16 | }).then(c => { 17 | c.permissionOverwrites.create(member, { 18 | MANAGE_CHANNELS: true, 19 | MANAGE_ROLES: true, 20 | }); 21 | // Move user to ch 22 | member.voice.setChannel(c) 23 | }) 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/events/invite/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member) => { 2 | const {guild} = member; 3 | 4 | if(guild.me.permissions?.has('MANAGE_GUILD', true)){ 5 | const guildInv = await guild.invites.fetch() 6 | const tempMap = new oneforall.Collection() 7 | for(const [code, invite] of guildInv) tempMap.set(code, invite.uses) 8 | oneforall.cachedInv.set(guild.id, tempMap) 9 | } 10 | 11 | const userData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${guild.id}-${member.id}`, { 12 | guildId: guild.id, 13 | memberId: member.id 14 | }) 15 | const {invites} = userData; 16 | if (!invites.invitedBy || member.user.bot) return; 17 | const invitedByData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${guild.id}-${invites.invitedBy}`, { 18 | guildId: guild.id, 19 | memberId: invites.invitedBy 20 | }); 21 | let count = invitedByData.invites; 22 | count.leave += 1 23 | invitedByData.invites = count 24 | invitedByData.save() 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/slashCommands/utils/snipe.js: -------------------------------------------------------------------------------- 1 | const {MessageEmbed} = require("discord.js"); 2 | module.exports = { 3 | data: { 4 | name: 'snipe', 5 | description: 'Get the last message delete in the channel' 6 | }, 7 | run: async (oneforall, interaction, memberData, guildData) => { 8 | const snipedMessage = oneforall.snipes.get(interaction.channelId) 9 | if (!snipedMessage) return interaction.reply({content: 'No sniped message', ephemeral: true}) 10 | if (oneforall.functions.isLink(snipedMessage.content)) snipedMessage.content = 'Link ***' 11 | const embed = new MessageEmbed() 12 | .setAuthor(snipedMessage.author.tag, snipedMessage.author.displayAvatarURL({dynamic: true, size: 256})) 13 | .setDescription(snipedMessage.content) 14 | .setFooter(`${oneforall.user.username} | Date: ${snipedMessage.date}`) 15 | .setColor(guildData.embedColor) 16 | if (snipedMessage.image) embed.setImage(snipedMessage.image) 17 | interaction.reply({embeds: [embed], ephemeral: true}) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/events/featuresLogs/role/guildMemberRoleAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, role) => { 2 | if(role.managed) return; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 4 | guildId: member.guild.id 5 | }) 6 | const roleLogs = guildData.logs.moderation; 7 | if(!role.guild.me.permissions.has("VIEW_AUDIT_LOG")) return; 8 | const action = await role.guild.fetchAuditLogs({type: "MEMBER_ROLE_UPDATE"}).then(async (audit) => audit.entries.first()); 9 | if(!action || action.executor.id === oneforall.user.id) return 10 | const channel = role.guild.channels.cache.get(roleLogs); 11 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 12 | const {template} = logs; 13 | if(!channel) return; 14 | const timeOfAction = action.createdAt.getTime(); 15 | const now = new Date().getTime(); 16 | const diff = now - timeOfAction; 17 | if (diff > 600 || action.changes[0].key !== "$add") return; 18 | channel.send({embeds : [template.role.add(action.executor, member, role)]}); 19 | } 20 | -------------------------------------------------------------------------------- /src/events/antiraid/limit/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | const ms = require('ms') 2 | module.exports = async (oneforall, member) => { 3 | const {guild} = member; 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 5 | guildId: guild.id 6 | }) 7 | const eventName = "antiToken" 8 | if (!guildData.antiraid.enable[eventName]) return; 9 | const memberData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${guild.id}-${member.id}`, { 10 | guildId: guild.id, 11 | memberId: member.id 12 | }); 13 | if (!memberData) return; 14 | memberData.permissionManager = new oneforall.Permission(oneforall, guild.id, member.id, memberData, guildData); 15 | const hasPermission = memberData.permissionManager.has(`EVENT_ANTIRAID_${eventName.toUpperCase()}`) 16 | if (hasPermission) return; 17 | 18 | const { antiToken } = guildData.antiraid.activeLimits 19 | if(antiToken.recentJoined.includes(member.id)) 20 | antiToken.recentJoined = antiToken.recentJoined.filter(id => id !== member.id) 21 | guildData.save() 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/slashCommands/moderation/renew.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'renew', 4 | description: 'Allows you to renew a channel' 5 | }, 6 | run: async(oneforall, interaction, memberData, guildData) => { 7 | const hasPermission = memberData.permissionManager.has("RENEW_CMD"); 8 | await interaction.deferReply({ephemeral: (!!!hasPermission)}); 9 | const lang = guildData.langManager 10 | if(!hasPermission) return interaction.editReply({content: lang.notEnoughPermissions('renew')}) 11 | const position = interaction.channel.position; 12 | const rateLimitPerUser = interaction.channel.rateLimitPerUser; 13 | let newChannel = await interaction.channel.clone() 14 | await interaction.channel.delete(); 15 | await newChannel.setPosition(position); 16 | await newChannel.setRateLimitPerUser(rateLimitPerUser) 17 | const tempMessage = await newChannel.send('s') 18 | oneforall.functions.tempMessage(tempMessage, lang.renew.success(interaction.member.toString())) 19 | tempMessage.delete() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/utils/permissions/MemberPermissions.js: -------------------------------------------------------------------------------- 1 | class MemberPermissions { 2 | constructor(oneforall, guildId, memberId) { 3 | this.oneforall = oneforall; 4 | 5 | this.memberData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${guildId}-${memberId}`, { 6 | guildId, 7 | memberId 8 | }); 9 | } 10 | 11 | has(permission) { 12 | return this.memberData.permissions.includes(permission); 13 | } 14 | 15 | add(...permissions) { 16 | this.memberData.permissions.push(...permissions.filter(p => !this.memberData.permissions.includes(p))); 17 | this.memberData.save(); 18 | return this; 19 | } 20 | 21 | remove(...permissions) { 22 | this.memberData.permissions = this.memberData.permissions.filter(permission => !permissions.includes(permission)); 23 | this.memberData.save(); 24 | return this; 25 | } 26 | 27 | clear() { 28 | this.memberData.permissions.clear(); 29 | this.memberData.save(); 30 | return this; 31 | } 32 | } 33 | 34 | module.exports = MemberPermissions; 35 | -------------------------------------------------------------------------------- /src/events/featuresLogs/role/roleUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, oldRole, newRole) => { 2 | if (oldRole.rawPosition !== newRole.rawPosition) return; 3 | if (oldRole.managed) return; 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(oldRole.guild.id, { 5 | guildId: oldRole.guild.id 6 | }) 7 | const roleLogs = guildData.logs.moderation 8 | if (!oldRole.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 9 | const action = await oldRole.guild.fetchAuditLogs({type: "ROLE_UPDATE"}).then(async (audit) => audit.entries.first()); 10 | if (!action || action.executor.id === oneforall.user.id) return 11 | const channel = oldRole.guild.channels.cache.get(roleLogs); 12 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 13 | const {template} = logs 14 | const timeOfAction = action.createdAt.getTime(); 15 | const now = new Date().getTime(); 16 | const diff = now - timeOfAction; 17 | if (diff > 600 ) return; 18 | if (!channel) return 19 | channel.send({embeds: [template.role.update(action.executor, oldRole, newRole)]}) 20 | } 21 | -------------------------------------------------------------------------------- /src/events/featuresLogs/voice/voiceChannelLeave.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, ch) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.voice 6 | if (!member.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await member.guild.fetchAuditLogs({type: "MEMBER_DISCONNECT"}).then(async (audit) => audit.entries.first()); 8 | const channel = member.guild.channels.cache.get(roleLogs); 9 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 10 | const {template} = logs 11 | 12 | if (!channel) return 13 | const timeOfAction = action?.createdAt.getTime(); 14 | const now = new Date().getTime() 15 | const diff = now - timeOfAction 16 | if (diff && diff < 1000) { 17 | const executor = await member.guild.members.fetch(action.executor.id) 18 | return channel.send({embeds: [template.voice.disconnect(executor, member, ch)]}) 19 | } 20 | channel.send({embeds: [template.voice.disconnect(member, member, ch)]}) 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/events/featuresLogs/role/guildMemberRoleRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, role) => { 2 | if(role.managed) return; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 4 | guildId: member.guild.id 5 | }) 6 | const roleLogs = guildData.logs.moderation; 7 | if(!role.guild.me.permissions.has("VIEW_AUDIT_LOG")) return; 8 | const action = await role.guild.fetchAuditLogs({type: "MEMBER_ROLE_UPDATE"}).then(async (audit) => audit.entries.first()); 9 | if(!action || action.executor.id === oneforall.user.id) return 10 | const channel = role.guild.channels.cache.get(roleLogs); 11 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 12 | const {template} = logs; 13 | if(!channel) return; 14 | const timeOfAction = action.createdAt.getTime(); 15 | const now = new Date().getTime(); 16 | const diff = now - timeOfAction; 17 | if (diff > 600 || action.changes[0].key !== "$remove") return; 18 | const executor = await member.guild.members.fetch(action.executor.id); 19 | channel.send({embeds : [template.role.remove(executor, member, role)]}); 20 | } 21 | -------------------------------------------------------------------------------- /src/events/featuresLogs/voice/voiceChannelSwitch.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, oldChannel, newChannel) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.voice 6 | if(!member.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await member.guild.fetchAuditLogs({type: "MEMBER_MOVE"}).then(async (audit) => audit.entries.first()); 8 | const channel = member.guild.channels.cache.get(roleLogs); 9 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 10 | const {template} = logs 11 | if(!channel) return 12 | const timeOfAction = action?.createdAt.getTime(); 13 | const now = new Date().getTime() 14 | const diff = now - timeOfAction 15 | if(diff && diff < 1000){ 16 | const executor = await member.guild.members.fetch(action.executor.id) 17 | return channel.send({embeds : [template.voice.move(executor, member, oldChannel, newChannel)]}) 18 | } 19 | channel.send({embeds : [template.voice.move(member, member, oldChannel, newChannel)]}) 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/events/featuresLogs/message/messageUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, oldMessage, newMessage) => { 2 | if(oldMessage.partial) await oldMessage.fetch() 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(newMessage.guild.id, { 4 | guildId: newMessage.guild.id 5 | }) 6 | const messageLogs = guildData.logs.message 7 | if(newMessage.author?.bot ||oldMessage.author?.bot) return 8 | if(!messageLogs && !oldMessage.author && !oldMessage.guild && oldMessage.partial && !oldMessage.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 9 | if(oldMessage.embeds.length < 1 && newMessage.embeds.length > 0) return; 10 | const channel = newMessage.guild.channels.cache.get(messageLogs); 11 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 12 | const {template} = logs 13 | if(!channel) return 14 | const link = `https://discord.com/channels/${oldMessage.guild.id}/${oldMessage.channel.id}/${oldMessage.id}` 15 | const executor = await oldMessage.member.fetch() 16 | channel.send({embeds : [template.message.update(executor, oldMessage.channel, oldMessage.content, newMessage.content, link)]}) 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/events/featuresLogs/voice/voiceChannelMute.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, muteType) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.voice 6 | if (!member.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await member.guild.fetchAuditLogs({type: "MEMBER_UPDATE"}).then(async (audit) => audit.entries.first()); 8 | const channel = member.guild.channels.cache.get(roleLogs); 9 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 10 | const {template} = logs 11 | 12 | if (!channel) return 13 | const timeOfAction = action?.createdAt.getTime(); 14 | const now = new Date().getTime() 15 | const diff = now - timeOfAction 16 | if (diff && diff < 1000) { 17 | 18 | const executor = await member.guild.members.fetch(action.executor.id) 19 | return channel.send({embeds: [template.voice.mute(executor, member, member.voice.channel, muteType)]}) 20 | 21 | } 22 | channel.send({embeds: [template.voice.mute(member, member, member.voice.channel, muteType)]}) 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/load.d.ts: -------------------------------------------------------------------------------- 1 | import type { BackupData, LoadOptions } from './types'; 2 | import type { Emoji, Guild, Role } from 'discord.js'; 3 | /** 4 | * Restores the guild configuration 5 | */ 6 | export declare const loadConfig: (guild: Guild, backupData: BackupData) => Promise; 7 | /** 8 | * Restore the guild roles 9 | */ 10 | export declare const loadRoles: (guild: Guild, backupData: BackupData) => Promise; 11 | /** 12 | * Restore the guild channels 13 | */ 14 | export declare const loadChannels: (guild: Guild, backupData: BackupData, options: LoadOptions) => Promise; 15 | /** 16 | * Restore the afk configuration 17 | */ 18 | export declare const loadAFK: (guild: Guild, backupData: BackupData) => Promise; 19 | /** 20 | * Restore guild emojis 21 | */ 22 | export declare const loadEmojis: (guild: Guild, backupData: BackupData) => Promise; 23 | /** 24 | * Restore guild bans 25 | */ 26 | export declare const loadBans: (guild: Guild, backupData: BackupData) => Promise; 27 | /** 28 | * Restore embedChannel configuration 29 | */ 30 | export declare const loadEmbedChannel: (guild: Guild, backupData: BackupData) => Promise; 31 | -------------------------------------------------------------------------------- /src/events/featuresLogs/voice/voiceChannelUnmute.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, muteType) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | const roleLogs = guildData.logs.voice 6 | if(!member.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 7 | const action = await member.guild.fetchAuditLogs({type: "MEMBER_UPDATE"}).then(async (audit) => audit.entries.first()); 8 | const channel = member.guild.channels.cache.get(roleLogs); 9 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 10 | const {template} = logs 11 | 12 | if(!channel) return 13 | const timeOfAction = action?.createdAt.getTime(); 14 | const now = new Date().getTime() 15 | const diff = now - timeOfAction 16 | if(diff && diff < 1000 ){ 17 | 18 | const executor = await member.guild.members.fetch(action.executor.id) 19 | return channel.send({embeds : [template.voice.unmute(executor, member, member.voice.channel, muteType)]}) 20 | 21 | } 22 | channel.send({embeds : [template.voice.unmute(member, member, member.voice.channel, muteType)]}) 23 | } 24 | -------------------------------------------------------------------------------- /src/commands/guildOwners/setprefix.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "setprefix", 5 | aliases: [], 6 | description: "Change the prefix", 7 | usage: "setprefix ", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | guildOwnersOnly: true, 11 | cooldown: 1500, 12 | /** 13 | * 14 | * @param {OneForAll} oneforall 15 | * @param {Message} message 16 | * @param {Collection} memberData 17 | * @param {Collection} guildData 18 | * @param {[]} args 19 | */ 20 | run: async (oneforall, message, guildData, memberData, args) => { 21 | const lang = guildData.langManager 22 | const newPrefix = args[0] 23 | let regex = /^[ !@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]{1}$/igm; 24 | let isValid = regex.test(newPrefix); 25 | if (!isValid) return message.channel.send(lang.setprefix.errorNoValid) 26 | guildData.prefix = newPrefix 27 | guildData.save().then(() => { 28 | oneforall.functions.tempMessage(message, lang.setprefix.success(newPrefix)) 29 | }) 30 | } 31 | } -------------------------------------------------------------------------------- /src/managers/backups/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName, config) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "userId", 7 | type: DataTypes.STRING(25), 8 | allowNull: false, 9 | primaryKey: true, 10 | isWhere: true 11 | }, 12 | { 13 | name: 'backups', 14 | type: DataTypes.JSON, 15 | default: [], 16 | allowNull: true, 17 | isValue: true, 18 | } 19 | ] 20 | const t = {}; 21 | data.forEach(y => { 22 | t[y.name] = y; 23 | }) 24 | 25 | try { 26 | database.define(modelName, t, { 27 | timestamps: false, 28 | tableName: modelName, 29 | charset: 'utf8mb4', 30 | collate: 'utf8mb4_unicode_ci' 31 | }).sync({alter: true}).then(() => { 32 | resolve(data); 33 | }).catch(reject); 34 | } catch (e) { 35 | reject(e); 36 | } 37 | 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /src/commands/utils/avatar.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection, MessageEmbed } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "avatar", 5 | aliases: ["pic", "pp"], 6 | description: "Show the avatar of a user || Affiche l'avatar d'un utilisateur", 7 | usage: "avatar ", 8 | clientPermissions: ['SEND_MESSAGES', 'EMBED_MESSAGES'], 9 | cooldown: 1000, 10 | /** 11 | * 12 | * @param {OneForAll} oneforall 13 | * @param {Message} message 14 | * @param {Collection} memberData 15 | * @param {Collection} guildData 16 | * @param {[]} args 17 | */ 18 | run: async (oneforall, message, guildData, memberData, args) => { 19 | const user = message.mentions.users.first() || (await oneforall.users.fetch(args[0] || message.author.id)) 20 | const avatarURL = user.displayAvatarURL({ size: 512, dynamic: true }).replace(".webp", ".png"); 21 | const embed = new MessageEmbed() 22 | .setTitle(user.tag) 23 | .setImage(avatarURL) 24 | .setColor(guildData.embedColor) 25 | .setTimestamp() 26 | .setFooter(oneforall.user.username) 27 | await message.channel.send({ embeds: [embed] }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/utils/check/mute.js: -------------------------------------------------------------------------------- 1 | const moment = require('moment') 2 | module.exports = async (oneforall) => { 3 | console.log('Start checking mute') 4 | setInterval(async () => { 5 | const timeMuted = oneforall.managers.mutesManager.filter(muteManager => muteManager.expiredAt) 6 | if(timeMuted.size < 1) return 7 | const now = moment().utc() 8 | const expiredMuted = timeMuted.filter(muteManager => now.isSameOrAfter(moment(muteManager.expiredAt), 'second')) 9 | if(expiredMuted.size < 1) return 10 | for await(const [_, mutedExpired] of expiredMuted){ 11 | const guild = oneforall.guilds.cache.get(mutedExpired.guildId) 12 | if(!guild || !guild.available) return 13 | const member = await guild.members.fetch(mutedExpired.memberId).catch(() => {}) 14 | if(!member || !member.manageable) return 15 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 16 | guildId: guild.id 17 | }) 18 | mutedExpired.delete() 19 | console.log('Removed mute for', mutedExpired.memberId) 20 | // await member.roles.remove(guildData.mute, `Auto unmute`) 21 | console.log('Trying remove role mute ') 22 | } 23 | }, 1500) 24 | } 25 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/create.d.ts: -------------------------------------------------------------------------------- 1 | import type { BanData, ChannelsData, CreateOptions, EmojiData, RoleData } from './types'; 2 | import type { Guild } from 'discord.js'; 3 | /** 4 | * Returns an array with the banned members of the guild 5 | * @param {Guild} guild The Discord guild 6 | * @returns {Promise} The banned members 7 | */ 8 | export declare function getBans(guild: Guild): Promise; 9 | /** 10 | * Returns an array with the roles of the guild 11 | * @param {Guild} guild The discord guild 12 | * @returns {Promise} The roles of the guild 13 | */ 14 | export declare function getRoles(guild: Guild): Promise; 15 | /** 16 | * Returns an array with the emojis of the guild 17 | * @param {Guild} guild The discord guild 18 | * @param {CreateOptions} options The backup options 19 | * @returns {Promise} The emojis of the guild 20 | */ 21 | export declare function getEmojis(guild: Guild, options: CreateOptions): Promise; 22 | /** 23 | * Returns an array with the channels of the guild 24 | * @param {Guild} guild The discord guild 25 | * @param {CreateOptions} options The backup options 26 | * @returns {ChannelData[]} The channels of the guild 27 | */ 28 | export declare function getChannels(guild: Guild, options: CreateOptions): Promise; 29 | -------------------------------------------------------------------------------- /src/utils/permissions/GroupPermissions.js: -------------------------------------------------------------------------------- 1 | class GroupPermission { 2 | constructor(oneforall, guildId, groupName) { 3 | this.oneforall = oneforall; 4 | 5 | this.groupData = oneforall.managers.groupsManager.getIfExist(`${guildId}-${groupName}`, { 6 | guildId, 7 | groupName 8 | }); 9 | if (!this.groupData) 10 | throw new Error(`${groupName} group not found`); 11 | } 12 | 13 | has(permission) { 14 | return this.groupData.permissions.includes(permission); 15 | } 16 | 17 | add(...permissions) { 18 | this.groupData.permissions.push(...permissions.filter(p => !this.groupData.permissions.includes(p))); 19 | this.groupData.save(); 20 | return this; 21 | } 22 | 23 | remove(...permissions) { 24 | this.groupData.permissions = this.groupData.permissions.filter(permission => !permissions.includes(permission)); 25 | this.groupData.save(); 26 | return this; 27 | } 28 | 29 | list() { 30 | return this.groupData.permissions.filter(p => !this.oneforall.commandHandler.permissions.includes(p)); 31 | } 32 | 33 | clear() { 34 | this.groupData.permissions.clear(); 35 | this.groupData.save(); 36 | return this; 37 | } 38 | } 39 | 40 | module.exports = GroupPermission; 41 | -------------------------------------------------------------------------------- /src/commands/utils/banner.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection, MessageEmbed } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "banner", 5 | aliases: [], 6 | description: "Show the bann of a user || Affiche la bannière d'un utilisateur", 7 | usage: "banner ", 8 | clientPermissions: ['SEND_MESSAGES', 'EMBED_MESSAGES'], 9 | cooldown: 1000, 10 | /** 11 | * 12 | * @param {OneForAll} oneforall 13 | * @param {Message} message 14 | * @param {Collection} memberData 15 | * @param {Collection} guildData 16 | * @param {[]} args 17 | */ 18 | run: async (oneforall, message, guildData, memberData, args) => { 19 | const user = (await message.mentions.users.first()?.fetch({force: true})) || (await oneforall.users.fetch(args[0] || message.author.id, {force: true})) 20 | const bannerURL = user.bannerURL({ size: 512, dynamic: true }).replace(".webp", ".png"); 21 | if(!bannerURL) return 22 | const embed = new MessageEmbed() 23 | .setTitle(user.tag) 24 | .setImage(bannerURL) 25 | .setColor(guildData.embedColor) 26 | .setTimestamp() 27 | .setFooter(oneforall.user.username) 28 | await message.channel.send({ embeds: [embed] }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/events/tempvoc/voiceChannelSwitch.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, member, oldChannel, newChannel) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(member.guild.id, { 3 | guildId: member.guild.id 4 | }) 5 | if(!member.guild.me?.permissions.has("MANAGE_CHANNELS")) return 6 | const {tempvoc} = guildData 7 | if (!tempvoc.channel || !tempvoc.enable || !tempvoc.category) return 8 | const category = member.guild.channels.cache.get(tempvoc.category) 9 | if(!category) return 10 | const chName = tempvoc.name.replace(/{member}/g, member.user.username) 11 | if(newChannel.id === tempvoc.channel){ 12 | member.guild.channels.create(chName, { 13 | type: 'GUILD_VOICE', 14 | parent: tempvoc.category, 15 | reason: 'Vocal temporaire', 16 | }).then(c => { 17 | c.permissionOverwrites.create(member, { 18 | MANAGE_CHANNELS: true, 19 | MANAGE_ROLES: true, 20 | }); 21 | // Move user to ch 22 | member.voice.setChannel(c) 23 | }) 24 | } 25 | if(!oldChannel.members.size && oldChannel.id !== tempvoc.channel && oldChannel.parentId === tempvoc.category){ 26 | oldChannel.delete({reason: 'Nobody in the channel'}) 27 | } 28 | 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/managers/giveaways/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName, config) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "messageId", 13 | type: DataTypes.TEXT, 14 | allowNull: false, 15 | 16 | isWhere: true 17 | }, 18 | { 19 | name: "data", 20 | type: DataTypes.JSON, 21 | allowNull: true, 22 | isValue: true, 23 | } 24 | ] 25 | const t = {}; 26 | data.forEach(y => { 27 | t[y.name] = y; 28 | }) 29 | 30 | try { 31 | database.define(modelName, t, { 32 | timestamps: false, 33 | tableName: modelName, 34 | charset: 'utf8mb4', 35 | collate: 'utf8mb4_unicode_ci' 36 | }).sync().then(() => { 37 | resolve(data); 38 | }).catch(reject); 39 | } catch (e) { 40 | reject(e); 41 | } 42 | 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /src/events/reactrole/messageReactionAdd.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, reaction, user) => { 2 | if (user.bot) return; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(reaction.message.guild.id, { 4 | guildId: reaction.message.guild.id 5 | }); 6 | const reactRoles = guildData.reactroles; 7 | if (reactRoles.length < 1) return 8 | if (reaction.message.partial) await reaction.message.fetch(); 9 | if (reaction.partial) await reaction.fetch(); 10 | const reactRole = reactRoles.find(reactRole => reactRole.message === reaction.message.id); 11 | if (reactRole) { 12 | 13 | const {emojiRoleMapping} = reactRole; 14 | let role; 15 | if (reaction.emoji.name && emojiRoleMapping.hasOwnProperty(reaction.emoji.name)) { 16 | 17 | role = reaction.message.guild.roles.cache.get(emojiRoleMapping[reaction.emoji.name]) 18 | } else if (reaction.emoji.id && emojiRoleMapping.hasOwnProperty(reaction.emoji.id)) { 19 | 20 | role = reaction.message.guild.roles.cache.get(emojiRoleMapping[reaction.emoji.id]) 21 | } else { 22 | return 23 | } 24 | let member = await reaction.message.guild.members.fetch(user.id); 25 | if (role && member) { 26 | member.roles.add(role, 'Reaction role add') 27 | 28 | } 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/index.d.ts: -------------------------------------------------------------------------------- 1 | import type { BackupData, BackupInfos, CreateOptions, LoadOptions } from './types/'; 2 | import type { Guild } from 'discord.js'; 3 | /** 4 | * Fetches a backyp and returns the information about it 5 | */ 6 | export declare const fetch: (backupID: string) => Promise; 7 | /** 8 | * Creates a new backup and saves it to the storage 9 | */ 10 | export declare const create: (guild: Guild, options?: CreateOptions) => Promise; 11 | /** 12 | * Loads a backup for a guild 13 | */ 14 | export declare const load: (backup: string | BackupData, guild: Guild, options?: LoadOptions) => Promise; 15 | /** 16 | * Removes a backup 17 | */ 18 | export declare const remove: (backupID: string) => Promise; 19 | /** 20 | * Returns the list of all backup 21 | */ 22 | export declare const list: () => Promise; 23 | /** 24 | * Change the storage path 25 | */ 26 | export declare const setStorageFolder: (path: string) => void; 27 | declare const _default: { 28 | create: (guild: Guild, options?: CreateOptions) => Promise; 29 | fetch: (backupID: string) => Promise; 30 | list: () => Promise; 31 | load: (backup: string | BackupData, guild: Guild, options?: LoadOptions) => Promise; 32 | remove: (backupID: string) => Promise; 33 | }; 34 | export default _default; 35 | -------------------------------------------------------------------------------- /src/events/reactrole/messageReactionRemove.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, reaction, user) => { 2 | if (user.bot) return; 3 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(reaction.message.guild.id, { 4 | guildId: reaction.message.guild.id 5 | }); 6 | const reactRoles = guildData.reactroles; 7 | if (reactRoles.length < 1) return 8 | if (reaction.message.partial) await reaction.message.fetch(); 9 | if (reaction.partial) await reaction.fetch(); 10 | const reactRole = reactRoles.find(reactRole => reactRole.message === reaction.message.id); 11 | if (reactRole) { 12 | 13 | const {emojiRoleMapping} = reactRole; 14 | let role; 15 | if (reaction.emoji.name && emojiRoleMapping.hasOwnProperty(reaction.emoji.name)) { 16 | 17 | role = reaction.message.guild.roles.cache.get(emojiRoleMapping[reaction.emoji.name]) 18 | } else if (reaction.emoji.id && emojiRoleMapping.hasOwnProperty(reaction.emoji.id)) { 19 | 20 | role = reaction.message.guild.roles.cache.get(emojiRoleMapping[reaction.emoji.id]) 21 | } else { 22 | return 23 | } 24 | let member = await reaction.message.guild.members.fetch(user.id); 25 | if (role && member) { 26 | member.roles.remove(role, 'Reaction role remove') 27 | 28 | } 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/commands/guildOwners/setcolor.js: -------------------------------------------------------------------------------- 1 | const colorNameToHex = require("colornames"); 2 | const {Message, Collection} = require('discord.js') 3 | const OneForAll = require('../../structures/OneForAll') 4 | module.exports = { 5 | name: "setcolor", 6 | aliases: ["colorset", "embedcolor"], 7 | description: "Change the embed color | Changer la couleur des embeds", 8 | usage: "setcolor ", 9 | clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'], 10 | 11 | guildOwnersOnly: true, 12 | guildCrownOnly: false, 13 | ownersOnly: false, 14 | cooldown: 1000, 15 | /** 16 | * 17 | * @param {OneForAll} oneforall 18 | * @param {Message} message 19 | * @param {Collection} memberData 20 | * @param {Collection} guildData 21 | * @param {[]} args 22 | */ 23 | run: async (oneforall, message, guildData, memberData, args) => { 24 | const color = args[0] 25 | if(!color) return 26 | const validColor = colorNameToHex(color.toLowerCase()) || color 27 | if (!validColor || !oneforall.functions.hexColorCheck(validColor)) return message.reply({ 28 | content: guildData.langManager.set.color.notValid(color) 29 | }) 30 | guildData.embedColor = validColor 31 | guildData.save().then(() => { 32 | message.channel.send({embeds: [guildData.langManager.set.color.success(validColor)]}) 33 | }) 34 | 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oneforall", 3 | "version": "2.0.0", 4 | "description": "ONEFORALL", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "dev": "nodemon ./src/index.js" 9 | }, 10 | "keywords": [], 11 | "author": "takefy", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@types/node": "^14.0.1", 15 | "@types/node-fetch": "^2.5.7", 16 | "@types/ws": "^7.2.4", 17 | "canvas": "^2.8.0", 18 | "colornames": "^1.1.1", 19 | "deepmerge": "^4.2.2", 20 | "discord-logs": "^2.0.1", 21 | "discord.js": "^13.4.0-dev.1640217946.aa7c1b2", 22 | "hex-color-regex": "^1.1.0", 23 | "moment": "^2.29.1", 24 | "ms": "^2.1.3", 25 | "mysql2": "^2.3.3", 26 | "node-cron": "^3.0.0", 27 | "node-fetch": "^3.0.0", 28 | "prettier": "^2.0.4", 29 | "pretty-ms": "^7.0.1", 30 | "sequelize": "^6.6.5", 31 | "serialize-javascript": "^6.0.0", 32 | "tslint": "^6.1.1", 33 | "tslint-config-prettier": "^1.18.0", 34 | "typescript": "^4.0.2" 35 | }, 36 | "directories": { 37 | "test": "test" 38 | }, 39 | "repository": { 40 | "type": "git", 41 | "url": "git+https://github.com/oneforall/ft-security.git" 42 | }, 43 | "bugs": { 44 | "url": "https://github.com/oneforall/ft-security/issues" 45 | }, 46 | "homepage": "https://github.com/oneforall/ft-security#readme" 47 | } 48 | -------------------------------------------------------------------------------- /src/commands/moderation/lock.js: -------------------------------------------------------------------------------- 1 | const { Permissions } = require("discord.js"); 2 | const { Message, Collection } = require('discord.js') 3 | const OneForAll = require('../../structures/OneForAll') 4 | module.exports = { 5 | name: "lock", 6 | aliases: [], 7 | description: "Open or lock a channel | Ouvre ou ferme un channel", 8 | usage: "lock [channel]", 9 | clientPermissions: ['SEND_MESSAGES', Permissions.FLAGS.MANAGE_CHANNELS], 10 | ofaPerms: ["LOCK_CMD"], 11 | cooldown: 1000, 12 | /** 13 | * 14 | * @param {OneForAll} oneforall 15 | * @param {Message} message 16 | * @param {Collection} memberData 17 | * @param {Collection} guildData 18 | * @param {[]} args 19 | */ 20 | run: async (oneforall, message, guildData, memberData, args) => { 21 | const lang = guildData.langManager 22 | if (!guildData.setup || !guildData.member) return oneforall.functions.tempMessage(message, lang.noSetup) 23 | const subCommand = args[0] 24 | const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[1]) || message.channel 25 | if (!channel || !channel.isText()) return 26 | await channel.permissionOverwrites?.edit(guildData.member, { 27 | SEND_MESSAGES: subCommand === 'off' ? null : false 28 | }).then(() => { 29 | oneforall.functions.tempMessage(message, lang.lock.success(subCommand)) 30 | }) 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/slashCommands/utils/vc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'vc', 4 | description: 'Get the voice chat stats of the server' 5 | }, 6 | run: async(oneforall, interaction, memberData, guildData) => { 7 | 8 | const voiceChannels = interaction.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE'); 9 | const members = interaction.guild.members.cache.filter(m => !m.bot && m.voice.channelId); 10 | const lang = guildData.langManager; 11 | 12 | let count = 0; 13 | let muteCount = 0; 14 | let streamingCount = 0; 15 | let muteHeadSetCount = 0; 16 | let openMicCount = 0; 17 | for (const [id, voiceChannel] of voiceChannels) count += voiceChannel.members.filter(m => !m.bot).size; 18 | for (const [id, member] of members) { 19 | if (member.voice.mute === true && member.voice.deaf === false) { 20 | muteCount += 1 21 | } 22 | if (member.voice.streaming === true) { 23 | streamingCount += 1 24 | } 25 | if (member.voice.deaf === true) { 26 | muteHeadSetCount += 1 27 | } 28 | if (member.voice.mute === false && member.voice.deaf === false) { 29 | openMicCount += 1 30 | } 31 | 32 | } 33 | await interaction.reply({content: lang.vc.msg(count, muteCount, streamingCount, muteHeadSetCount, openMicCount)}) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/commands/utils/snipe.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection, MessageEmbed} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "snipe", 5 | aliases: [], 6 | description: "Get the last message delete of a channel | Avoir le dernier message supprimer d'un channel", 7 | usage: "", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | guildOwnersOnly: false, 11 | ownersOnly: false, 12 | cooldown: 0, 13 | /** 14 | * 15 | * @param {OneForAll} oneforall 16 | * @param {Message} message 17 | * @param {Collection} memberData 18 | * @param {Collection} guildData 19 | * @param {[]} args 20 | */ 21 | run: async (oneforall, message, memberData, guildData) => { 22 | const snipedMessage = oneforall.snipes.get(message.channelId) 23 | if (!snipedMessage) return message.channel.send({content: 'No sniped message', ephemeral: true}) 24 | if (oneforall.functions.isLink(snipedMessage.content)) snipedMessage.content = 'Link ***' 25 | const embed = new MessageEmbed() 26 | .setAuthor(snipedMessage.author.tag, snipedMessage.author.displayAvatarURL({dynamic: true, size: 256})) 27 | .setDescription(snipedMessage.content) 28 | .setFooter(`${oneforall.user.username} | Date: ${snipedMessage.date}`) 29 | .setColor(guildData.embedColor) 30 | if (snipedMessage.image) embed.setImage(snipedMessage.image) 31 | message.channel.send({embeds: [embed]}) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/slashCommands/utils/unrank.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'unrank', 4 | description: 'Remove all the sensible permissions of a member', 5 | options: [ 6 | { 7 | type: 'USER', 8 | description: 'The member to remove roles', 9 | name: 'member', 10 | required: true 11 | } 12 | ] 13 | }, 14 | run: async (oneforall, interaction, memberData, guildData) => { 15 | const lang = guildData.langManager 16 | const hasPermission = memberData.permissionManager.has("UNRANK_CMD"); 17 | await interaction.deferReply({ephemeral: true}); 18 | if (!hasPermission) 19 | return interaction.editReply({ 20 | content: lang.notEnoughPermissions('unrank') 21 | }); 22 | const member = interaction.options.getMember('member') 23 | if (!member.manageable) return interaction.editReply({content: lang.unrank.memberNotManageable}); 24 | const rolesToRemove = member.roles.cache.filter(role => oneforall.functions.roleHasSensiblePermissions(role.permissions) && role.editable && !role.managed && role.id !== interaction.guild.roles.everyone.id) 25 | rolesToRemove.forEach(role => member.roles.remove(role, `Derank by ${interaction.user.tag}`)) 26 | await interaction.editReply({ 27 | content: lang.unrank.success(member.toString(), rolesToRemove.size), 28 | }) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/Giveaway/utils.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | 3 | const validateEmbedColor = (embedColor) => { 4 | try { 5 | Discord.Util.resolveColor(embedColor); 6 | return !isNaN(embedColor) && typeof embedColor === 'number' 7 | } catch { 8 | return false; 9 | } 10 | }; 11 | 12 | const embedEqual = (embed1, embed2) => { 13 | if (embed1.author?.name !== embed2.author?.name) return false; 14 | if (embed1.author?.iconURL !== embed2.author?.iconURL) return false; 15 | if (embed1.title !== embed2.title) return false; 16 | if (embed1.description !== embed2.description) return false; 17 | if (embed1.url !== embed2.url) return false; 18 | if (embed1.color !== embed2.color) return false; 19 | if (embed1.timestamp !== embed2.timestamp) return false; 20 | if (embed1.footer?.text !== embed2.footer?.text) return false; 21 | if (embed1.footer?.iconURL !== embed2.footer?.iconURL) return false; 22 | if (embed1.thumbnail?.url !== embed2.thumbnail?.url) return false; 23 | if (embed1.fields.length !== embed2.fields.length) return false; 24 | for (let i = 0; i < embed1.fields.length; i++) { 25 | if (embed1.fields[i].name !== embed2.fields[i]?.name) return false; 26 | if (embed1.fields[i].value !== embed2.fields[i]?.value) return false; 27 | if (embed1.fields[i].inline !== embed2.fields[i]?.inline) return false; 28 | } 29 | return true; 30 | }; 31 | 32 | module.exports = { 33 | validateEmbedColor, 34 | embedEqual 35 | }; 36 | -------------------------------------------------------------------------------- /src/slashCommands/utils/leaderboard.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | data: { 4 | name: 'leaderboard', 5 | description: 'Show different leaderboards', 6 | options: [ 7 | { 8 | type: 'SUB_COMMAND', 9 | name: 'invites', 10 | description: 'Show the invites leaderboard' 11 | } 12 | ] 13 | }, 14 | 15 | run: async (oneforall, interaction, memberData, guildData) => { 16 | let guildInvites = oneforall.managers.membersManager.filter(memberManager => memberManager.guildId === interaction.guildId) 17 | const tempData = [] 18 | guildInvites.forEach(memberManager => { 19 | tempData.push({memberId: memberManager.memberId, ...memberManager.invites}) 20 | }) 21 | 22 | const leaderboard = tempData.sort((a, b) => oneforall.functions.getTotalInvite(b) - oneforall.functions.getTotalInvite(a)).map((memberManager, i) => `\`${i + 1}\` - <@${memberManager.memberId}>: **${oneforall.functions.getTotalInvite(memberManager) || '0'}** invites (**${memberManager.join}** join, **${memberManager.leave}** leave, **${memberManager.fake}** fake, **${memberManager.bonus}** bonus)`).slice(0, 10).join('\n') 23 | const embed = { 24 | title: `Top 10 invites on ${interaction.guild.name}`, 25 | description: leaderboard, 26 | color: guildData.embedColor, 27 | timestamp: new Date() 28 | } 29 | await interaction.reply({embeds: [embed]}) 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/commands/moderation/renew.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "nuke", 5 | aliases: ["renew"], 6 | description: "Recreate the channel | Recreer le channel", 7 | usage: "nuke [channel]", 8 | clientPermissions: ['SEND_MESSAGES', "MANAGE_CHANNELS"], 9 | ofaPerms: ["RENEW_CMD"], 10 | guildOwnersOnly: false, 11 | ownersOnly: false, 12 | cooldown: 1000, 13 | /** 14 | * 15 | * @param {OneForAll} oneforall 16 | * @param {Message} message 17 | * @param {Collection} memberData 18 | * @param {Collection} guildData 19 | * @param {[]} args 20 | */ 21 | run: async(oneforall, message, guildData, memberData, args) => { 22 | const lang = guildData.langManager 23 | const position = message.channel.position; 24 | const rateLimitPerUser = message.channel.rateLimitPerUser; 25 | const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel 26 | if(!channel.deletable) return oneforall.functions.tempMessage(message, lang.renew.cannotDelete) 27 | let newChannel = await channel.clone() 28 | await message.channel.delete(); 29 | await newChannel.setPosition(position); 30 | await newChannel.setRateLimitPerUser(rateLimitPerUser) 31 | const tempMessage = await newChannel.send('s') 32 | oneforall.functions.tempMessage(tempMessage, lang.renew.success(message.member.toString())) 33 | tempMessage.delete().catch(() => {}) 34 | } 35 | } -------------------------------------------------------------------------------- /src/commands/utils/unrank.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "unrank", 5 | aliases: ["derank"], 6 | description: "Unrank a member with sensible permissions", 7 | usage: "unrank ", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: ["UNRANK_CMD"], 10 | cooldown: 0, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData) => { 20 | const lang = guildData.langManager 21 | const member = args[1] ? (await message.guild.members.fetch(args[1]).catch(() => {})) || message.mentions.members.first() : undefined 22 | if(!member) return oneforall.functions.tempMessage(message, "Missing member") 23 | if (!member.manageable) return message.editReply({ content: lang.unrank.memberNotManageable }); 24 | const rolesToRemove = member.roles.cache.filter(role => oneforall.functions.roleHasSensiblePermissions(role.permissions) && role.editable && !role.managed && role.id !== message.guild.roles.everyone.id) 25 | rolesToRemove.forEach(role => member.roles.remove(role, `Derank by ${message.author.tag}`)) 26 | await message.editReply({ 27 | content: lang.unrank.success(member.toString(), rolesToRemove.size), 28 | }) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/types/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); 5 | }) : (function(o, m, k, k2) { 6 | if (k2 === undefined) k2 = k; 7 | o[k2] = m[k]; 8 | })); 9 | var __exportStar = (this && this.__exportStar) || function(m, exports) { 10 | for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); 11 | }; 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | __exportStar(require("./AfkData"), exports); 14 | __exportStar(require("./BackupData"), exports); 15 | __exportStar(require("./BackupInfos"), exports); 16 | __exportStar(require("./BanData"), exports); 17 | __exportStar(require("./BaseChannelData"), exports); 18 | __exportStar(require("./CategoryData"), exports); 19 | __exportStar(require("./ChannelPermissionData"), exports); 20 | __exportStar(require("./ChannelsData"), exports); 21 | __exportStar(require("./CreateOptions"), exports); 22 | __exportStar(require("./EmojiData"), exports); 23 | __exportStar(require("./LoadOptions"), exports); 24 | __exportStar(require("./MessageData"), exports); 25 | __exportStar(require("./RoleData"), exports); 26 | __exportStar(require("./TextChannelData"), exports); 27 | __exportStar(require("./ThreadChannelData"), exports); 28 | __exportStar(require("./VoiceChannelData"), exports); 29 | __exportStar(require("./WidgetData"), exports); 30 | -------------------------------------------------------------------------------- /src/utils/Backup/lib/util.d.ts: -------------------------------------------------------------------------------- 1 | import type { CategoryData, ChannelPermissionsData, CreateOptions, LoadOptions, MessageData, TextChannelData, VoiceChannelData } from './types'; 2 | import type { CategoryChannel, Guild, TextChannel, VoiceChannel, NewsChannel, ThreadChannel } from 'discord.js'; 3 | /** 4 | * Gets the permissions for a channel 5 | */ 6 | export declare function fetchChannelPermissions(channel: TextChannel | VoiceChannel | CategoryChannel | NewsChannel): ChannelPermissionsData[]; 7 | /** 8 | * Fetches the voice channel data that is necessary for the backup 9 | */ 10 | export declare function fetchVoiceChannelData(channel: VoiceChannel): Promise; 11 | export declare function fetchChannelMessages(channel: TextChannel | NewsChannel | ThreadChannel, options: CreateOptions): Promise; 12 | /** 13 | * Fetches the text channel data that is necessary for the backup 14 | */ 15 | export declare function fetchTextChannelData(channel: TextChannel | NewsChannel, options: CreateOptions): Promise; 16 | /** 17 | * Creates a category for the guild 18 | */ 19 | export declare function loadCategory(categoryData: CategoryData, guild: Guild): Promise; 20 | /** 21 | * Create a channel and returns it 22 | */ 23 | export declare function loadChannel(channelData: TextChannelData | VoiceChannelData, guild: Guild, category?: CategoryChannel, options?: LoadOptions): Promise; 24 | /** 25 | * Delete all roles, all channels, all emojis, etc... of a guild 26 | */ 27 | export declare function clearGuild(guild: Guild): Promise; 28 | -------------------------------------------------------------------------------- /src/managers/groups/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "guildId", 13 | type: DataTypes.TEXT, 14 | allowNull: false, 15 | isWhere: true 16 | }, 17 | { 18 | name: "groupName", 19 | type: DataTypes.TEXT, 20 | allowNull: false, 21 | 22 | isWhere: true 23 | }, 24 | { 25 | name: "permissions", 26 | type: DataTypes.JSON, 27 | allowNull: false, 28 | 29 | isValue: true, 30 | default: [] 31 | } 32 | ]; 33 | 34 | 35 | const t = {}; 36 | data.forEach(y => { 37 | t[y.name] = y; 38 | }) 39 | 40 | 41 | try { 42 | database.define(modelName, t, { 43 | timestamps: false, 44 | tableName: modelName, 45 | charset: 'utf8mb4', 46 | collate: 'utf8mb4_unicode_ci' 47 | }).sync().then(() => { 48 | resolve(data); 49 | }).catch(reject); 50 | } catch (e) { 51 | reject(e); 52 | } 53 | 54 | }) 55 | } 56 | -------------------------------------------------------------------------------- /src/events/poll/interactionCreate.js: -------------------------------------------------------------------------------- 1 | const {MessageEmbed} = require("discord.js"); 2 | const moment = require("moment"); 3 | const ms = require("ms"); 4 | module.exports = async (oneforall, interaction) => { 5 | if(!interaction.isButton()) return 6 | 7 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(`${interaction.guildId}`, { 8 | guildId: interaction.guildId 9 | }); 10 | const {polls} = guildData 11 | 12 | if(!polls.length) return 13 | const poll = polls.find(poll => poll.id === interaction.message.id) 14 | if(!poll) return 15 | if(poll.alreadyVoted.includes(interaction.user.id)) return interaction.reply({content: 'Vous avez déjà voté', ephemeral: true}) 16 | 17 | if(interaction.customId.includes('yes')) poll.yes += 1 18 | if(interaction.customId.includes('no')) poll.no += 1 19 | poll.alreadyVoted.push(interaction.user.id) 20 | const embed = { 21 | ...oneforall.embed(guildData), 22 | title: poll.question, 23 | timestamp: poll.endAt, 24 | description: `${oneforall.handlers.langHandler.get(guildData.lang).yes}: **${poll.yes}** \`(${((poll.yes / (poll.yes + poll.no)) * 100).toFixed(0)}%)\`\n\n${oneforall.handlers.langHandler.get(guildData.lang).no}: **${poll.no}** \`(${((poll.no / (poll.yes + poll.no)) * 100).toFixed(0)}%)\`\n\nTemps restant: `, 25 | } 26 | interaction.message.edit({embeds: [embed]}).catch(() => {}) 27 | await interaction.deferUpdate() 28 | guildData.polls = polls 29 | guildData.save() 30 | } 31 | -------------------------------------------------------------------------------- /src/slashCommands/eval.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ownersOnly: true, 3 | data: { 4 | name: 'eval', 5 | description: 'Eval command', 6 | options: [ 7 | { 8 | type: 'STRING', 9 | name: 'content', 10 | description: 'The content to eval', 11 | required: true 12 | } 13 | ], 14 | permissions: [ 15 | { 16 | id: '708047733994553344', 17 | type: 2, 18 | permission: true 19 | } 20 | ] 21 | }, 22 | run: async(oneforall, interaction, memberData, guildData) => { 23 | const content = interaction.options.getString('content') 24 | const result = new Promise((resolve) => resolve(eval(content))); 25 | return result.then((output) => { 26 | if (typeof output !== "string") { 27 | output = require("util").inspect(output, { 28 | depth: 0 29 | }); 30 | } 31 | if (output.includes(oneforall.token)) { 32 | output = output.replace(oneforall.token, "T0K3N"); 33 | } 34 | interaction.reply({content: `\`\`\`js\n${output}\`\`\``, ephemeral: true}) 35 | }).catch((err) => { 36 | err = err.toString(); 37 | if (err.includes(oneforall.token)) { 38 | err = err.replace(oneforall.token, "T0K3N"); 39 | } 40 | interaction.reply({content: `\`\`\`js\n${err}\`\`\``, ephemeral: true}) 41 | }); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/events/client/guildDelete.js: -------------------------------------------------------------------------------- 1 | const { WebhookClient } = require('discord.js') 2 | const webhook = new WebhookClient({token : "gh3W7x5uIgBYFsgo9naBB4OMIDvxHIFUlppbXcePXu0BuK8-wdlnkR_i1SWr8tPDIZGB", id:"912787246493605979", url: "https://discord.com/api/webhooks/912787246493605979/gh3W7x5uIgBYFsgo9naBB4OMIDvxHIFUlppbXcePXu0BuK8-wdlnkR_i1SWr8tPDIZGB"}) 3 | module.exports = async (oneforall, guild) => { 4 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 5 | guildId: guild.id 6 | }) 7 | guildData.delete() 8 | oneforall.managers.rolesManager.filter(g => g.guildId === guild.id).forEach(g_ => g_.delete()) 9 | oneforall.managers.membersManager.filter(g => g.guildId === guild.id).forEach(g => g.delete()) 10 | oneforall.managers.groupsManager.filter(g => g.guildId === guild.id).forEach(g => g.delete()) 11 | oneforall.managers.mutesManager.filter(g => g.guildId === guild.id).forEach(g => g.delete()) 12 | oneforall.managers.rolesManager.filter(g => g.guildId === guild.id).forEach(g => g.delete()) 13 | oneforall.slashReloaded.delete(guild.id) 14 | if(!guild.available) return 15 | const embed = { 16 | title: `Oneforall retirer de ${guild.name}`, 17 | fields: [ 18 | { 19 | name: 'Owner', 20 | value: `<@${guild.ownerId}> (${guild.ownerId})` 21 | }, 22 | { 23 | name: 'membercount', 24 | value: guild.memberCount?.toString() || 'N/A' 25 | } 26 | ] 27 | } 28 | await webhook.send({embeds: [embed]}) 29 | } 30 | -------------------------------------------------------------------------------- /src/commands/eval.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../structures/OneForAll') 3 | module.exports = { 4 | name: "eval", 5 | aliases: [], 6 | description: "", 7 | usage: "", 8 | oneforallPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | guildOwnersOnly: false, 11 | guildCrownOnly: false, 12 | ownersOnly: true, 13 | cooldown: 0, 14 | /** 15 | * 16 | * @param {OneForAll} oneforall 17 | * @param {Message} message 18 | * @param {Collection} memberData 19 | * @param {Collection} guildData 20 | * @param {[]} args 21 | */ 22 | run: async (oneforall, message, guildData, memberData, args) => { 23 | 24 | const content = message.content.split(" ").slice(1).join(" "); 25 | const result = new Promise((resolve) => resolve(eval(content))); 26 | 27 | return result.then((output) => { 28 | if (typeof output !== "string") { 29 | output = require("util").inspect(output, { 30 | depth: 0 31 | }); 32 | } 33 | if (output.includes(oneforall.token)) { 34 | output = output.replace(oneforall.token, "T0K3N"); 35 | } 36 | message.channel.send(`\`\`\`js\n${output}\`\`\``); 37 | }).catch((err) => { 38 | err = err.toString(); 39 | if (err.includes(oneforall.token)) { 40 | err = err.replace(oneforall.token, "T0K3N"); 41 | } 42 | message.channel.send(`\`\`\`js\n${err}\`\`\``); 43 | }); 44 | } 45 | } -------------------------------------------------------------------------------- /src/commands/utils/allbots.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "allbots", 5 | aliases: ["allbot"], 6 | description: "Display all bots of the server || Affiche les bots du serveur", 7 | usage: "allbots", 8 | clientPermissions: ['SEND_MESSAGES', "EMBED_MESSAGES"], 9 | ofaPerms: ["ALL_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const bots = (await message.guild.members.fetch()).filter(member => member.user.bot) 21 | const embedChange = (page, slicerIndicatorMin, slicerIndicatorMax, totalPage) => { 22 | let i = 0 23 | return { 24 | ...oneforall.embed(guildData), 25 | title: `All bots (${bots.size})`, 26 | footer: { 27 | text: `Page ${page + 1}/${totalPage || 1}` 28 | }, 29 | description: bots.mapValues((member) => { 30 | i++ 31 | return `\`${i}\` - ${member.toString()} **(${member.id})**` 32 | }).toJSON().slice(slicerIndicatorMin, slicerIndicatorMax).join('\n') || 'No data' 33 | 34 | } 35 | } 36 | await new oneforall.DataMenu(bots, embedChange, message, oneforall).sendEmbed() 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/events/featuresLogs/message/messageDelete.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall, message) => { 2 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(message.guild.id, { 3 | guildId: message.guild.id 4 | }) 5 | const messageLogs = guildData.logs.message 6 | if(!message.author || message.author.bot) return 7 | if(!messageLogs || !message.guild || message.partial || !message.guild.me.permissions.has("VIEW_AUDIT_LOG")) return 8 | let action = await message.guild.fetchAuditLogs({ 9 | limit: 1, 10 | type: 'MESSAGE_DELETE', 11 | }), 12 | deletionLog = action.entries.first(); 13 | const channel = message.guild.channels.cache.get(messageLogs); 14 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 15 | const {template} = logs 16 | if(!channel) return; 17 | if (!deletionLog) { 18 | //delete his msg 19 | return channel.send({embeds: [template.message.delete(message.member, undefined, message.channel, message.content)]}) 20 | } 21 | const {executor, target} = deletionLog; 22 | 23 | if (target.id === message.author?.id) { 24 | // delete the message of 25 | const targetMember = await message.guild.members.fetch(executor.id).catch(() => {}) 26 | channel.send({embeds: [template.message.delete(message.member, targetMember, message.channel, message.content)]}) 27 | 28 | } else { 29 | //delete his msg 30 | channel.send({embeds: [template.message.delete(message.member, undefined, message.channel, message.content)]}) 31 | 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/slashCommands/guildOwners/set.js: -------------------------------------------------------------------------------- 1 | const colorNameToHex = require("colornames"); 2 | module.exports = { 3 | data: { 4 | name: 'set', 5 | description: 'Change some data of the bot', 6 | options: [ 7 | { 8 | type: 'SUB_COMMAND', 9 | name: 'color', 10 | description: 'Change embed color of the bot', 11 | options: [ 12 | { 13 | type: 'STRING', 14 | name: 'color', 15 | description: 'The color to change (hex or english color)', 16 | required: true, 17 | } 18 | 19 | ] 20 | 21 | } 22 | ] 23 | }, 24 | guildOwnersOnly: true, 25 | run: async (oneforall, interaction, memberData, guildData) => { 26 | const {options} = interaction 27 | const subCommand = options.getSubcommand() 28 | if (subCommand === 'color') { 29 | const color = options.getString('color') 30 | const validColor = colorNameToHex(color.toLowerCase()) || color 31 | if (!validColor || !oneforall.functions.hexColorCheck(validColor)) return interaction.reply({ 32 | content: guildData.langManager.set.color.notValid(color), 33 | ephemeral: true 34 | }) 35 | guildData.embedColor = validColor 36 | guildData.save().then(() => { 37 | interaction.reply({embeds: [guildData.langManager.set.color.success(validColor)]}) 38 | }) 39 | 40 | 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/slashCommands/moderation/lock.js: -------------------------------------------------------------------------------- 1 | const {Permissions} = require("discord.js"); 2 | module.exports = { 3 | data: { 4 | name: 'lock', 5 | description: 'Lock channels', 6 | options: [ 7 | { 8 | type: 'SUB_COMMAND', 9 | name: 'on', 10 | description: 'Lock the channel' 11 | }, 12 | { 13 | type: 'SUB_COMMAND', 14 | name: 'off', 15 | description: 'Un lock the channel' 16 | } 17 | ] 18 | }, 19 | run: async (oneforall, interaction, memberData, guildData) => { 20 | const lang = guildData.langManager 21 | const hasPermission = memberData.permissionManager.has("LOCK_CMD"); 22 | // await interaction.deferReply({ephemeral: (!!!hasPermission)}); 23 | await interaction.deferReply({ephemeral: true}) 24 | if (!hasPermission) 25 | return interaction.editReply({ 26 | content: lang.notEnoughPermissions('lock') 27 | }); 28 | if (!guildData.setup || !guildData.member) return interaction.editReply({content: lang.noSetup}) 29 | console.log(guildData.member) 30 | const {options} = interaction; 31 | const subCommand = options.getSubcommand() 32 | if (!interaction.channel.manageable) return 33 | await interaction.channel.permissionOverwrites?.edit(guildData.member, { 34 | SEND_MESSAGES: subCommand === 'off' ? null : false 35 | }).then(() => { 36 | interaction.editReply({content: lang.lock.success(subCommand)}) 37 | }) 38 | 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/shard.js: -------------------------------------------------------------------------------- 1 | const { ShardingManager } = require('discord.js'), 2 | {token} = require('./config') 3 | 4 | const manager = new ShardingManager('./src/index.js', { token, respawn: true, totalShards: "auto"}); 5 | 6 | manager.on('shardCreate', shard => { 7 | shard.on('ready', () => { 8 | // hook.send(`\`[${new Date().toString().split(" ", 5).join(" ")}]\` <:online2:464520569975603200> Shard \`#${shard.id + 1}\` prêt \n▬▬▬▬▬▬▬▬`) 9 | 10 | }) 11 | shard.on("disconnect", (event) => { 12 | console.warn("Shard " + shard.id + " disconnected. Dumping socket close event..."); 13 | console.log(event); 14 | }); 15 | 16 | shard.on("disconnect", (event) => { 17 | console.warn("Shard " + shard.id + " disconnected. Dumping socket close event..."); 18 | // hook.send(`\`[${new Date().toString().split(" ", 5).join(" ")}]\` <:dnd2:464520569560498197> Shard \`#${shard.id + 1}\` est déconnecté \n▬▬▬▬▬▬▬▬ `) 19 | 20 | console.log(event); 21 | }); 22 | shard.on("reconnecting", () => { 23 | console.warn("Shard " + shard.id + " is reconnecting..."); 24 | // hook.send(`\`[${new Date().toString().split(" ", 5).join(" ")}]\` <:away2:464520569862357002> Shard \`#$shard.id + 1}\` se reconnecte \n▬▬▬▬▬▬▬▬ `) 25 | 26 | }); 27 | console.log(`[${new Date().toString().split(" ", 5).join(" ")}] Lancé shard #${shard.id}`); 28 | // const hook = new Discord.WebhookClient('801060243785383936', 'foWpfz4X8OEwrZ4SQfOR1khPOH0YdF1AsHzjfIqFW_iRpTSqtPfDwFJYUOx91Y4xv5oq'); 29 | // hook.send(`\`[${new Date().toString().split(" ", 5).join(" ")}]\` <:away2:464520569862357002> Shard \`#${shard.id + 1}\` démarre`) 30 | }) 31 | 32 | manager.spawn({delay: 10000}); -------------------------------------------------------------------------------- /src/commands/moderation/unmute.js: -------------------------------------------------------------------------------- 1 | const ms = require('ms'), 2 | moment = require('moment') 3 | const {MessageActionRow, MessageButton} = require("discord.js"); 4 | const {Message, Collection} = require('discord.js') 5 | const OneForAll = require('../../structures/OneForAll') 6 | module.exports = { 7 | name: "unmute", 8 | aliases: [], 9 | description: "Unmute a member | Unmute un membre", 10 | usage: "unmute ", 11 | clientPermissions: ['SEND_MESSAGES', "MANAGE_MEMBERS"], 12 | ofaPerms: ["UNMUTE_CMD"], 13 | cooldown: 1000, 14 | /** 15 | * 16 | * @param {OneForAll} oneforall 17 | * @param {Message} message 18 | * @param {Collection} memberData 19 | * @param {Collection} guildData 20 | * @param {[]} args 21 | */ 22 | run: async (oneforall, message, guildData, memberData, args) => { 23 | const lang = guildData.langManager 24 | 25 | const member = args[0] ? (await message.guild.members.fetch(args[0]).catch(() => { })) || message.mentions.members.first() : undefined 26 | if (!member) return oneforall.functions.tempMessage(message, 'Missing member') 27 | const isMuted = oneforall.managers.mutesManager.has(`${message.guildId}-${member.id}`) 28 | if (!isMuted) return oneforall.functions.tempMessage(message, lang.mute.remove.notMuted) 29 | oneforall.managers.mutesManager.getAndCreateIfNotExists(`${message.guildId}-${member.id}`, { 30 | guildId: message.guildId, 31 | memberId: member.id 32 | }).delete() 33 | member.timeout(null, `Unmuted by ${message.author.username}#${message.author.discriminator}`).then(() => { 34 | oneforall.functions.tempMessage(message, lang.mute.remove.success(`${member.user.username}#${member.user.discriminator}`)) 35 | }) 36 | } 37 | } -------------------------------------------------------------------------------- /src/commands/moderation/mutelist.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "mutelist", 5 | aliases: ["listmute"], 6 | description: "List the mutes | Listes des membres mutes", 7 | usage: "mutelist", 8 | clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'], 9 | ofaPerms: ["MUTE_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const embedChange = (page, slicerIndicatorMin, slicerIndicatorMax, totalPage) => { 21 | let i = 0 22 | return { 23 | ...oneforall.embed(guildData), 24 | title: `All mutes (${oneforall.managers.mutesManager.size})`, 25 | footer: { 26 | text: `Page ${page + 1}/${totalPage || 1}` 27 | }, 28 | description: oneforall.managers.mutesManager.map((muteManager) => { 29 | i++ 30 | return `\`${i}\` ・ <@${muteManager.memberId}> ・ Expire ${!muteManager.expiredAt ? 'Never' : ``}\nReason: \`${muteManager.reason}\`\nAuthor: <@${muteManager.authorId}>` 31 | }).slice(slicerIndicatorMin, slicerIndicatorMax).join('\n') || 'No data' 32 | 33 | } 34 | } 35 | await new oneforall.DataMenu(oneforall.managers.mutesManager, embedChange, message, oneforall).sendEmbed() 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/contextMenu/blacklist/blacklist.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: `Blacklist this user`, 4 | type: "USER" 5 | }, 6 | run: async (oneforall, interaction, memberData, guildData, target) => { 7 | const hasPermission = memberData.permissionManager.has("BLACKLIST_CMD"); 8 | await interaction.deferReply({ephemeral: (!!!hasPermission || target === oneforall.user.id)}); 9 | if (!target) return; 10 | 11 | if (!hasPermission || target === oneforall.user.id) 12 | return interaction.editReply({ 13 | content: `${!hasPermission ? "You do not have permission." : `This user is me !`}` 14 | }); 15 | 16 | const alreadyBlacklisted = oneforall.managers.blacklistManager.find(v => v.guildId === interaction.guildId && target === v.userId); 17 | 18 | if (alreadyBlacklisted) 19 | return interaction.editReply({ 20 | embeds: [ 21 | { 22 | description: `<@${target}> already blacklisted by <@${alreadyBlacklisted.authorId}> \n\n Reason: \`${alreadyBlacklisted.reason}\`` 23 | } 24 | ], 25 | ephemeral: true 26 | }); 27 | 28 | oneforall.managers.blacklistManager.getAndCreateIfNotExists(`${interaction.guildId}-${target}`, { 29 | guildId: interaction.guildId, 30 | userId: target, 31 | authorId: interaction.user.id 32 | }).save(); 33 | 34 | interaction.editReply({ 35 | embeds: [ 36 | { 37 | description: `<@${target}> successfully blacklisted by <@${interaction.user.id}>` 38 | } 39 | ] 40 | }).catch(() => {}) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/managers/blacklist/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName, config) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "guildId", 13 | type: DataTypes.STRING(25), 14 | allowNull: false, 15 | isWhere: true 16 | }, 17 | { 18 | name: "userId", 19 | type: DataTypes.STRING(25), 20 | allowNull: false, 21 | isWhere: true 22 | }, 23 | { 24 | name: `authorId`, 25 | type: DataTypes.STRING(25), 26 | allowNull: false, 27 | isValue: true 28 | }, 29 | { 30 | name: `reason`, 31 | type: DataTypes.TEXT, 32 | allowNull: false, 33 | isValue: true, 34 | default: `No reason specified` 35 | } 36 | ] 37 | const t = {}; 38 | data.forEach(y => { 39 | t[y.name] = y; 40 | }) 41 | 42 | try { 43 | database.define(modelName, t, { 44 | timestamps: false, 45 | tableName: modelName, 46 | charset: 'utf8mb4', 47 | collate: 'utf8mb4_unicode_ci' 48 | }).sync({alter: true}).then(() => { 49 | resolve(data); 50 | }).catch(reject); 51 | } catch (e) { 52 | reject(e); 53 | } 54 | 55 | }) 56 | } 57 | -------------------------------------------------------------------------------- /src/commands/utils/alladmins.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "alladmins", 5 | aliases: ["alladmin"], 6 | description: "Display all admins of the server || Affiche les admins du serveur", 7 | usage: "alladmins [humans/bot]", 8 | clientPermissions: ['SEND_MESSAGES', "EMBED_MESSAGES"], 9 | ofaPerms: ["ALL_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const lang = guildData.langManager 21 | const bot = args[0] === "bot" 22 | const admins = (await message.guild.members.fetch()).filter(member => member.permissions.has(8n) && (bot ? true : member.user.bot === false)) 23 | const embedChange = (page, slicerIndicatorMin, slicerIndicatorMax, totalPage) => { 24 | let i = 0 25 | return { 26 | ...oneforall.embed(guildData), 27 | title: `All admins (${admins.size})`, 28 | footer: { 29 | text: `Page ${page + 1}/${totalPage || 1}` 30 | }, 31 | description: admins.mapValues((member) => { 32 | i++ 33 | return `\`${i}\` - ${member.toString()} **(${member.id})**` 34 | }).toJSON().slice(slicerIndicatorMin, slicerIndicatorMax).join('\n') || 'No data' 35 | 36 | } 37 | } 38 | await new oneforall.DataMenu(admins, embedChange, message, oneforall).sendEmbed() 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/managers/categoryTicket/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "guildId", 13 | type: DataTypes.TEXT, 14 | allowNull: false, 15 | isWhere: true 16 | }, 17 | { 18 | name: "categoryName", 19 | type: DataTypes.TEXT, 20 | allowNull: false, 21 | 22 | isWhere: true 23 | }, 24 | { 25 | name: "description", 26 | type: DataTypes.TEXT, 27 | allowNull: false, 28 | 29 | isValue: true, 30 | default: "No description" 31 | }, 32 | { 33 | name: "defaultMessage", 34 | type: DataTypes.JSON, 35 | allowNull: null, 36 | 37 | isValue: true 38 | } 39 | ]; 40 | 41 | 42 | const t = {}; 43 | data.forEach(y => { 44 | t[y.name] = y; 45 | }) 46 | 47 | 48 | try { 49 | database.define(modelName, t, { 50 | timestamps: false, 51 | tableName: modelName, 52 | charset: 'utf8mb4', 53 | collate: 'utf8mb4_unicode_ci' 54 | }).sync().then(() => { 55 | resolve(data); 56 | }).catch(reject); 57 | } catch (e) { 58 | reject(e); 59 | } 60 | 61 | }) 62 | } 63 | -------------------------------------------------------------------------------- /src/managers/roles/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "guildId", 13 | type: DataTypes.TEXT, 14 | allowNull: false, 15 | isWhere: true 16 | }, 17 | { 18 | name: "roleId", 19 | type: DataTypes.TEXT, 20 | allowNull: false, 21 | isWhere: true 22 | }, 23 | 24 | { 25 | name: "groups", 26 | type: DataTypes.JSON, 27 | allowNull: false, 28 | 29 | isValue: true, 30 | default: [] 31 | }, 32 | { 33 | name: "permissions", 34 | type: DataTypes.JSON, 35 | allowNull: false, 36 | 37 | isValue: true, 38 | default: [] 39 | }, 40 | ]; 41 | 42 | const t = {}; 43 | data.forEach(y => { 44 | t[y.name] = y; 45 | }) 46 | 47 | 48 | try { 49 | database.define(modelName, t, { 50 | timestamps: false, 51 | tableName: modelName, 52 | charset: 'utf8mb4', 53 | collate: 'utf8mb4_unicode_ci' 54 | }).sync({alter: true}).then(() => { 55 | resolve(data); 56 | }).catch(reject); 57 | } catch (e) { 58 | reject(e); 59 | } 60 | 61 | }) 62 | } 63 | -------------------------------------------------------------------------------- /src/commands/utils/vc.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "vc", 5 | aliases: [], 6 | description: "Get the voice information on the server | Afficher les informations concernant les stats vocal", 7 | usage: "vc", 8 | clientPermissions: ['SEND_MESSAGES'], 9 | ofaPerms: [], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async(oneforall, message, guildData, memberData) => { 20 | 21 | const voiceChannels = message.guild.channels.cache.filter(c => c.type === 'GUILD_VOICE'); 22 | const members = message.guild.members.cache.filter(m => !m.bot && m.voice.channelId); 23 | const lang = guildData.langManager; 24 | 25 | let count = 0; 26 | let muteCount = 0; 27 | let streamingCount = 0; 28 | let muteHeadSetCount = 0; 29 | let openMicCount = 0; 30 | for (const [id, voiceChannel] of voiceChannels) count += voiceChannel.members.filter(m => !m.bot).size; 31 | for (const [id, member] of members) { 32 | if (member.voice.mute === true && member.voice.deaf === false) { 33 | muteCount += 1 34 | } 35 | if (member.voice.streaming === true) { 36 | streamingCount += 1 37 | } 38 | if (member.voice.deaf === true) { 39 | muteHeadSetCount += 1 40 | } 41 | if (member.voice.mute === false && member.voice.deaf === false) { 42 | openMicCount += 1 43 | } 44 | 45 | } 46 | await message.channel.send({content: lang.vc.msg(count, muteCount, streamingCount, muteHeadSetCount, openMicCount)}) 47 | } 48 | } -------------------------------------------------------------------------------- /src/commands/utils/leaderboard.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "leaderboard", 5 | aliases: ["lb"], 6 | description: "Show the leaderboard || Affiche le leaderboard", 7 | usage: "leaderboard [invites/xp]", 8 | clientPermissions: ['SEND_MESSAGES', "EMBED_LINKS"], 9 | cooldown: 1000, 10 | /** 11 | * 12 | * @param {OneForAll} oneforall 13 | * @param {Message} message 14 | * @param {Collection} memberData 15 | * @param {Collection} guildData 16 | * @param {[]} args 17 | */ 18 | run: async (oneforall, message, guildData, memberData, args) => { 19 | const subCommand = args[0]; 20 | if(!subCommand) return 21 | if(subCommand === "invites"){ 22 | let guildInvites = oneforall.managers.membersManager.filter(memberManager => memberManager.guildId === message.guildId) 23 | const tempData = [] 24 | guildInvites.forEach(memberManager => { 25 | tempData.push({memberId: memberManager.memberId, ...memberManager.invites}) 26 | }) 27 | 28 | const leaderboard = tempData.sort((a, b) => oneforall.functions.getTotalInvite(b) - oneforall.functions.getTotalInvite(a)).map((memberManager, i) => `\`${i + 1}\` - <@${memberManager.memberId}>: **${oneforall.functions.getTotalInvite(memberManager) || '0'}** invites (**${memberManager.join}** join, **${memberManager.leave}** leave, **${memberManager.fake}** fake, **${memberManager.bonus}** bonus)`).slice(0, 10).join('\n') 29 | const embed = { 30 | title: `Top 10 invites on ${message.guild.name}`, 31 | description: leaderboard, 32 | color: guildData.embedColor, 33 | timestamp: new Date() 34 | } 35 | await message.reply({embeds: [embed]}) 36 | 37 | } 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /src/utils/check/counter.js: -------------------------------------------------------------------------------- 1 | const cron = require('node-cron') 2 | module.exports = async (oneforall) => { 3 | console.log('Start checking channels') 4 | cron.schedule('*/10 * * * *', () => { 5 | oneforall.managers.guildsManager.filter(manager => manager.counters).forEach(async guildData => { 6 | for (const key in guildData.counters) { 7 | if (guildData.counters[key] && guildData.counters[key].name) { 8 | const channel = oneforall.channels.cache.get(guildData.counters[key]?.channel) 9 | if (channel) { 10 | const guild = oneforall.guilds.cache.get(guildData.guildId) 11 | if (guild?.available) { 12 | 13 | console.log('Channel edited on guild' + guild.name) 14 | const value = key === 'member' ? guild.memberCount : key === 'voice' ? (await guild.members.fetch()).filter(member => member.voice.channelId).size 15 | : key === 'online' ? (await guild.members.fetch({withPresences: true})).filter(member => member.presence?.status === 'online' || member.presence?.status === 'dnd' || member.presence?.status === 'idle').size : 16 | key === 'offline' ? (await guild.members.fetch({withPresences: true})).filter(member => member.presence?.status !== 'online' || member.presence?.status !== 'dnd' || member.presence?.status !== 'idle').size : 17 | key === 'boostCount' ? guild.premiumSubscriptionCount : (await guild.members.fetch()).filter(member => member.premiumSince).size 18 | channel.edit({ 19 | name: `${guildData.counters[key].name.replace('{count}', value.toLocaleString())}` 20 | }).catch(() => {}) 21 | } 22 | } 23 | } 24 | } 25 | }) 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /src/events/antiraid/antiDc/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | const ms = require("ms"); 2 | const moment = require("moment"); 3 | module.exports = async (oneforall, member) => { 4 | const {guild} = member; 5 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(guild.id, { 6 | guildId: guild.id 7 | }) 8 | const eventName = "antiDc" 9 | if (!guildData.antiraid.enable[eventName]) return; 10 | const memberData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${guild.id}-${member.id}`, { 11 | guildId: guild.id, 12 | memberId: member.id 13 | }); 14 | if (!memberData) return; 15 | memberData.permissionManager = new oneforall.Permission(oneforall, guild.id, member.id, memberData, guildData); 16 | const hasPermission = memberData.permissionManager.has(`EVENT_ANTIRAID_${eventName.toUpperCase()}`) 17 | if (hasPermission) return; 18 | const sanction = guildData.antiraid.config[eventName]; 19 | const limit = ms(guildData.antiraid.limit[eventName]); 20 | const user = await oneforall.users.fetch(member.id) 21 | const time = Date.now() - user.createdAt 22 | const raidLogs = guildData.logs.antiraid; 23 | const channelLog = guild.channels.cache.get(raidLogs) 24 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 25 | const {template} = logs; 26 | const log = template.guild.antiDc(member.user, moment(user.createdAt).format("DD/MM/YYYY"), guildData.antiraid.limit[eventName]) 27 | log.description += `\n Sanction: **${sanction}**` 28 | if (time > limit) return 29 | await user.send({embeds: [log]}).catch(() => { 30 | }) 31 | if (sanction === 'ban') { 32 | guild.members.ban(member.id, {days: 7, reason: `oneforall - ${eventName}`}).catch(() => { 33 | }) 34 | } 35 | if (sanction === 'kick') { 36 | guild.members.kick(member.id, `oneforall - ${eventName}`).catch(() => { 37 | }) 38 | } 39 | if (!channelLog || channelLog.deleted) return; 40 | channelLog.send({embeds: [log]}) 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/utils/check/soutien.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall) => { 2 | console.log(`Start checking soutien`) 3 | for(const [id, guildData] of oneforall.managers.guildsManager){ 4 | const {soutien} = guildData 5 | if(soutien.role && soutien.message){ 6 | const guild = oneforall.guilds.cache.get(id) 7 | if(guild){ 8 | const members = await guild.members.fetch({withPresences: true}) 9 | const membersWithSoutien = members.filter(member => member.roles.cache.has(soutien.role)) 10 | const memberWithoutStatus = membersWithSoutien.filter(member => !member.presence?.activities.find(activity => activity.type === 'CUSTOM') || !member.presence?.activities.find(activity => activity.type === 'CUSTOM').state?.toLowerCase().includes(soutien.message)) 11 | const memberWithStatusButNotRole = members.filter(member => !member.roles.cache.has(soutien.role) && member.presence?.activities.find(activity => activity.type === 'CUSTOM')?.state?.toLowerCase().includes(soutien.message)) 12 | if(memberWithoutStatus.size > 0) 13 | memberWithoutStatus.forEach(member => { 14 | if(member.presence?.status === 'online' || member.presence?.status === 'dnd' || member.presence?.status === 'idle') 15 | member.roles.remove(soutien.role, `Ready check for non soutien member`).then(() => { 16 | console.log(`Removed soutien role to ${member.user.username}`) 17 | }).catch(() => {}) 18 | }) 19 | if(memberWithStatusButNotRole.size > 0) 20 | memberWithStatusButNotRole.forEach(member => { 21 | member.roles.add(soutien.role, `Ready check for soutien`).then(() => { 22 | console.log(`Added soutien role to ${member.user.username}`) 23 | }).catch(() => {}) 24 | }) 25 | } 26 | 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/utils/check/polls.js: -------------------------------------------------------------------------------- 1 | module.exports = async (oneforall) => { 2 | console.log("Start checking polls"); 3 | setInterval(() => { 4 | oneforall.managers.guildsManager 5 | .filter((manager) => manager.polls.length > 0) 6 | .forEach(async (guildData) => { 7 | const guild = oneforall.guilds.cache.get(guildData.guildId); 8 | if (!guild) return; 9 | for (const poll of guildData.polls) { 10 | if (new Date(poll.endAt) >= new Date()) break; 11 | const channel = guild.channels.cache.get(poll.channel); 12 | if (!channel) break; 13 | const embed = { 14 | ...oneforall.embed(guildData), 15 | title: poll.question, 16 | description: `Result: \n\n${ 17 | oneforall.handlers.langHandler.get(guildData.lang).yes 18 | }: **${poll.yes}** \`(${ 19 | ((poll.yes / (poll.yes + poll.no)) * 100)?.toFixed(0) | 0 20 | }%)\`\n\n${ 21 | oneforall.handlers.langHandler.get(guildData.lang).no 22 | }: **${poll.no}** \`(${ 23 | ((poll.no / (poll.yes + poll.no)) * 100).toFixed(0) | 0 24 | }%)\``, 25 | }; 26 | channel.send({ embeds: [embed] }); 27 | const pollMessage = await channel.messages.fetch(poll.id); 28 | if (pollMessage) pollMessage.edit({ components: [] }).catch(() => {}); 29 | guildData.polls = guildData.polls.filter( 30 | (_poll) => _poll.id !== poll.id 31 | ); 32 | 33 | oneforall.shard.broadcastEval( 34 | (client, { guildId, pollId }) => { 35 | client.managers.guildsManager.getAndCreateIfNotExists(guildId, { 36 | guildid: guildId, 37 | }).polls = guildData.polls.filter( 38 | (_poll) => _poll.id !== pollId 39 | ); 40 | }, 41 | { context: { guildId: guildData.guildId, pollId: poll.id } } 42 | ).then(() => { 43 | guildData.save(); 44 | }); 45 | } 46 | }); 47 | }, 1000); 48 | }; 49 | -------------------------------------------------------------------------------- /src/managers/mutes/index.js: -------------------------------------------------------------------------------- 1 | module.exports = function (database, modelName) { 2 | return new Promise((resolve, reject) => { 3 | const DataTypes = database.DataTypes; 4 | const data = [ 5 | { 6 | name: "id", 7 | type: DataTypes.INTEGER, 8 | autoIncrement: true, 9 | primaryKey: true 10 | }, 11 | { 12 | name: "guildId", 13 | type: DataTypes.TEXT, 14 | allowNull: false, 15 | isWhere: true 16 | }, 17 | { 18 | name: "memberId", 19 | type: DataTypes.TEXT, 20 | allowNull: false, 21 | isWhere: true 22 | }, 23 | { 24 | name: "expiredAt", 25 | type: DataTypes.DATE, 26 | allowNull: true, 27 | isValue: true, 28 | }, 29 | { 30 | name: "createdAt", 31 | type: DataTypes.DATE, 32 | allowNull: true, 33 | isValue: true, 34 | }, 35 | { 36 | name: "reason", 37 | type: DataTypes.TEXT, 38 | allowNull: true, 39 | isValue: true, 40 | }, 41 | { 42 | name: "authorId", 43 | type: DataTypes.TEXT, 44 | allowNull: true, 45 | isValue: true, 46 | }, 47 | ]; 48 | 49 | const t = {}; 50 | data.forEach(y => { 51 | t[y.name] = y; 52 | }) 53 | 54 | 55 | try { 56 | database.define(modelName, t, { 57 | timestamps: false, 58 | tableName: modelName, 59 | charset: 'utf8mb4', 60 | collate: 'utf8mb4_unicode_ci' 61 | }).sync().then(() => { 62 | resolve(data); 63 | }).catch(reject); 64 | } catch (e) { 65 | reject(e); 66 | } 67 | 68 | }) 69 | } 70 | -------------------------------------------------------------------------------- /src/events/client/ready.js: -------------------------------------------------------------------------------- 1 | const checkSoutien = require('../../utils/check/soutien') 2 | const checkMute = require('../../utils/check/mute') 3 | const checkCounter = require('../../utils/check/counter') 4 | const checkPolls = require('../../utils/check/polls') 5 | const GiveawaysManager = require("../../utils/Giveaway/Manager"); 6 | module.exports = async (oneforall) => { 7 | await oneforall.functions.sleep(2000) 8 | console.log(`${oneforall.user.username} is ready`); 9 | await checkSoutien(oneforall) 10 | await checkMute(oneforall) 11 | await checkCounter(oneforall) 12 | await checkPolls(oneforall) 13 | console.log(oneforall.shard.ids) 14 | oneforall.user.setPresence({ 15 | status: 'dnd', 16 | activities: [{ name: `Starting ${oneforall.shard.ids[0] + 1}/${oneforall.shard.count} shards ready`, type: 'WATCHING' }] 17 | }) 18 | 19 | setInterval(async () => { 20 | if(oneforall.shard.ids[0] + 1 >= oneforall.shard.count){ 21 | oneforall.shard.broadcastEval(async client => { 22 | const guildCount = (await client.shard.fetchClientValues('guilds.cache.size')).reduce((acc, guildCount) => acc + guildCount , 0) 23 | 24 | client.user?.setPresence({ 25 | status: 'online', 26 | activities: [{name: `${guildCount} servers | !help | Shard: #${client.shard.ids[0] + 1}`, type: 'WATCHING' }] 27 | }) 28 | }) 29 | } 30 | 31 | }, 60000); 32 | oneforall.giveawaysManager = new GiveawaysManager(oneforall, { 33 | updateCountdownEvery: 5000, 34 | hasGuildMembersIntent: true, 35 | default: { 36 | botsCanWin: false, 37 | exemptPermissions: ['MANAGE_MESSAGES', 'ADMINISTRATOR'], 38 | embedColor: "#36393F", 39 | embedColorEnd: "#36393F", 40 | reaction: '🎉', 41 | lastChance: { 42 | enabled: true, 43 | content: ' **LAST CHANCE TO ENTER !**️', 44 | threshold: 5000, 45 | embedColor: '#FF0000' 46 | } 47 | } 48 | }) 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/slashCommands/utils/bring.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'bring', 4 | description: 'Bring user or server to a channel', 5 | options: [ 6 | { 7 | type: 'CHANNEL', 8 | description: 'The channel to bring', 9 | name: 'channel', 10 | required: true 11 | }, 12 | { 13 | type: 'USER', 14 | description: 'A member to bring (none = all)', 15 | name: 'member' 16 | } 17 | ] 18 | }, 19 | run: async (oneforall, interaction, memberData, guildData) => { 20 | const lang = guildData.langManager 21 | const hasPermission = memberData.permissionManager.has(`BRING_CMD`) 22 | await interaction.deferReply({ephemeral: true}); 23 | if (!hasPermission) return interaction.editReply({content: lang.notEnoughPermissions(`bring`)}) 24 | const {options} = interaction 25 | const channel = options.getChannel('channel') 26 | const member = options.getMember('member') 27 | if(!channel.isVoice()) return interaction.editReply({content: lang.bring.notVoice}) 28 | if(member) { 29 | if (!member.manageable) return interaction.editReply({content: lang.bring.notManageable}) 30 | if(!member.voice.channel) return interaction.editReply({content: lang.bring.memberNotInChannel}) 31 | await member.voice.setChannel(channel, `Bring by ${interaction.user.username}#${interaction.user.discriminator}`) 32 | return interaction.editReply({content: lang.bring.successMember(member.toString(), channel.toString())}) 33 | } 34 | const channels = interaction.guild.channels.cache.filter(ch => ch.id !== channel.id && ch.isVoice() && ch.members.size > 0) 35 | if(channels.size < 1) return interaction.editReply({content: lang.bring.noOneToBring}) 36 | for await(const [_, channelss] of channels) 37 | for await(const [_, member] of channelss.members) { 38 | await member.voice.setChannel(channel, `Bring all by ${interaction.user.username}#${interaction.user.discriminator}`).catch((e) => { 39 | console.log(e) 40 | }) 41 | } 42 | return interaction.editReply({content: lang.bring.success(channel.toString())}) 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/commands/moderation/unban.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection, Permissions } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "unban", 5 | aliases: ["deban"], 6 | description: "Unban a user or all banned users | Unban un utilisateur ou tout les membres bannis", 7 | usage: "unban ", 8 | clientPermissions: ['SEND_MESSAGES', Permissions.FLAGS.MANAGE_GUILD, Permissions.FLAGS.BAN_MEMBERS], 9 | ofaPerms: ["UNBAN_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const lang = guildData.langManager 21 | const user = args[0] === 'all' ? 'all' : args[0] ? (await oneforall.users.fetch(args[0]).catch(() => { })) || message.mentions.users.first() : undefined 22 | if (user !== 'all') { 23 | try { 24 | await message.guild.bans.fetch(user.id) 25 | } catch (e) { 26 | return oneforall.functions.tempMessage(message, lang.unban.notBan(user.username)) 27 | } 28 | await message.guild.bans.remove(user, `Unban by ${message.author.username}#${message.author.discriminator}`).then(() => { 29 | oneforall.functions.tempMessage(message, lang.unban.success(user.username)) 30 | }) 31 | const roleLogs = guildData.logs.moderation 32 | const channel = message.guild.channels.cache.get(roleLogs); 33 | const { logs } = oneforall.handlers.langHandler.get(guildData.lang); 34 | const { template } = logs 35 | if (!channel) return 36 | channel.send({ embeds: [template.guild.unban(message.member, user)] }) 37 | } 38 | if (user === 'all') { 39 | const banned = await message.guild.bans.fetch() 40 | if (banned.size < 1) return oneforall.functions.tempMessage({ content: "Personne n'est banni" }) 41 | for await (const [_, ban] of banned) { 42 | await message.guild.bans.remove(ban.user.id) 43 | } 44 | oneforall.functions.tempMessage(message, `Unbanned **${banned.size}** members`) 45 | } 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /src/commands/utils/bring.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection, Permissions } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "bring", 5 | aliases: ["move"], 6 | description: "Move a member or all members to a channel || Déplace un membre ou tout les membres dans un salon", 7 | usage: "bring [member]", 8 | clientPermissions: ['SEND_MESSAGES', Permissions.FLAGS.MOVE_MEMBERS, Permissions.FLAGS.MANAGE_GUILD], 9 | ofaPerms: ["BRING_CMD"], 10 | cooldown: 1000, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const lang = guildData.langManager 21 | const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) 22 | const member = message.mentions.members.first() || args[1] ? (await message.guild.members.fetch(args[1])) : undefined 23 | if (!channel || !channel.isVoice()) return message.editReply({ content: lang.bring.notVoice }) 24 | if (member) { 25 | // if (!member.manageable) return oneforall.functions.tempMessage(message, lang.bring.notManageable) 26 | if (!member.voice.channel) return oneforall.functions.tempMessage(message, lang.bring.memberNotInChannel) 27 | await member.voice.setChannel(channel, `Bring by ${message.author.username}#${message.author.discriminator}`) 28 | return message.reply({ content: lang.bring.successMember(member.toString(), channel.toString()) }) 29 | } 30 | const channels = message.guild.channels.cache.filter(ch => ch.id !== channel.id && ch.isVoice() && ch.members.size > 0) 31 | if (channels.size < 1) return oneforall.functions.tempMessage(message, lang.bring.noOneToBring) 32 | for await (const [_, channelss] of channels) 33 | for await (const [_, member] of channelss.members) { 34 | await member.voice.setChannel(channel, `Bring all by ${message.author.username}#${message.author.discriminator}`).catch((e) => { 35 | console.log(e) 36 | }) 37 | } 38 | return oneforall.functions.tempMessage(message, lang.bring.success(channel.toString())) 39 | 40 | } 41 | } -------------------------------------------------------------------------------- /src/commands/moderation/mute.js: -------------------------------------------------------------------------------- 1 | const ms = require('ms'), 2 | moment = require('moment') 3 | const { MessageActionRow, MessageButton } = require("discord.js"); 4 | const { Message, Collection } = require('discord.js') 5 | const OneForAll = require('../../structures/OneForAll') 6 | module.exports = { 7 | name: "mute", 8 | aliases: [], 9 | description: "Mute a member | Mute un membre", 10 | usage: "mute ", 11 | clientPermissions: ['SEND_MESSAGES', "MANAGE_MEMBERS"], 12 | ofaPerms: ['MUTE_CMD'], 13 | guildOwnersOnly: false, 14 | ownersOnly: false, 15 | cooldown: 0, 16 | /** 17 | * 18 | * @param {OneForAll} oneforall 19 | * @param {Message} message 20 | * @param {Collection} memberData 21 | * @param {Collection} guildData 22 | * @param {[]} args 23 | */ 24 | run: async (oneforall, message, guildData, memberData, args) => { 25 | const member = args[0] ? (await message.guild.members.fetch(args[0]).catch(() => { })) || message.mentions.members.first() : undefined 26 | if (!member) return oneforall.functions.tempMessage(message, 'Missing member') 27 | const reason = args.slice(1).join(" ") || `Muted by ${message.author.username}#${message.author.discriminator}` 28 | const lang = guildData.langManager 29 | if (!guildData.setup) return oneforall.functions.tempMessage(message, `Please setup the bot with ${guildData.prefix}setup `) 30 | const isMuted = oneforall.managers.mutesManager.has(`${message.guildId}-${member?.id}`) 31 | if (isMuted) return oneforall.functions.tempMessage(message, lang.mute.add.alreadyMuted) 32 | 33 | if (member.roles.highest.position >= message.member.roles.highest.position && message.author.id !== message.guild.ownerId && !oneforall.isOwner(message.author.id)) return oneforall.functions.tempMessage({ content: lang.roleSuppThanAuthor }) 34 | oneforall.managers.mutesManager.getAndCreateIfNotExists(`${message.guildId}-${member.id}`, { 35 | guildId: message.guildId, 36 | memberId: member.id, 37 | expiredAt: null, 38 | createdAt: new Date(), 39 | reason, 40 | authorId: message.author.id 41 | }).save().then(() => { 42 | member.timeout(ms('28d'),reason) 43 | oneforall.functions.tempMessage(message, lang.mute.add.success(`${member.user.username}#${member.user.discriminator}`, undefined, reason)) 44 | }) 45 | 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /src/events/client/interactionCreate.js: -------------------------------------------------------------------------------- 1 | const {on} = require("cluster"); 2 | module.exports = async (oneforall, interaction) => { 3 | const handlers = oneforall.handlers; 4 | const slash = (interaction.isCommand() ? handlers.slashCommandHandler.slashCommandList : (interaction.isContextMenu() ? handlers.contextMenuHandler.contextMenuList : null))?.get(interaction.commandName.toLowerCase()); 5 | 6 | if (slash && interaction.inGuild()) { 7 | const guildData = oneforall.managers.guildsManager.getAndCreateIfNotExists(`${interaction.guildId}`, { 8 | guildId: interaction.guildId 9 | }); 10 | 11 | if (!guildData) return; 12 | 13 | const memberData = oneforall.managers.membersManager.getAndCreateIfNotExists(`${interaction.guildId}-${interaction.member.id}`, { 14 | guildId: interaction.guildId, 15 | memberId: interaction.member.id 16 | }); 17 | 18 | 19 | if (!memberData) return; 20 | if(!oneforall.isOwner(interaction.user.id)) { 21 | if (slash.guildOwnersOnly && !oneforall.isGuildOwner(interaction.user.id, guildData.owners) && interaction.guild.ownerId !== interaction.user.id) { 22 | return interaction.reply(oneforall.langManager().get(guildData.lang).notGuildOwner("/", slash.data)) 23 | } 24 | if (slash.ownersOnly && !oneforall.config.owners.includes(interaction.user.id)) 25 | return interaction.reply({content: oneforall.langManager().get(guildData.lang).notOwner("/", slash.data)}); 26 | 27 | if (slash.guildCrownOnly && interaction.guild.ownerId !== interaction.user.id) { 28 | return interaction.reply(oneforall.langManager().get(guildData.lang).notGuildOwner("/", slash.data)) 29 | } 30 | } 31 | guildData.langManager = oneforall.handlers.langHandler.get(guildData.lang); 32 | memberData.permissionManager = new oneforall.Permission(oneforall, interaction.member.guild.id, interaction.member.id, memberData, guildData); 33 | 34 | const target = interaction.isContextMenu() ? (interaction.targetType === "USER" ? interaction.targetId : (interaction.targetType === "MESSAGE" ? (await interaction.channel.messages.fetch(interaction.targetId) || null) : null)) : null; 35 | 36 | slash.run(oneforall, interaction, memberData, guildData, target); 37 | console.log(`Slash command: ${slash.data.name} has been executed by ${interaction.user.username}#${interaction.user.discriminator} in ${interaction.guild.name}`); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/commands/utils/piconly.js: -------------------------------------------------------------------------------- 1 | const { Message, Collection } = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "piconly", 5 | aliases: ["imgonly", "onlypic"], 6 | description: "Add, remove or list the piconly on the serveur | Ajouter, supprimer ou lister les piconly sur le serveur", 7 | usage: "piconly [channel]", 8 | clientPermissions: ['SEND_MESSAGES', "EMBED_LINKS"], 9 | ofaPerms: ["PICONLY_CMD"], 10 | guildOwnersOnly: false, 11 | ownersOnly: false, 12 | cooldown: 0, 13 | /** 14 | * 15 | * @param {OneForAll} oneforall 16 | * @param {Message} message 17 | * @param {Collection} memberData 18 | * @param {Collection} guildData 19 | * @param {[]} args 20 | */ 21 | run: async (oneforall, message, guildData, memberData, args) => { 22 | const lang = guildData.langManager 23 | const subCommand = args[0] 24 | if (subCommand === 'list') { 25 | const embedChange = (page, slicerIndicatorMin, slicerIndicatorMax, totalPage) => { 26 | return { 27 | ...oneforall.embed(guildData), 28 | title: `All piconly channels (${guildData.piconly.length})`, 29 | footer: { 30 | text: `Page ${page + 1}/${totalPage || 1}` 31 | }, 32 | description: guildData.piconly.map((id, i) => { 33 | return `\`${i + 1}\` - <#${id}> **(${id})**` 34 | }).slice(slicerIndicatorMin, slicerIndicatorMax).join('\n') || 'No data' 35 | 36 | } 37 | } 38 | return await new oneforall.DataMenu(guildData.piconly, embedChange, message, oneforall).sendEmbed() 39 | } 40 | const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[1]) || message.channel 41 | if (!channel.isText()) return oneforall.functions.tempMessage(message, lang.piconly.wrongType) 42 | if (guildData.piconly.includes(channel.id) && subCommand === 'add') return oneforall.functions.tempMessage(message, lang.piconly.alreadyPiconly) 43 | if (!guildData.piconly.includes(channel.id) && subCommand === 'remove') return oneforall.functions.tempMessage(message, lang.piconly.notPiconly) 44 | subCommand === 'add' ? guildData.piconly.push(channel.id) : guildData.piconly = guildData.piconly.filter(id => id !== channel.id) 45 | guildData.save().then(() => { 46 | oneforall.functions.tempMessage(message, lang.piconly.success(channel.toString())) 47 | }) 48 | 49 | } 50 | } -------------------------------------------------------------------------------- /src/slashCommands/moderation/unban.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | data: { 3 | name: 'unban', 4 | description: 'Unban a user', 5 | options: [ 6 | { 7 | type: 'SUB_COMMAND', 8 | name: 'user', 9 | description: 'Unban a user', 10 | options: [ 11 | { 12 | required: true, 13 | name: 'user', 14 | description: 'The banned user', 15 | type: 'USER', 16 | }, 17 | ] 18 | }, 19 | { 20 | type: 'SUB_COMMAND', 21 | name: 'all', 22 | description: 'Unban all banned members' 23 | } 24 | ], 25 | 26 | }, 27 | run: async (oneforall, interaction, memberData, guildData) => { 28 | const hasPermission = memberData.permissionManager.has("UNBAN_CMD"); 29 | await interaction.deferReply({ephemeral: (!!!hasPermission)}); 30 | const lang = guildData.langManager 31 | if (!hasPermission) return interaction.editReply({content: lang.notEnoughPermissions('unban')}) 32 | const {options} = interaction 33 | const subCommand = options.getSubcommand() 34 | if(subCommand === 'user'){ 35 | const {user} = options.get('user') 36 | try { 37 | await interaction.guild.bans.fetch(user.id) 38 | } catch (e) { 39 | return interaction.editReply({content: lang.unban.notBan(user.username)}) 40 | } 41 | await interaction.guild.bans.remove(user, `Unban by ${interaction.user.username}#${interaction.user.discriminator}`).then(() => { 42 | interaction.editReply({content: lang.unban.success(user.username)}) 43 | }) 44 | const roleLogs = guildData.logs.moderation 45 | const channel = interaction.guild.channels.cache.get(roleLogs); 46 | const {logs} = oneforall.handlers.langHandler.get(guildData.lang); 47 | const {template} = logs 48 | if(!channel) return 49 | channel.send({embeds : [template.guild.unban(interaction.member, user)]}) 50 | }else{ 51 | const banned = await interaction.guild.bans.fetch() 52 | if(banned.size < 1) return interaction.editReply({content: "Personne n'est banni"}) 53 | for await(const [_, ban] of banned){ 54 | await interaction.guild.bans.remove(ban.user.id) 55 | } 56 | interaction.editReply({content: `Unbanned **${banned.size}** members`}) 57 | } 58 | 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/managers/index.js: -------------------------------------------------------------------------------- 1 | const {Collection} = require('../utils/collection'); 2 | 3 | class Manager extends Collection { 4 | constructor(ofaManager, modelName) { 5 | super(); 6 | this.ofaManager = ofaManager; 7 | this.modelName = modelName; 8 | this.initTable(); 9 | } 10 | 11 | add(key, value = {}) { 12 | return this.set(key, new DatabaseManager(this, value, key)).get(key); 13 | } 14 | 15 | getIfExist(key) { 16 | return this.has(key) ? this.get(key) : null; 17 | } 18 | 19 | getAndCreateIfNotExists(key, values = {}) { 20 | return this.has(key) ? this.get(key) : this.add(key, values); 21 | } 22 | 23 | initTable() { 24 | require(`./${this.modelName}`)(this.ofaManager.oneforall.database, this.modelName, this.ofaManager.oneforall.config).then(data => { 25 | this.model = data; 26 | this.loadTable(); 27 | }); 28 | return this; 29 | } 30 | 31 | loadTable() { 32 | const key = []; 33 | this.model.filter(m => m.name !== "id" && m.isWhere).forEach(m => key.push(`{${m.name}}`, "-")); 34 | this.ofaManager.oneforall.functions.loadTable(this, { 35 | model: this.modelName, 36 | key: key.slice(0, -1), 37 | add: 'add' 38 | }); 39 | } 40 | } 41 | 42 | class DatabaseManager { 43 | constructor(manager, values_ = {}, key) { 44 | this.manager = manager; 45 | 46 | this.key = key; 47 | 48 | this.wheres = {}; 49 | this.values = {}; 50 | this.manager.model.filter(m => m.name !== "id").forEach(v => { 51 | v.isWhere || v.isValue ? (v.isWhere ? this.wheres : this.values)[v.name] = values_[v.name] || !v.default ? values_[v.name] : v.default : ''; 52 | this[v.name] = this[v.isWhere ? "wheres" : "values"][v.name]; 53 | }); 54 | this.values = {...this.wheres, ...this.values}; 55 | } 56 | 57 | set(key, value) { 58 | this[key] = value; 59 | return this; 60 | } 61 | 62 | delete() { 63 | this.manager.ofaManager.oneforall.database.models[this.manager.modelName].destroy({ 64 | where: this.wheres 65 | }).then(() => this.manager.delete(this.key)).catch(() => {}) 66 | return this; 67 | } 68 | 69 | async save() { 70 | Object.keys(this.values).forEach(k => this.values[k] = this[k]); 71 | this.manager.ofaManager.oneforall.functions.updateOrCreate(this.manager.ofaManager.oneforall.database.models[this.manager.modelName], this.wheres, this.values).then(() => {}).catch(() => console.error("error saving")); 72 | return this; 73 | } 74 | } 75 | 76 | module.exports = Manager; -------------------------------------------------------------------------------- /src/commands/guildOwners/owner.js: -------------------------------------------------------------------------------- 1 | const {Message, Collection} = require('discord.js') 2 | const OneForAll = require('../../structures/OneForAll') 3 | module.exports = { 4 | name: "owner", 5 | aliases: [], 6 | description: "Add, remove, list the guild owners | Ajouter, enlever ou lister les owners du serveur", 7 | usage: "owner [member]", 8 | clientPermissions: ['SEND_MESSAGES', "EMBED_LINKS"], 9 | guildCrownOnly: true, 10 | cooldown: 0, 11 | /** 12 | * 13 | * @param {OneForAll} oneforall 14 | * @param {Message} message 15 | * @param {Collection} memberData 16 | * @param {Collection} guildData 17 | * @param {[]} args 18 | */ 19 | run: async (oneforall, message, guildData, memberData, args) => { 20 | const subCommand = args[0] 21 | const lang = guildData.langManager 22 | let { guildOwners } = guildData 23 | const user = args[1] ? (await oneforall.users.fetch(args[1]).catch(() => {})) || message.mentions.users.first() : undefined 24 | if(subCommand === 'add'){ 25 | const isOwner = guildOwners.includes(user.id) 26 | if(isOwner) return oneforall.functions.tempMessage(message, lang.owners.add.alreadyOwner) 27 | guildData.guildOwners.push(user.id) 28 | guildData.save().then(() => { 29 | oneforall.functions.tempMessage(message, lang.owners.add.success(user.toString())) 30 | }) 31 | } 32 | if(subCommand === "clear"){ 33 | guildData.guildOwners = [] 34 | guildData.save().then(() => { 35 | oneforall.functions.tempMessage(message, 'Owners cleared') 36 | }) 37 | } 38 | if(subCommand === 'remove'){ 39 | const isOwner = guildOwners.includes(user.id) 40 | if(!isOwner) return oneforall.functions.tempMessage(message, lang.owners.remove.notOwner) 41 | guildData.guildOwners = guildData.guildOwners.filter(id => id !== user.id) 42 | guildData.save().then(() => { 43 | oneforall.functions.tempMessage(message, lang.owners.remove.success(user.toString())) 44 | }) 45 | } 46 | if(subCommand === 'list'){ 47 | const embedChange = (page, slicerIndicatorMin, slicerIndicatorMax, totalPage) => { 48 | return { 49 | ...oneforall.embed(guildData), 50 | title: `Owner list (${guildOwners.length})`, 51 | footer: { 52 | text: `Owner Page ${page + 1}/${totalPage ||1}` 53 | }, 54 | description: guildOwners.map((id, i) => `\`${i+1}\` - <@${id}>`).slice(slicerIndicatorMin, slicerIndicatorMax).join('\n') || 'No data' 55 | } 56 | } 57 | await new oneforall.DataMenu(guildOwners,embedChange, message, oneforall).sendEmbed() 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/commands/moderation/tempmute.js: -------------------------------------------------------------------------------- 1 | const ms = require('ms'), 2 | moment = require('moment') 3 | const { MessageActionRow, MessageButton } = require("discord.js"); 4 | const { Message, Collection } = require('discord.js') 5 | const OneForAll = require('../../structures/OneForAll') 6 | module.exports = { 7 | name: "tempmute", 8 | aliases: [], 9 | description: "Temporarily mute a member | Mute un membre temporairement", 10 | usage: "tempmute