diff --git a/.env b/.env new file mode 100644 index 00000000..2acfe971 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ + +TOKEN= \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..46d56254 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": "tesseract", + "complexity": ["error", { "max": 30 }] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e943db20 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ + +assets/logs/Pogy.log +config.json +node_modules \ No newline at end of file diff --git a/Pogy.js b/Pogy.js new file mode 100644 index 00000000..7652c613 --- /dev/null +++ b/Pogy.js @@ -0,0 +1,71 @@ +const { Client, Collection } = require("discord.js"); +const Util = require('./structures/Util'); +const config = require('./config.json'); +const logger = require('./utils/logger'); +const { token } = require('./utils/variables'); + + + +module.exports = class PogyClient extends Client { + constructor(options = {}, sentry) { + super({ + partials: ['MESSAGE', 'CHANNEL', 'REACTION', 'GUILD_MEMBER', 'USER'], + cacheGuilds: true, + cacheChannels: true, + cacheOverwrites: false, + cacheRoles: true, + cacheEmojis: true, + cachePresences: false, + fetchAllMembers: true, + disableMentions: 'everyone', + messageCacheMaxSize: 25, + messageCacheLifetime: 10000, + messageSweepInterval: 12000, + shardCount: 1, + ws: { + intents: [ + "GUILDS", + "GUILD_MEMBERS", + "GUILD_MESSAGES", + "GUILD_EMOJIS", + 'GUILD_MESSAGE_REACTIONS', + 'GUILD_VOICE_STATES' + ], + }, + }); + + this.validate(options); + this.partials = ['MESSAGE', 'CHANNEL', 'REACTION', 'GUILD_MEMBER', 'USER'], + this.commands = new Collection(); + this.events = new Collection(); + this.aliases = new Collection(); + this.utils = require('./utils/utils.js'); + this.mongoose = require('./utils/mongoose'); + this.utils = new Util(this); + this.config = require('./config.json'); + } + + validate(options) { + if (typeof options !== 'object') throw new TypeError('Options should be a type of Object.'); + + if (!token) throw new Error('You must pass the token for the client.'); + this.token = token; + + if(!options.prefix) throw new Error('You must pass a prefix for the client.'); + if(typeof options.prefix !== 'string') throw new TypeError('Prefix should be a type of String.'); + this.prefix = options.prefix; + + if (!options.mongodb_url) throw new Error('You must pass a MONGODB URL for the client.') + } + + async start(token = this.token) { + this.utils.loadCommands() + this.utils.loadEvents() + + super.login(token) + .catch(e => console.log(e)) + + this.mongoose.init() + } + +}; \ No newline at end of file diff --git a/assets/emojis.json b/assets/emojis.json new file mode 100644 index 00000000..2c36537f --- /dev/null +++ b/assets/emojis.json @@ -0,0 +1,64 @@ +{ + "image":"<:image_emoji:788427949509836840>", + "currency":"<:currency_emoji:788428132683350058>", + + "games":"<:games_emoji:788428825745817611> ", + "admin":"<:admin_emoji:788429031926005790> ", + "configs":"<:configs_emoji:788427972628447293> ", + "utils":"<:utils_emoji:788429328039280661> ", + "success": "<:success:788438144818217000> ", + + "green":"<:greensquare:803527870609489931> ", + "red":"<:redsquare:803527843661217802>", + + "dot": "<:purple_pogy_dot:788726274940076082> ", + "fail": "<:fail:790491137289879583> ", + + "misc": "<:speaker:790146754645196800> ", + "mod": "<:moderation_emoji:788428121375768586>", + + "pogger1": "<:poggerz:790987235591323659> ", + "heartbreak":"<:heartbreak:790987215324184606> ", + + "lock": "<:lock:790494601189261323> ", + "unlock": "<:unlock:790494567753187338> ", + + "owner": "<:owner:790146744348442624> ", + + "discord_employee":"<:discordemployee:790152842382934038> ", + "discord_partner": "<:partnered:790152935152680960>", + "bughunter_level_1": "<:bughunterl1:790152798623891466> ", + "bughunter_level_2": "<:bughunterl2:790152838763511808> ", + "hypesquad_events": "<:hypesquadevents:790152901569282048> ", + "house_brilliance": "<:brilliance:790152798288871454> ", + "house_bravery": "<:housebravery:790152899769925643> ", + "house_balance": "<:housebalance:790152901259165726> ", + "early_supporter": "<:earlysupporter:790152860742451221> ", + "verified_bot": "<:verifiedbot:790152985870991360> ", + "verified_developer": "<:verifieddev:790152986382303253> ", + + + "online": "<:online:790132184018059304> ", + "idle": "<:Idle:790132098806972426> ", + "offline": "<:offline:790132057523093515> ", + "dnd": "<:donotdisturb:790132081136893962> ", + "verify":"<:success:788438144818217000>", + + "voice": "<:speaker:790146754645196800> ", + + "pong": "<:online:790132184018059304>", + + "altdetector":"<:alt:826845773656096838>", + "applications":"<:form:826846790208716831>", + "config":"<:configs_emoji:788427972628447293>", + "utility":"<:utils_emoji:788429328039280661>", + "economy":"<:currency_emoji:788428132683350058>", + "fun":"<:fun_emoji:788428109980368916> ", + "images":"<:image_emoji:788427949509836840>", + "information":"<:information_emoji:788428196528914472> ", + "moderation":"<:moderation_emoji:788428121375768586>", + "nsfw":"<:nsfw:826845810024644659> ", + "reactionrole":"<:reaction_roles:826845827191406694>", + "tickets":"<:ticket:826845944669536266>" + +} diff --git a/assets/json/emojiarray.json b/assets/json/emojiarray.json new file mode 100644 index 00000000..e9faeb69 --- /dev/null +++ b/assets/json/emojiarray.json @@ -0,0 +1,38 @@ +["😄", "😆", "😊", "😃", "😏", "😍", "😘", "😚", "😳", "😌", "😆", "😁", "😉", "😜", "😝", "😀", "😗", "😙", "😛", "😴", "😟", "😦", "😧", "😮", "😬", "😕", "😯", "😑", "😒", "😅", "😓", "😥", "😩", "😔", "😞", "😖", "😨", "😰", "😣", "😢", "😭", "😂", "😲", "😱", "😫", "😠", "😡", "😤", "😪", "😋", "😷", "😎", "😵", "👿", "😈", "😐", "😶", "😇", "👽", "💛", "💙", "💜", "💚", "💔", "💓", "💗", "💕", "💞", "💘", "💖", "✨", "⭐","🌟" ,"💫", "💥", "💢", "❗", "❓", "❕", "❔", "💤", "💨", "💦", "🎶", "🎵", "🔥", "💩", "👍", "👎", "👌", "👊", "✊", "✌️", "👋", "✋", "👐", "☝️", "👇", "👈", "👉", "🙌", "🙏", "👆", "👏" + , "💪", "🤘", "🖕", "🚶", "🏃", "👫", "👪", "👬", "👭", "💃", "👯", "🙆", "🙅", "💁", "🙋", "👰", "🙇", "💏", "💑", "💆", "💇", "💅", "👦", "👧", "👩", "👨", "👶", "👵", "👴" , "👲", "👳", "👷", "👮", "👼", "👸", "😺", "😸", "😻", "😽", "😼", "🙀", "😿", "😹", "😾", "👹", "👺", "🙈", "🙉", "🙊", "💂", "💀", "🐾", "👄", "💋", "💧", "👂", "👀", "👃", "👅", "💌", "👤", "👥", "💬", "💭" + , "☀️", "☁️", "❄️", "⛄", "⚡", "🌀", "🌁", "🌊", "🐱", "🐶", "🐭", "🐹", "🐰", "🐺", "🐸", "🐯", "🐨", "🐻", "🐷", "🐽", "🐮", "🐗", "🐵", "🐒", "🐴", "🐎", "🐫", "🐑", "🐘", "🐼", "🐍" + , "🐦", "🐤", "🐥", "🐣", "🐔", "🐧", "🐢", "🐛", "🐝", "🐜", "🐞", "🐌", "🐙", "🐠", "🐟", "🐳", "🐋", "🐬", "🐄" + , "🐏", "🐀", "🐃", "🐅", "🐇", "🐉", "🐐", "🐓", "🐕", "🐖", "🐁", "🐂", "🐲", "🐡", "🐊", "🐪", "🐆", "🐈", "🐩" + , "🐾", "💐", "🌸", "🌷", "🍀", "🌹", "🌻", "🌺", "🍁", "🍃", "🍂", "🌿", "🍄", "🌵", "🌴", "🌲", "🌳" + , "🌰", "🌱", "🌼", "🌾", "🐚", "🌐", "🌞", "🌝", "🌚", "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘", "🌜", "🌛", "🌔", "🌍", "🌎", "🌏", "🌋", "🌌", "⛅" + , "🎍", "💝", "🎎", "🎒", "🎓", "🎏", "🎆", "🎇", "🎐", "🎑", "🎃", "👻", "🎅", "🎄", "🎁", "🔔", "🔕" + , "🎋", "🎉", "🎊", "🎈", "🔮", "💿", "📀", "💾", "📷", "📹", "🎥", "💻", "📺", "📱", "☎️", "☎️" + , "📞", "📟", "📠", "💽", "📼", "🔉", "🔈", "🔇", "📢", "📣", "⌛", "⏳", "⏰", "⌚" + , "📻", "📡", "➿", "🔍", "🔎", "🔓", "🔒", "🔏", "🔐", "🔑", "💡", "🔦", "🔆", "🔅" + , "🔌", "🔋", "📲", "✉️", "📫", "📮", "🛀", "🛁", "🚿", "🚽", "🔧", "🔩", "🔨", "💺", "💰", "💴", "💵", "💷", "💶" + , "💳", "💸", "📧", "📥", "📤", "✉️", "📨", "📯", "📪", "📬", "📭" + , "📦", "🚪", "🚬", "💣", "🔫", "🔪", "💊", "💉", "📄", "📃", "📑", "📊", "📈", "📉", "📜", "📋" + , "📆", "📅", "📇", "📁", "📂", "✂️", "📌", "📎", "✒️", "✏️", "📏", "📐", "📕", "📗", "📘", "📙", "📓", "📔", "📒", "📚", "🔖", "📛" + , "🔬", "🔭", "📰", "🏈", "🏀", "⚽", "⚾", "🎾", "🎱", "🏉", "🎳", "⛳", "🚵", "🚴", "🏇", "🏂", "🏊", "🏄", "🎿", "♠️", "♥️" + , "♣️", "♦️", "💎", "💍", "🏆", "🎼", "🎹", "🎻", "👾", "🎮", "🃏", "🎴", "🎲", "🎯", "🀄", "🎬", "📝", "📝", "📖", "🎨" + , "🎤", "🎧", "🎺", "🎷", "🎸", "👞", "👡", "👠", "💄", "👢", "👕", "👕", "👔", "👚", "👗", "🎽", "👖", "👘", "👙", "🎀", "🎩", "👑", "👒", "👞" + , "🌂", "💼", "👜", "👝", "👛", "👓", "🎣", "☕", "🍵", "🍶", "🍼", "🍺", "🍻", "🍸", "🍹", "🍷", "🍴", "🍕", "🍔", "🍟", "🍗", "🍖", "🍝", "🍛", "🍤", "🍱", "🍣", "🍥", "🍙", "🍘" + , "🍚", "🍜", "🍲", "🍢", "🍡", "🥚", "🍞", "🍩", "🍮", "🍦", "🍨", "🍧", "🎂", "🍰", "🍪", "🍫", "🍬", "🍭", "🍯", "🍎", "🍏", "🍊", "🍋", "🍒", "🍇", "🍉", "🍓", "🍑", "🍈", "🍌", "🍐", "🍍", "🍠", "🍆", "🍅", "🌽" + , "🏠", "🏡", "🏫", "🏢", "🏣", "🏥", "🏦", "🏪", "🏩", "🏨", "💒", "⛪", "🏬", "🏤", "🌇", "🌆", "🏯", "🏰" + , "⛺", "🏭", "🗼", "🗾", "🗻", "🌄", "🌅", "🌠", "🗽", "🌉", "🎠", "🌈", "🎡", "⛲", "🎢", "🚢", "🚤", "⛵", "⛵", "🚣", "⚓", "🚀" + , "✈️", "🚁", "🚂", "🚊", "🚞", "🚲", "🚡", "🚟", "🚠", "🚜", "🚙", "🚘", "🚗", "🚗", "🚕", "🚖", "🚛", "🚌", "🚍", "🚨", "🚓", "🚔", "🚒" + , "🚑", "🚐", "🚚", "🚋", "🚉", "🚆", "🚅", "🚄", "🚈", "🚝", "🚃", "🚎", "🎫", "⛽", "🚦", "🚥", "⚠️", "🚧", "🔰", "🏧", "🎰", "🚏", "💈" + , "♨️", "🏁", "🎌", "🏮", "🗿", "🎪", "🎭", "📍", "🚩", "🇯🇵", "🇰🇷", "🇨🇳", "🇺🇸", "🇫🇷", "🇪🇸", "🇮🇹", "🇷🇺", "🇬🇧", "🇩🇪" + , "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟", "🔢", "0️⃣", "#️⃣", "🔣", "◀️", "⬇️" + , "▶️", "⬅️", "🔠", "🔡", "🔤", "↙️", "↘️", "➡️", "⬆️", "↖️", "↗️", "⏬", "⏫", "🔽", "⤵️", "⤴️", "↩️", "↪️", "↔️" + , "↕️", "🔼", "🔃", "🔄", "⏪", "⏩", "ℹ️", "🆗", "🔀", "🔁", "🔂", "🆕" + , "🔝", "🆙", "🆒", "🆓", "🆖", "🎦", "🈁", "📶", "🈹", "🈴" + , "🈺", "🈯", "🈷️", "🈶", "🈵", "🈚", "🈸", "🈳", "🈲", "🈂️", "🚻", "🚹", "🚺" + , "🚼", "🚭", "🅿️", "♿", "🚇", "🛄", "🉑", "🚾", "🚰", "🚮", "㊙️", "㊗️" + , "Ⓜ️", "🛂", "🛅", "🛃", "🉐", "🆑", "🆘", "🆔", "🚫", "🔞", "📵", "🚯", "🚱", "🚳", "🚷" + , "🚸", "⛔", "✳️", "❇️", "✴️", "💟", "🆚", "📳", "📴", "💹", "💱", "♈", "♉", "♊", "♋", "♌", "♍" + , "♎", "♏", "♐", "♑", "♒", "♓", "⛎", "🔯", "❎", "🅰️", "🅱️", "🆎", "🅾️", "💠" + , "♻️", "🔚", "🔙", "🔛", "🔜", "🕐", "🕜", "🕙", "🕥", "🕚", "🕦", "🕛", "🕧" + , "🕑", "🕝", "🕒", "🕞", "🕓", "🕟", "🕔", "🕠", "🕕", "🕡", "🕖", "🕢", "🕗", "🕣", "🕘", "🕤" + , "💲", "©️", "®️", "™️", "❌", "❗", "‼️", "⁉️", "⭕", "✖️", "➕", "➖", "➗", "💮", "💯" + , "✔️", "☑️", "🔘", "🔗", "➰", "〰️", "〽️", "🔱", "▪️", "▫️", "◾", "◽", "◼️", "◻️", "⬛", "⬜", "✅", "🔲", "🔳", "⚫", "⚪", "🔴", "🔵", "🔷", "🔶", "🔹", "🔸", "🔺", "🔻"] \ No newline at end of file diff --git a/assets/json/nfsw.json b/assets/json/nfsw.json new file mode 100644 index 00000000..b52a34d7 --- /dev/null +++ b/assets/json/nfsw.json @@ -0,0 +1,23 @@ +[ + "This isn't an NSFW channel!", + "This doesn't seem to be an NSFW channel...", + "I'm sorry! But this stuff belongs in NSFW channels!", + "That belongs in NSFW channels!", + "I can't post this here! Please direct me to an NSFW channel!", + "I'm afraid that kind of stuff isn't allowed in here..", + "This doesn't look like an NSFW channel!", + "Please try again in an NSFW channel!", + "u///u, I don't think I can post that in your average channel.", + "Don't make me post that here...", + "💢That doesn't belong here!", + "W-What? I can't post that here!", + "Would you direct me to an NSFW channel?", + "Please try this command again in an NSFW channel!", + "H-Hey.. Some people might not want to see that in here!", + "LEWD! B-Baka! Not in here!", + "B-Baka! I can't post that here!", + "Nya! That was bad! Do that in an NSFW channel!", + "How scandalous! Try that in an NSFW channel!", + "Senpai...don't make me post that here...", + "Nya that was bad senpai! This is an NSFW command!" + ] diff --git a/assets/json/permissions.json b/assets/json/permissions.json new file mode 100644 index 00000000..3f6f91d6 --- /dev/null +++ b/assets/json/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Administrator", + "VIEW_AUDIT_LOG": "View Audit Log", + "VIEW_GUILD_INSIGHTS": "View Server Insights", + "MANAGE_GUILD": "Manage Server", + "MANAGE_ROLES": "Manage Roles", + "MANAGE_CHANNELS": "Manage Channels", + "KICK_MEMBERS": "Kick Members", + "BAN_MEMBERS": "Ban Members", + "CREATE_INSTANT_INVITE": "Create Invite", + "CHANGE_NICKNAME": "Change Nickname", + "MANAGE_NICKNAMES": "Manage Nicknames", + "MANAGE_EMOJIS": "Manage Emojis", + "MANAGE_WEBHOOKS": "Manage Webhooks", + "VIEW_CHANNEL": "Read Text Channels & See Voice Channels", + "SEND_MESSAGES": "Send Messages", + "SEND_TTS_MESSAGES": "Send TTS Messages", + "MANAGE_MESSAGES": "Manage Messages", + "EMBED_LINKS": "Embed Links", + "ATTACH_FILES": "Attach Files", + "READ_MESSAGE_HISTORY": "Read Message History", + "MENTION_EVERYONE": "Mention @everyone, @here, and All Roles", + "USE_EXTERNAL_EMOJIS": "Use External Emojis", + "ADD_REACTIONS": "Add Reactions", + "CONNECT": "Connect", + "SPEAK": "Speak", + "STREAM": "Video", + "MUTE_MEMBERS": "Mute Members", + "DEAFEN_MEMBERS": "Deafen Members", + "MOVE_MEMBERS": "Move Members", + "USE_VAD": "Use Voice Activity", + "PRIORITY_SPEAKER": "Priority Speaker" +} \ No newline at end of file diff --git a/assets/json/pokemon.json b/assets/json/pokemon.json new file mode 100644 index 00000000..96a74af7 --- /dev/null +++ b/assets/json/pokemon.json @@ -0,0 +1,3210 @@ +[ + { + "name": "bulbasaur", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/001.png" + }, + { + "name": "ivysaur", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/002.png" + }, + { + "name": "venusaur", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/003.png" + }, + { + "name": "charmander", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/004.png" + }, + { + "name": "charmeleon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/005.png" + }, + { + "name": "charizard", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/006.png" + }, + { + "name": "squirtle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/007.png" + }, + { + "name": "wartortle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/008.png" + }, + { + "name": "blastoise", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/009.png" + }, + { + "name": "caterpie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/010.png" + }, + { + "name": "metapod", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/011.png" + }, + { + "name": "butterfree", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/012.png" + }, + { + "name": "weedle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/013.png" + }, + { + "name": "kakuna", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/014.png" + }, + { + "name": "beedrill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/015.png" + }, + { + "name": "pidgey", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/016.png" + }, + { + "name": "pidgeotto", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/017.png" + }, + { + "name": "pidgeot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/018.png" + }, + { + "name": "rattata", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/019.png" + }, + { + "name": "raticate", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/020.png" + }, + { + "name": "spearow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/021.png" + }, + { + "name": "fearow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/022.png" + }, + { + "name": "ekans", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/023.png" + }, + { + "name": "arbok", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/024.png" + }, + { + "name": "pikachu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/025.png" + }, + { + "name": "raichu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/026.png" + }, + { + "name": "sandshrew", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/027.png" + }, + { + "name": "sandslash", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/028.png" + }, + { + "name": "nidoran f", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/029.png" + }, + { + "name": "nidorina", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/030.png" + }, + { + "name": "nidoqueen", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/031.png" + }, + { + "name": "nidoran m", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/032.png" + }, + { + "name": "nidorino", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/033.png" + }, + { + "name": "nidoking", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/034.png" + }, + { + "name": "clefairy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/035.png" + }, + { + "name": "clefable", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/036.png" + }, + { + "name": "vulpix", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/037.png" + }, + { + "name": "ninetales", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/038.png" + }, + { + "name": "jigglypuff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/039.png" + }, + { + "name": "wigglytuff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/040.png" + }, + { + "name": "zubat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/041.png" + }, + { + "name": "golbat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/042.png" + }, + { + "name": "oddish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/043.png" + }, + { + "name": "gloom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/044.png" + }, + { + "name": "vileplume", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/045.png" + }, + { + "name": "paras", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/046.png" + }, + { + "name": "parasect", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/047.png" + }, + { + "name": "venonat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/048.png" + }, + { + "name": "venomoth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/049.png" + }, + { + "name": "diglett", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/050.png" + }, + { + "name": "dugtrio", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/051.png" + }, + { + "name": "meowth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/052.png" + }, + { + "name": "persian", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/053.png" + }, + { + "name": "psyduck", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/054.png" + }, + { + "name": "golduck", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/055.png" + }, + { + "name": "mankey", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/056.png" + }, + { + "name": "primeape", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/057.png" + }, + { + "name": "growlithe", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/058.png" + }, + { + "name": "arcanine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/059.png" + }, + { + "name": "poliwag", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/060.png" + }, + { + "name": "poliwhirl", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/061.png" + }, + { + "name": "poliwrath", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/062.png" + }, + { + "name": "abra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/063.png" + }, + { + "name": "kadabra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/064.png" + }, + { + "name": "alakazam", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/065.png" + }, + { + "name": "machop", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/066.png" + }, + { + "name": "machoke", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/067.png" + }, + { + "name": "machamp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/068.png" + }, + { + "name": "bellsprout", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/069.png" + }, + { + "name": "weepinbell", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/070.png" + }, + { + "name": "victreebel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/071.png" + }, + { + "name": "tentacool", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/072.png" + }, + { + "name": "tentacruel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/073.png" + }, + { + "name": "geodude", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/074.png" + }, + { + "name": "graveler", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/075.png" + }, + { + "name": "golem", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/076.png" + }, + { + "name": "ponyta", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/077.png" + }, + { + "name": "rapidash", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/078.png" + }, + { + "name": "slowpoke", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/079.png" + }, + { + "name": "slowbro", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/080.png" + }, + { + "name": "magnemite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/081.png" + }, + { + "name": "magneton", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/082.png" + }, + { + "name": "farfetchd", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/083.png" + }, + { + "name": "doduo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/084.png" + }, + { + "name": "dodrio", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/085.png" + }, + { + "name": "seel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/086.png" + }, + { + "name": "dewgong", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/087.png" + }, + { + "name": "grimer", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/088.png" + }, + { + "name": "muk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/089.png" + }, + { + "name": "shellder", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/090.png" + }, + { + "name": "cloyster", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/091.png" + }, + { + "name": "gastly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/092.png" + }, + { + "name": "haunter", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/093.png" + }, + { + "name": "gengar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/094.png" + }, + { + "name": "onix", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/095.png" + }, + { + "name": "drowzee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/096.png" + }, + { + "name": "hypno", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/097.png" + }, + { + "name": "krabby", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/098.png" + }, + { + "name": "kingler", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/099.png" + }, + { + "name": "voltorb", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/100.png" + }, + { + "name": "electrode", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/101.png" + }, + { + "name": "exeggcute", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/102.png" + }, + { + "name": "exeggutor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/103.png" + }, + { + "name": "cubone", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/104.png" + }, + { + "name": "marowak", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/105.png" + }, + { + "name": "hitmonlee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/106.png" + }, + { + "name": "hitmonchan", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/107.png" + }, + { + "name": "lickitung", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/108.png" + }, + { + "name": "koffing", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/109.png" + }, + { + "name": "weezing", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/110.png" + }, + { + "name": "rhyhorn", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/111.png" + }, + { + "name": "rhydon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/112.png" + }, + { + "name": "chansey", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/113.png" + }, + { + "name": "tangela", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/114.png" + }, + { + "name": "kangaskhan", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/115.png" + }, + { + "name": "horsea", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/116.png" + }, + { + "name": "seadra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/117.png" + }, + { + "name": "goldeen", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/118.png" + }, + { + "name": "seaking", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/119.png" + }, + { + "name": "staryu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/120.png" + }, + { + "name": "starmie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/121.png" + }, + { + "name": "mr mime", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/122.png" + }, + { + "name": "scyther", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/123.png" + }, + { + "name": "jynx", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/124.png" + }, + { + "name": "electabuzz", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/125.png" + }, + { + "name": "magmar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/126.png" + }, + { + "name": "pinsir", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/127.png" + }, + { + "name": "tauros", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/128.png" + }, + { + "name": "magikarp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/129.png" + }, + { + "name": "gyarados", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/130.png" + }, + { + "name": "lapras", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/131.png" + }, + { + "name": "ditto", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/132.png" + }, + { + "name": "eevee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/133.png" + }, + { + "name": "vaporeon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/134.png" + }, + { + "name": "jolteon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/135.png" + }, + { + "name": "flareon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/136.png" + }, + { + "name": "porygon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/137.png" + }, + { + "name": "omanyte", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/138.png" + }, + { + "name": "omastar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/139.png" + }, + { + "name": "kabuto", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/140.png" + }, + { + "name": "kabutops", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/141.png" + }, + { + "name": "aerodactyl", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/142.png" + }, + { + "name": "snorlax", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/143.png" + }, + { + "name": "articuno", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/144.png" + }, + { + "name": "zapdos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/145.png" + }, + { + "name": "moltres", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/146.png" + }, + { + "name": "dratini", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/147.png" + }, + { + "name": "dragonair", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/148.png" + }, + { + "name": "dragonite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/149.png" + }, + { + "name": "mewtwo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/150.png" + }, + { + "name": "mew", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/151.png" + }, + { + "name": "chikorita", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/152.png" + }, + { + "name": "bayleef", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/153.png" + }, + { + "name": "meganium", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/154.png" + }, + { + "name": "cyndaquil", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/155.png" + }, + { + "name": "quilava", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/156.png" + }, + { + "name": "typhlosion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/157.png" + }, + { + "name": "totodile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/158.png" + }, + { + "name": "croconaw", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/159.png" + }, + { + "name": "feraligatr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/160.png" + }, + { + "name": "sentret", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/161.png" + }, + { + "name": "furret", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/162.png" + }, + { + "name": "hoothoot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/163.png" + }, + { + "name": "noctowl", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/164.png" + }, + { + "name": "ledyba", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/165.png" + }, + { + "name": "ledian", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/166.png" + }, + { + "name": "spinarak", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/167.png" + }, + { + "name": "ariados", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/168.png" + }, + { + "name": "crobat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/169.png" + }, + { + "name": "chinchou", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/170.png" + }, + { + "name": "lanturn", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/171.png" + }, + { + "name": "pichu spiky eared", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/172.png" + }, + { + "name": "cleffa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/173.png" + }, + { + "name": "igglybuff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/174.png" + }, + { + "name": "togepi", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/175.png" + }, + { + "name": "togetic", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/176.png" + }, + { + "name": "natu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/177.png" + }, + { + "name": "xatu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/178.png" + }, + { + "name": "mareep", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/179.png" + }, + { + "name": "flaaffy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/180.png" + }, + { + "name": "ampharos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/181.png" + }, + { + "name": "bellossom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/182.png" + }, + { + "name": "marill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/183.png" + }, + { + "name": "azumarill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/184.png" + }, + { + "name": "sudowoodo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/185.png" + }, + { + "name": "politoed", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/186.png" + }, + { + "name": "hoppip", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/187.png" + }, + { + "name": "skiploom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/188.png" + }, + { + "name": "jumpluff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/189.png" + }, + { + "name": "aipom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/190.png" + }, + { + "name": "sunkern", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/191.png" + }, + { + "name": "sunflora", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/192.png" + }, + { + "name": "yanma", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/193.png" + }, + { + "name": "wooper", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/194.png" + }, + { + "name": "quagsire", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/195.png" + }, + { + "name": "espeon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/196.png" + }, + { + "name": "umbreon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/197.png" + }, + { + "name": "murkrow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/198.png" + }, + { + "name": "slowking", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/199.png" + }, + { + "name": "misdreavus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/200.png" + }, + { + "name": "unown question", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/201.png" + }, + { + "name": "wobbuffet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/202.png" + }, + { + "name": "girafarig", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/203.png" + }, + { + "name": "pineco", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/204.png" + }, + { + "name": "forretress", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/205.png" + }, + { + "name": "dunsparce", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/206.png" + }, + { + "name": "gligar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/207.png" + }, + { + "name": "steelix", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/208.png" + }, + { + "name": "snubbull", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/209.png" + }, + { + "name": "granbull", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/210.png" + }, + { + "name": "qwilfish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/211.png" + }, + { + "name": "scizor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/212.png" + }, + { + "name": "shuckle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/213.png" + }, + { + "name": "heracross", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/214.png" + }, + { + "name": "sneasel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/215.png" + }, + { + "name": "teddiursa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/216.png" + }, + { + "name": "ursaring", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/217.png" + }, + { + "name": "slugma", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/218.png" + }, + { + "name": "magcargo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/219.png" + }, + { + "name": "swinub", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/220.png" + }, + { + "name": "piloswine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/221.png" + }, + { + "name": "corsola", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/222.png" + }, + { + "name": "remoraid", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/223.png" + }, + { + "name": "octillery", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/224.png" + }, + { + "name": "delibird", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/225.png" + }, + { + "name": "mantine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/226.png" + }, + { + "name": "skarmory", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/227.png" + }, + { + "name": "houndour", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/228.png" + }, + { + "name": "houndoom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/229.png" + }, + { + "name": "kingdra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/230.png" + }, + { + "name": "phanpy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/231.png" + }, + { + "name": "donphan", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/232.png" + }, + { + "name": "porygon2", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/233.png" + }, + { + "name": "stantler", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/234.png" + }, + { + "name": "smeargle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/235.png" + }, + { + "name": "tyrogue", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/236.png" + }, + { + "name": "hitmontop", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/237.png" + }, + { + "name": "smoochum", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/238.png" + }, + { + "name": "elekid", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/239.png" + }, + { + "name": "magby", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/240.png" + }, + { + "name": "miltank", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/241.png" + }, + { + "name": "blissey", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/242.png" + }, + { + "name": "raikou", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/243.png" + }, + { + "name": "entei", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/244.png" + }, + { + "name": "suicune", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/245.png" + }, + { + "name": "larvitar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/246.png" + }, + { + "name": "pupitar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/247.png" + }, + { + "name": "tyranitar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/248.png" + }, + { + "name": "lugia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/249.png" + }, + { + "name": "ho oh", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/250.png" + }, + { + "name": "celebi", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/251.png" + }, + { + "name": "treecko", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/252.png" + }, + { + "name": "grovyle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/253.png" + }, + { + "name": "sceptile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/254.png" + }, + { + "name": "torchic", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/255.png" + }, + { + "name": "combusken", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/256.png" + }, + { + "name": "blaziken", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/257.png" + }, + { + "name": "mudkip", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/258.png" + }, + { + "name": "marshtomp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/259.png" + }, + { + "name": "swampert", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/260.png" + }, + { + "name": "poochyena", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/261.png" + }, + { + "name": "mightyena", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/262.png" + }, + { + "name": "zigzagoon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/263.png" + }, + { + "name": "linoone", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/264.png" + }, + { + "name": "wurmple", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/265.png" + }, + { + "name": "silcoon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/266.png" + }, + { + "name": "beautifly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/267.png" + }, + { + "name": "cascoon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/268.png" + }, + { + "name": "dustox", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/269.png" + }, + { + "name": "lotad", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/270.png" + }, + { + "name": "lombre", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/271.png" + }, + { + "name": "ludicolo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/272.png" + }, + { + "name": "seedot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/273.png" + }, + { + "name": "nuzleaf", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/274.png" + }, + { + "name": "shiftry", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/275.png" + }, + { + "name": "taillow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/276.png" + }, + { + "name": "swellow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/277.png" + }, + { + "name": "wingull", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/278.png" + }, + { + "name": "pelipper", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/279.png" + }, + { + "name": "ralts", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/280.png" + }, + { + "name": "kirlia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/281.png" + }, + { + "name": "gardevoir", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/282.png" + }, + { + "name": "surskit", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/283.png" + }, + { + "name": "masquerain", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/284.png" + }, + { + "name": "shroomish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/285.png" + }, + { + "name": "breloom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/286.png" + }, + { + "name": "slakoth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/287.png" + }, + { + "name": "vigoroth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/288.png" + }, + { + "name": "slaking", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/289.png" + }, + { + "name": "nincada", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/290.png" + }, + { + "name": "ninjask", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/291.png" + }, + { + "name": "shedinja", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/292.png" + }, + { + "name": "whismur", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/293.png" + }, + { + "name": "loudred", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/294.png" + }, + { + "name": "exploud", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/295.png" + }, + { + "name": "makuhita", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/296.png" + }, + { + "name": "hariyama", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/297.png" + }, + { + "name": "azurill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/298.png" + }, + { + "name": "nosepass", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/299.png" + }, + { + "name": "skitty", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/300.png" + }, + { + "name": "delcatty", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/301.png" + }, + { + "name": "sableye", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/302.png" + }, + { + "name": "mawile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/303.png" + }, + { + "name": "aron", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/304.png" + }, + { + "name": "lairon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/305.png" + }, + { + "name": "aggron", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/306.png" + }, + { + "name": "meditite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/307.png" + }, + { + "name": "medicham", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/308.png" + }, + { + "name": "electrike", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/309.png" + }, + { + "name": "manectric", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/310.png" + }, + { + "name": "plusle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/311.png" + }, + { + "name": "minun", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/312.png" + }, + { + "name": "volbeat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/313.png" + }, + { + "name": "illumise", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/314.png" + }, + { + "name": "roselia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/315.png" + }, + { + "name": "gulpin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/316.png" + }, + { + "name": "swalot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/317.png" + }, + { + "name": "carvanha", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/318.png" + }, + { + "name": "sharpedo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/319.png" + }, + { + "name": "wailmer", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/320.png" + }, + { + "name": "wailord", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/321.png" + }, + { + "name": "numel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/322.png" + }, + { + "name": "camerupt", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/323.png" + }, + { + "name": "torkoal", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/324.png" + }, + { + "name": "spoink", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/325.png" + }, + { + "name": "grumpig", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/326.png" + }, + { + "name": "spinda", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/327.png" + }, + { + "name": "trapinch", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/328.png" + }, + { + "name": "vibrava", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/329.png" + }, + { + "name": "flygon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/330.png" + }, + { + "name": "cacnea", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/331.png" + }, + { + "name": "cacturne", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/332.png" + }, + { + "name": "swablu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/333.png" + }, + { + "name": "altaria", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/334.png" + }, + { + "name": "zangoose", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/335.png" + }, + { + "name": "seviper", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/336.png" + }, + { + "name": "lunatone", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/337.png" + }, + { + "name": "solrock", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/338.png" + }, + { + "name": "barboach", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/339.png" + }, + { + "name": "whiscash", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/340.png" + }, + { + "name": "corphish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/341.png" + }, + { + "name": "crawdaunt", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/342.png" + }, + { + "name": "baltoy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/343.png" + }, + { + "name": "claydol", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/344.png" + }, + { + "name": "lileep", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/345.png" + }, + { + "name": "cradily", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/346.png" + }, + { + "name": "anorith", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/347.png" + }, + { + "name": "armaldo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/348.png" + }, + { + "name": "feebas", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/349.png" + }, + { + "name": "milotic", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/350.png" + }, + { + "name": "castform", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/351.png" + }, + { + "name": "kecleon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/352.png" + }, + { + "name": "shuppet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/353.png" + }, + { + "name": "banette", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/354.png" + }, + { + "name": "duskull", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/355.png" + }, + { + "name": "dusclops", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/356.png" + }, + { + "name": "tropius", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/357.png" + }, + { + "name": "chimecho", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/358.png" + }, + { + "name": "absol", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/359.png" + }, + { + "name": "wynaut", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/360.png" + }, + { + "name": "snorunt", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/361.png" + }, + { + "name": "glalie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/362.png" + }, + { + "name": "spheal", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/363.png" + }, + { + "name": "sealeo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/364.png" + }, + { + "name": "walrein", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/365.png" + }, + { + "name": "clamperl", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/366.png" + }, + { + "name": "huntail", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/367.png" + }, + { + "name": "gorebyss", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/368.png" + }, + { + "name": "relicanth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/369.png" + }, + { + "name": "luvdisc", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/370.png" + }, + { + "name": "bagon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/371.png" + }, + { + "name": "shelgon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/372.png" + }, + { + "name": "salamence", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/373.png" + }, + { + "name": "beldum", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/374.png" + }, + { + "name": "metang", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/375.png" + }, + { + "name": "metagross", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/376.png" + }, + { + "name": "regirock", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/377.png" + }, + { + "name": "regice", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/378.png" + }, + { + "name": "registeel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/379.png" + }, + { + "name": "latias", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/380.png" + }, + { + "name": "latios", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/381.png" + }, + { + "name": "kyogre", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/382.png" + }, + { + "name": "groudon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/383.png" + }, + { + "name": "rayquaza", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/384.png" + }, + { + "name": "jirachi", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/385.png" + }, + { + "name": "deoxys normal", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/386.png" + }, + { + "name": "turtwig", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/387.png" + }, + { + "name": "grotle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/388.png" + }, + { + "name": "torterra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/389.png" + }, + { + "name": "chimchar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/390.png" + }, + { + "name": "monferno", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/391.png" + }, + { + "name": "infernape", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/392.png" + }, + { + "name": "piplup", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/393.png" + }, + { + "name": "prinplup", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/394.png" + }, + { + "name": "empoleon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/395.png" + }, + { + "name": "starly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/396.png" + }, + { + "name": "staravia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/397.png" + }, + { + "name": "staraptor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/398.png" + }, + { + "name": "bidoof", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/399.png" + }, + { + "name": "bibarel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/400.png" + }, + { + "name": "kricketot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/401.png" + }, + { + "name": "kricketune", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/402.png" + }, + { + "name": "shinx", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/403.png" + }, + { + "name": "luxio", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/404.png" + }, + { + "name": "luxray", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/405.png" + }, + { + "name": "budew", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/406.png" + }, + { + "name": "roserade", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/407.png" + }, + { + "name": "cranidos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/408.png" + }, + { + "name": "rampardos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/409.png" + }, + { + "name": "shieldon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/410.png" + }, + { + "name": "bastiodon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/411.png" + }, + { + "name": "burmy trash", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/412.png" + }, + { + "name": "wormadam plant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/413.png" + }, + { + "name": "mothim", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/414.png" + }, + { + "name": "combee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/415.png" + }, + { + "name": "vespiquen", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/416.png" + }, + { + "name": "pachirisu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/417.png" + }, + { + "name": "buizel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/418.png" + }, + { + "name": "floatzel", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/419.png" + }, + { + "name": "cherubi", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/420.png" + }, + { + "name": "cherrim sunshine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/421.png" + }, + { + "name": "shellos east", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/422.png" + }, + { + "name": "gastrodon east", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/423.png" + }, + { + "name": "ambipom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/424.png" + }, + { + "name": "drifloon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/425.png" + }, + { + "name": "drifblim", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/426.png" + }, + { + "name": "buneary", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/427.png" + }, + { + "name": "lopunny", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/428.png" + }, + { + "name": "mismagius", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/429.png" + }, + { + "name": "honchkrow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/430.png" + }, + { + "name": "glameow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/431.png" + }, + { + "name": "purugly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/432.png" + }, + { + "name": "chingling", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/433.png" + }, + { + "name": "stunky", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/434.png" + }, + { + "name": "skuntank", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/435.png" + }, + { + "name": "bronzor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/436.png" + }, + { + "name": "bronzong", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/437.png" + }, + { + "name": "bonsly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/438.png" + }, + { + "name": "mime jr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/439.png" + }, + { + "name": "happiny", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/440.png" + }, + { + "name": "chatot", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/441.png" + }, + { + "name": "spiritomb", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/442.png" + }, + { + "name": "gible", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/443.png" + }, + { + "name": "gabite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/444.png" + }, + { + "name": "garchomp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/445.png" + }, + { + "name": "munchlax", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/446.png" + }, + { + "name": "riolu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/447.png" + }, + { + "name": "lucario", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/448.png" + }, + { + "name": "hippopotas", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/449.png" + }, + { + "name": "hippowdon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/450.png" + }, + { + "name": "skorupi", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/451.png" + }, + { + "name": "drapion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/452.png" + }, + { + "name": "croagunk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/453.png" + }, + { + "name": "toxicroak", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/454.png" + }, + { + "name": "carnivine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/455.png" + }, + { + "name": "finneon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/456.png" + }, + { + "name": "lumineon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/457.png" + }, + { + "name": "mantyke", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/458.png" + }, + { + "name": "snover", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/459.png" + }, + { + "name": "abomasnow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/460.png" + }, + { + "name": "weavile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/461.png" + }, + { + "name": "magnezone", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/462.png" + }, + { + "name": "lickilicky", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/463.png" + }, + { + "name": "rhyperior", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/464.png" + }, + { + "name": "tangrowth", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/465.png" + }, + { + "name": "electivire", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/466.png" + }, + { + "name": "magmortar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/467.png" + }, + { + "name": "togekiss", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/468.png" + }, + { + "name": "yanmega", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/469.png" + }, + { + "name": "leafeon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/470.png" + }, + { + "name": "glaceon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/471.png" + }, + { + "name": "gliscor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/472.png" + }, + { + "name": "mamoswine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/473.png" + }, + { + "name": "porygon z", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/474.png" + }, + { + "name": "gallade", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/475.png" + }, + { + "name": "probopass", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/476.png" + }, + { + "name": "dusknoir", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/477.png" + }, + { + "name": "froslass", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/478.png" + }, + { + "name": "rotom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/479.png" + }, + { + "name": "uxie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/480.png" + }, + { + "name": "mesprit", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/481.png" + }, + { + "name": "azelf", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/482.png" + }, + { + "name": "dialga", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/483.png" + }, + { + "name": "palkia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/484.png" + }, + { + "name": "heatran", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/485.png" + }, + { + "name": "regigigas", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/486.png" + }, + { + "name": "giratina altered", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/487.png" + }, + { + "name": "cresselia", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/488.png" + }, + { + "name": "phione", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/489.png" + }, + { + "name": "manaphy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/490.png" + }, + { + "name": "darkrai", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/491.png" + }, + { + "name": "shaymin land", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/492.png" + }, + { + "name": "arceus fairy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/493.png" + }, + { + "name": "victini", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/494.png" + }, + { + "name": "snivy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/495.png" + }, + { + "name": "servine", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/496.png" + }, + { + "name": "serperior", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/497.png" + }, + { + "name": "tepig", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/498.png" + }, + { + "name": "pignite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/499.png" + }, + { + "name": "emboar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/500.png" + }, + { + "name": "oshawott", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/501.png" + }, + { + "name": "dewott", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/502.png" + }, + { + "name": "samurott", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/503.png" + }, + { + "name": "patrat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/504.png" + }, + { + "name": "watchog", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/505.png" + }, + { + "name": "lillipup", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/506.png" + }, + { + "name": "herdier", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/507.png" + }, + { + "name": "stoutland", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/508.png" + }, + { + "name": "purrloin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/509.png" + }, + { + "name": "liepard", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/510.png" + }, + { + "name": "pansage", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/511.png" + }, + { + "name": "simisage", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/512.png" + }, + { + "name": "pansear", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/513.png" + }, + { + "name": "simisear", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/514.png" + }, + { + "name": "panpour", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/515.png" + }, + { + "name": "simipour", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/516.png" + }, + { + "name": "munna", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/517.png" + }, + { + "name": "musharna", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/518.png" + }, + { + "name": "pidove", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/519.png" + }, + { + "name": "tranquill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/520.png" + }, + { + "name": "unfezant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/521.png" + }, + { + "name": "blitzle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/522.png" + }, + { + "name": "zebstrika", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/523.png" + }, + { + "name": "roggenrola", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/524.png" + }, + { + "name": "boldore", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/525.png" + }, + { + "name": "gigalith", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/526.png" + }, + { + "name": "woobat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/527.png" + }, + { + "name": "swoobat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/528.png" + }, + { + "name": "drilbur", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/529.png" + }, + { + "name": "excadrill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/530.png" + }, + { + "name": "audino", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/531.png" + }, + { + "name": "timburr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/532.png" + }, + { + "name": "gurdurr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/533.png" + }, + { + "name": "conkeldurr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/534.png" + }, + { + "name": "tympole", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/535.png" + }, + { + "name": "palpitoad", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/536.png" + }, + { + "name": "seismitoad", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/537.png" + }, + { + "name": "throh", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/538.png" + }, + { + "name": "sawk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/539.png" + }, + { + "name": "sewaddle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/540.png" + }, + { + "name": "swadloon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/541.png" + }, + { + "name": "leavanny", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/542.png" + }, + { + "name": "venipede", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/543.png" + }, + { + "name": "whirlipede", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/544.png" + }, + { + "name": "scolipede", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/545.png" + }, + { + "name": "cottonee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/546.png" + }, + { + "name": "whimsicott", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/547.png" + }, + { + "name": "petilil", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/548.png" + }, + { + "name": "lilligant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/549.png" + }, + { + "name": "basculin red striped", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/550.png" + }, + { + "name": "sandile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/551.png" + }, + { + "name": "krokorok", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/552.png" + }, + { + "name": "krookodile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/553.png" + }, + { + "name": "darumaka", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/554.png" + }, + { + "name": "darmanitan standard", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/555.png" + }, + { + "name": "maractus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/556.png" + }, + { + "name": "dwebble", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/557.png" + }, + { + "name": "crustle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/558.png" + }, + { + "name": "scraggy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/559.png" + }, + { + "name": "scrafty", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/560.png" + }, + { + "name": "sigilyph", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/561.png" + }, + { + "name": "yamask", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/562.png" + }, + { + "name": "cofagrigus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/563.png" + }, + { + "name": "tirtouga", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/564.png" + }, + { + "name": "carracosta", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/565.png" + }, + { + "name": "archen", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/566.png" + }, + { + "name": "archeops", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/567.png" + }, + { + "name": "trubbish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/568.png" + }, + { + "name": "garbodor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/569.png" + }, + { + "name": "zorua", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/570.png" + }, + { + "name": "zoroark", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/571.png" + }, + { + "name": "minccino", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/572.png" + }, + { + "name": "cinccino", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/573.png" + }, + { + "name": "gothita", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/574.png" + }, + { + "name": "gothorita", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/575.png" + }, + { + "name": "gothitelle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/576.png" + }, + { + "name": "solosis", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/577.png" + }, + { + "name": "duosion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/578.png" + }, + { + "name": "reuniclus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/579.png" + }, + { + "name": "ducklett", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/580.png" + }, + { + "name": "swanna", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/581.png" + }, + { + "name": "vanillite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/582.png" + }, + { + "name": "vanillish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/583.png" + }, + { + "name": "vanilluxe", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/584.png" + }, + { + "name": "deerling winter", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/585.png" + }, + { + "name": "sawsbuck winter", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/586.png" + }, + { + "name": "emolga", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/587.png" + }, + { + "name": "karrablast", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/588.png" + }, + { + "name": "escavalier", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/589.png" + }, + { + "name": "foongus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/590.png" + }, + { + "name": "amoonguss", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/591.png" + }, + { + "name": "frillish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/592.png" + }, + { + "name": "jellicent", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/593.png" + }, + { + "name": "alomomola", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/594.png" + }, + { + "name": "joltik", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/595.png" + }, + { + "name": "galvantula", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/596.png" + }, + { + "name": "ferroseed", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/597.png" + }, + { + "name": "ferrothorn", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/598.png" + }, + { + "name": "klink", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/599.png" + }, + { + "name": "klang", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/600.png" + }, + { + "name": "klinklang", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/601.png" + }, + { + "name": "tynamo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/602.png" + }, + { + "name": "eelektrik", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/603.png" + }, + { + "name": "eelektross", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/604.png" + }, + { + "name": "elgyem", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/605.png" + }, + { + "name": "beheeyem", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/606.png" + }, + { + "name": "litwick", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/607.png" + }, + { + "name": "lampent", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/608.png" + }, + { + "name": "chandelure", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/609.png" + }, + { + "name": "axew", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/610.png" + }, + { + "name": "fraxure", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/611.png" + }, + { + "name": "haxorus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/612.png" + }, + { + "name": "cubchoo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/613.png" + }, + { + "name": "beartic", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/614.png" + }, + { + "name": "cryogonal", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/615.png" + }, + { + "name": "shelmet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/616.png" + }, + { + "name": "accelgor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/617.png" + }, + { + "name": "stunfisk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/618.png" + }, + { + "name": "mienfoo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/619.png" + }, + { + "name": "mienshao", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/620.png" + }, + { + "name": "druddigon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/621.png" + }, + { + "name": "golett", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/622.png" + }, + { + "name": "golurk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/623.png" + }, + { + "name": "pawniard", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/624.png" + }, + { + "name": "bisharp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/625.png" + }, + { + "name": "bouffalant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/626.png" + }, + { + "name": "rufflet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/627.png" + }, + { + "name": "braviary", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/628.png" + }, + { + "name": "vullaby", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/629.png" + }, + { + "name": "mandibuzz", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/630.png" + }, + { + "name": "heatmor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/631.png" + }, + { + "name": "durant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/632.png" + }, + { + "name": "deino", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/633.png" + }, + { + "name": "zweilous", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/634.png" + }, + { + "name": "hydreigon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/635.png" + }, + { + "name": "larvesta", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/636.png" + }, + { + "name": "volcarona", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/637.png" + }, + { + "name": "cobalion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/638.png" + }, + { + "name": "terrakion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/639.png" + }, + { + "name": "virizion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/640.png" + }, + { + "name": "tornadus incarnate", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/641.png" + }, + { + "name": "thundurus incarnate", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/642.png" + }, + { + "name": "reshiram", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/643.png" + }, + { + "name": "zekrom", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/644.png" + }, + { + "name": "landorus incarnate", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/645.png" + }, + { + "name": "kyurem", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/646.png" + }, + { + "name": "keldeo ordinary", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/647.png" + }, + { + "name": "meloetta aria", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/648.png" + }, + { + "name": "genesect chill", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/649.png" + }, + { + "name": "chespin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/650.png" + }, + { + "name": "quilladin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/651.png" + }, + { + "name": "chesnaught", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/652.png" + }, + { + "name": "fennekin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/653.png" + }, + { + "name": "braixen", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/654.png" + }, + { + "name": "delphox", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/655.png" + }, + { + "name": "froakie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/656.png" + }, + { + "name": "frogadier", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/657.png" + }, + { + "name": "greninja", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/658.png" + }, + { + "name": "bunnelby", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/659.png" + }, + { + "name": "diggersby", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/660.png" + }, + { + "name": "fletchling", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/661.png" + }, + { + "name": "fletchinder", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/662.png" + }, + { + "name": "talonflame", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/663.png" + }, + { + "name": "scatterbug", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/664.png" + }, + { + "name": "spewpa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/665.png" + }, + { + "name": "vivillon poke ball", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/666.png" + }, + { + "name": "litleo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/667.png" + }, + { + "name": "pyroar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/668.png" + }, + { + "name": "flabebe white", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/669.png" + }, + { + "name": "floette white", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/670.png" + }, + { + "name": "florges white", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/671.png" + }, + { + "name": "skiddo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/672.png" + }, + { + "name": "gogoat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/673.png" + }, + { + "name": "pancham", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/674.png" + }, + { + "name": "pangoro", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/675.png" + }, + { + "name": "furfrou pharaoh", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/676.png" + }, + { + "name": "espurr", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/677.png" + }, + { + "name": "meowstic male", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/678.png" + }, + { + "name": "honedge", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/679.png" + }, + { + "name": "doublade", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/680.png" + }, + { + "name": "aegislash shield", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/681.png" + }, + { + "name": "spritzee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/682.png" + }, + { + "name": "aromatisse", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/683.png" + }, + { + "name": "swirlix", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/684.png" + }, + { + "name": "slurpuff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/685.png" + }, + { + "name": "inkay", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/686.png" + }, + { + "name": "malamar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/687.png" + }, + { + "name": "binacle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/688.png" + }, + { + "name": "barbaracle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/689.png" + }, + { + "name": "skrelp", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/690.png" + }, + { + "name": "dragalge", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/691.png" + }, + { + "name": "clauncher", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/692.png" + }, + { + "name": "clawitzer", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/693.png" + }, + { + "name": "helioptile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/694.png" + }, + { + "name": "heliolisk", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/695.png" + }, + { + "name": "tyrunt", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/696.png" + }, + { + "name": "tyrantrum", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/697.png" + }, + { + "name": "amaura", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/698.png" + }, + { + "name": "aurorus", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/699.png" + }, + { + "name": "sylveon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/700.png" + }, + { + "name": "hawlucha", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/701.png" + }, + { + "name": "dedenne", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/702.png" + }, + { + "name": "carbink", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/703.png" + }, + { + "name": "goomy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/704.png" + }, + { + "name": "sliggoo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/705.png" + }, + { + "name": "goodra", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/706.png" + }, + { + "name": "klefki", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/707.png" + }, + { + "name": "phantump", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/708.png" + }, + { + "name": "trevenant", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/709.png" + }, + { + "name": "pumpkaboo average", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/710.png" + }, + { + "name": "gourgeist average", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/711.png" + }, + { + "name": "bergmite", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/712.png" + }, + { + "name": "avalugg", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/713.png" + }, + { + "name": "noibat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/714.png" + }, + { + "name": "noivern", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/715.png" + }, + { + "name": "xerneas neutral", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/716.png" + }, + { + "name": "yveltal", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/717.png" + }, + { + "name": "zygarde", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/718.png" + }, + { + "name": "diancie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/719.png" + }, + { + "name": "hoopa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/720.png" + }, + { + "name": "volcanion", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/721.png" + }, + { + "name": "rowlet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/722.png" + }, + { + "name": "dartrix", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/723.png" + }, + { + "name": "decidueye", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/724.png" + }, + { + "name": "litten", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/725.png" + }, + { + "name": "torracat", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/726.png" + }, + { + "name": "incineroar", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/727.png" + }, + { + "name": "popplio", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/728.png" + }, + { + "name": "brionne", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/729.png" + }, + { + "name": "primarina", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/730.png" + }, + { + "name": "pikipek", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/731.png" + }, + { + "name": "trumbeak", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/732.png" + }, + { + "name": "toucannon", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/733.png" + }, + { + "name": "yungoos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/734.png" + }, + { + "name": "gumshoos", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/735.png" + }, + { + "name": "grubbin", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/736.png" + }, + { + "name": "charjabug", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/737.png" + }, + { + "name": "vikavolt", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/738.png" + }, + { + "name": "crabrawler", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/739.png" + }, + { + "name": "crabominable", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/740.png" + }, + { + "name": "oricorio baile", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/741.png" + }, + { + "name": "cutiefly", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/742.png" + }, + { + "name": "ribombee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/743.png" + }, + { + "name": "rockruff", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/744.png" + }, + { + "name": "lycanroc midday", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/745.png" + }, + { + "name": "wishiwashi solo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/746.png" + }, + { + "name": "mareanie", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/747.png" + }, + { + "name": "toxapex", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/748.png" + }, + { + "name": "mudbray", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/749.png" + }, + { + "name": "mudsdale", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/750.png" + }, + { + "name": "dewpider", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/751.png" + }, + { + "name": "araquanid", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/752.png" + }, + { + "name": "fomantis", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/753.png" + }, + { + "name": "lurantis", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/754.png" + }, + { + "name": "morelull", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/755.png" + }, + { + "name": "shiinotic", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/756.png" + }, + { + "name": "salandit", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/757.png" + }, + { + "name": "salazzle", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/758.png" + }, + { + "name": "stufful", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/759.png" + }, + { + "name": "bewear", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/760.png" + }, + { + "name": "bounsweet", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/761.png" + }, + { + "name": "steenee", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/762.png" + }, + { + "name": "tsareena", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/763.png" + }, + { + "name": "comfey", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/764.png" + }, + { + "name": "oranguru", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/765.png" + }, + { + "name": "passimian", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/766.png" + }, + { + "name": "wimpod", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/767.png" + }, + { + "name": "golisopod", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/768.png" + }, + { + "name": "sandygast", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/769.png" + }, + { + "name": "palossand", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/770.png" + }, + { + "name": "pyukumuku", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/771.png" + }, + { + "name": "type null", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/772.png" + }, + { + "name": "silvally fairy", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/773.png" + }, + { + "name": "minior red meteor", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/774.png" + }, + { + "name": "komala", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/775.png" + }, + { + "name": "turtonator", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/776.png" + }, + { + "name": "togedemaru", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/777.png" + }, + { + "name": "mimikyu disguised", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/778.png" + }, + { + "name": "bruxish", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/779.png" + }, + { + "name": "drampa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/780.png" + }, + { + "name": "dhelmise", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/781.png" + }, + { + "name": "jangmo o", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/782.png" + }, + { + "name": "hakamo o", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/783.png" + }, + { + "name": "kommo o", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/784.png" + }, + { + "name": "tapu koko", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/785.png" + }, + { + "name": "tapu lele", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/786.png" + }, + { + "name": "tapu bulu", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/787.png" + }, + { + "name": "tapu fini", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/788.png" + }, + { + "name": "cosmog", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/789.png" + }, + { + "name": "cosmoem", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/790.png" + }, + { + "name": "solgaleo", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/791.png" + }, + { + "name": "lunala", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/792.png" + }, + { + "name": "nihilego", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/793.png" + }, + { + "name": "buzzwole", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/794.png" + }, + { + "name": "pheromosa", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/795.png" + }, + { + "name": "xurkitree", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/796.png" + }, + { + "name": "celesteela", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/797.png" + }, + { + "name": "kartana", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/798.png" + }, + { + "name": "guzzlord", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/799.png" + }, + { + "name": "necrozma", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/800.png" + }, + { + "name": "magearna", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/801.png" + }, + { + "name": "marshadow", + "imageURL": "https://www.serebii.net/sunmoon/pokemon/802.png" + } +] \ No newline at end of file diff --git a/assets/k.json b/assets/k.json new file mode 100644 index 00000000..6b92f358 --- /dev/null +++ b/assets/k.json @@ -0,0 +1 @@ +{"link1":"http://cdn.awwni.me/16c8v.jpg","link2":"http://i.imgur.com/06YTAjg.jpg","link3":"http://i.imgur.com/0cXfzlu.jpg","link4":"http://i.imgur.com/0skVenv.jpg","link5":"http://i.imgur.com/16rGP2n.jpg","link6":"http://i.imgur.com/2ixz0tk.jpg","link7":"http://i.imgur.com/3z74PMH.jpg","link8":"http://i.imgur.com/4PYuCei.jpg","link9":"http://i.imgur.com/7xWnKOn.jpg","link10":"http://i.imgur.com/C30p5wA.jpg","link11":"http://i.imgur.com/ErGXndQ.jpg","link12":"http://i.imgur.com/Ey5FK9I.jpg","link13":"http://i.imgur.com/G47U9KC.jpg","link14":"http://i.imgur.com/Gj7oKGB.jpg","link15":"http://i.imgur.com/HXaXWk2.jpg","link16":"http://i.imgur.com/IEAW4BY.jpg","link17":"http://i.imgur.com/LJDX5qE.jpg","link18":"http://i.imgur.com/Mpxglm1.jpg","link19":"http://i.imgur.com/QS2SmLA.jpg","link20":"http://i.imgur.com/S5E9rka.jpg","link21":"http://i.imgur.com/ToVkOJI.jpg","link22":"http://i.imgur.com/Ve2j4bR.jpg","link23":"http://i.imgur.com/W52Ru7O.jpg","link24":"http://i.imgur.com/XttRXwP.jpg","link25":"http://i.imgur.com/dmcperI.jpg","link26":"http://i.imgur.com/ifkqa67.jpg","link27":"http://i.imgur.com/k5e66l7.jpg","link28":"http://i.imgur.com/lNkxMVC.jpg","link29":"http://i.imgur.com/p6JJXFS.jpg","link30":"http://i.imgur.com/uBhXzmO.jpg","link31":"http://i.imgur.com/uu07NHm.jpg","link32":"http://i.imgur.com/wOPiPOF.jpg","link33":"http://i0.kym-cdn.com/photos/images/original/001/385/682/c2d.jpg","link34":"http://imgzam.com/uploads/4/2336/5zrymhsckxal7oa1.jpeg","link35":"http://mgewiki.com/images/2/25/Lesser_Succubus_extra_art.jpg","link36":"http://www.hentairider.com/media/images_640/3/dragonball-z-hentai-doujinshi/dragonball-z-hentai-doujinshi-100312.jpg","link37":"http://wx1.sinaimg.cn/large/ebf9c1e9gy1fgff67d08fj20h00d7goi.jpg](http://wx1.sinaimg.cn/large/ebf9c1e9gy1fgff67d08fj20h00d7goi.jpg","link38":"https://78.media.tumblr.com/5461760371d32cfb27227c1dbd59c8df/tumblr_pdx9arwH0T1wx9mdfo1_1280.jpg","link39":"https://cdn.awwni.me/100op.jpg","link40":"https://cdn.awwni.me/101wn.jpg","link41":"https://cdn.awwni.me/1029a.jpg","link42":"https://cdn.awwni.me/103ak.jpg","link43":"https://cdn.awwni.me/106ha.jpg","link44":"https://cdn.awwni.me/108h3.jpg","link45":"https://cdn.awwni.me/10d8v.jpg","link46":"https://cdn.awwni.me/10dea.jpg","link47":"https://cdn.awwni.me/10dop.jpg","link48":"https://cdn.awwni.me/10dy5.jpg","link49":"https://cdn.awwni.me/10fpp.jpg","link50":"https://cdn.awwni.me/10hk7.jpg","link51":"https://cdn.awwni.me/10iyu.jpg","link52":"https://cdn.awwni.me/10j4m.jpg","link53":"https://cdn.awwni.me/10jn8.jpg","link54":"https://cdn.awwni.me/10jv6.jpg","link55":"https://cdn.awwni.me/10jyc.jpg","link56":"https://cdn.awwni.me/10kov.jpg","link57":"https://cdn.awwni.me/10nk5.jpg","link58":"https://cdn.awwni.me/10nu0.jpg","link59":"https://cdn.awwni.me/10ob4.jpg","link60":"https://cdn.awwni.me/10q60.jpg","link61":"https://cdn.awwni.me/10r0x.jpg","link62":"https://cdn.awwni.me/10rli.jpg","link63":"https://cdn.awwni.me/10ryt.jpg","link64":"https://cdn.awwni.me/10sd2.jpg","link65":"https://cdn.awwni.me/10so5.jpg","link66":"https://cdn.awwni.me/10txp.jpg","link67":"https://cdn.awwni.me/10upu.jpg","link68":"https://cdn.awwni.me/10z8o.jpg","link69":"https://cdn.awwni.me/110jm.jpg","link70":"https://cdn.awwni.me/11102.jpg","link71":"https://cdn.awwni.me/111r0.jpg","link72":"https://cdn.awwni.me/1132c.jpg","link73":"https://cdn.awwni.me/113a6.jpg","link74":"https://cdn.awwni.me/113ne.jpg","link75":"https://cdn.awwni.me/113yj.jpg","link76":"https://cdn.awwni.me/114o1.jpg","link77":"https://cdn.awwni.me/116c0.jpg","link78":"https://cdn.awwni.me/116hh.jpg","link79":"https://cdn.awwni.me/116qp.jpg","link80":"https://cdn.awwni.me/116t1.jpg","link81":"https://cdn.awwni.me/116xx.jpg","link82":"https://cdn.awwni.me/1179s.jpg","link83":"https://cdn.awwni.me/1183o.jpg","link84":"https://cdn.awwni.me/118ny.jpg","link85":"https://cdn.awwni.me/119ru.jpg","link86":"https://cdn.awwni.me/11a4u.jpg","link87":"https://cdn.awwni.me/11acz.jpg","link88":"https://cdn.awwni.me/11akf.jpg","link89":"https://cdn.awwni.me/11aro.jpg","link90":"https://cdn.awwni.me/11c23.jpg","link91":"https://cdn.awwni.me/11c66.jpg","link92":"https://cdn.awwni.me/11ga4.jpg","link93":"https://cdn.awwni.me/11gfh.jpg","link94":"https://cdn.awwni.me/11j59.jpg","link95":"https://cdn.awwni.me/11jpi.jpg","link96":"https://cdn.awwni.me/11jsm.jpg","link97":"https://cdn.awwni.me/11jza.jpg","link98":"https://cdn.awwni.me/11kyq.jpg","link99":"https://cdn.awwni.me/11lfh.jpg","link100":"https://cdn.awwni.me/11lwq.jpg","link101":"https://cdn.awwni.me/11mfw.jpg","link102":"https://cdn.awwni.me/11mrn.jpg","link103":"https://cdn.awwni.me/11oki.jpg","link104":"https://cdn.awwni.me/11r82.jpg","link105":"https://cdn.awwni.me/11rr3.jpg","link106":"https://cdn.awwni.me/11s38.jpg","link107":"https://cdn.awwni.me/11sak.jpg","link108":"https://cdn.awwni.me/11sok.jpg","link109":"https://cdn.awwni.me/11t9q.jpg","link110":"https://cdn.awwni.me/11u97.jpg","link111":"https://cdn.awwni.me/11uk9.jpg","link112":"https://cdn.awwni.me/11x3u.jpg","link113":"https://cdn.awwni.me/11zvf.jpg","link114":"https://cdn.awwni.me/12144.jpg","link115":"https://cdn.awwni.me/121hz.jpg","link116":"https://cdn.awwni.me/121kk.jpg","link117":"https://cdn.awwni.me/121p1.jpg","link118":"https://cdn.awwni.me/124e3.jpg","link119":"https://cdn.awwni.me/125nu.jpg","link120":"https://cdn.awwni.me/1266g.jpg","link121":"https://cdn.awwni.me/126p1.jpg","link122":"https://cdn.awwni.me/1273q.jpg","link123":"https://cdn.awwni.me/12771.jpg","link124":"https://cdn.awwni.me/129qv.jpg","link125":"https://cdn.awwni.me/12ag2.jpg","link126":"https://cdn.awwni.me/12aue.jpg","link127":"https://cdn.awwni.me/12bje.jpg","link128":"https://cdn.awwni.me/12bwr.jpg","link129":"https://cdn.awwni.me/12d4y.jpg","link130":"https://cdn.awwni.me/12d7b.jpg","link131":"https://cdn.awwni.me/12djd.jpg","link132":"https://cdn.awwni.me/12efe.jpg","link133":"https://cdn.awwni.me/12ely.jpg","link134":"https://cdn.awwni.me/12erd.jpg","link135":"https://cdn.awwni.me/12ex9.jpg","link136":"https://cdn.awwni.me/12f03.jpg","link137":"https://cdn.awwni.me/12fgj.jpg","link138":"https://cdn.awwni.me/12fr1.jpg","link139":"https://cdn.awwni.me/12fyi.jpg","link140":"https://cdn.awwni.me/12g9w.jpg","link141":"https://cdn.awwni.me/12gom.jpg","link142":"https://cdn.awwni.me/12hvb.jpg","link143":"https://cdn.awwni.me/12ibl.jpg","link144":"https://cdn.awwni.me/12j41.jpg","link145":"https://cdn.awwni.me/12jkf.jpg","link146":"https://cdn.awwni.me/12jq3.jpg","link147":"https://cdn.awwni.me/12l93.jpg","link148":"https://cdn.awwni.me/12mk8.jpg","link149":"https://cdn.awwni.me/12mp9.jpg","link150":"https://cdn.awwni.me/12mtw.jpg","link151":"https://cdn.awwni.me/12opq.jpg","link152":"https://cdn.awwni.me/12pix.jpg","link153":"https://cdn.awwni.me/12pq5.jpg","link154":"https://cdn.awwni.me/12qsj.jpg","link155":"https://cdn.awwni.me/12r18.jpg","link156":"https://cdn.awwni.me/12rhe.jpg","link157":"https://cdn.awwni.me/12tdx.jpg","link158":"https://cdn.awwni.me/12to1.jpg","link159":"https://cdn.awwni.me/12u4l.jpg","link160":"https://cdn.awwni.me/12u8s.jpg","link161":"https://cdn.awwni.me/12vaf.jpg","link162":"https://cdn.awwni.me/12wgf.jpg","link163":"https://cdn.awwni.me/12wse.jpg","link164":"https://cdn.awwni.me/12xnn.jpg","link165":"https://cdn.awwni.me/12ybx.jpg","link166":"https://cdn.awwni.me/12zh6.jpg","link167":"https://cdn.awwni.me/12zr1.jpg","link168":"https://cdn.awwni.me/1311y.jpg","link169":"https://cdn.awwni.me/1320x.jpg","link170":"https://cdn.awwni.me/13327.jpg","link171":"https://cdn.awwni.me/134kh.jpg","link172":"https://cdn.awwni.me/1358e.jpg","link173":"https://cdn.awwni.me/1362a.jpg","link174":"https://cdn.awwni.me/137ps.jpg","link175":"https://cdn.awwni.me/137xz.jpg","link176":"https://cdn.awwni.me/13al7.jpg","link177":"https://cdn.awwni.me/13an7.jpg","link178":"https://cdn.awwni.me/13b1c.jpg","link179":"https://cdn.awwni.me/13boh.jpg","link180":"https://cdn.awwni.me/13d8r.jpg","link181":"https://cdn.awwni.me/13e73.jpg","link182":"https://cdn.awwni.me/13f15.jpg","link183":"https://cdn.awwni.me/13gyv.jpg","link184":"https://cdn.awwni.me/13h77.jpg","link185":"https://cdn.awwni.me/13hv7.jpg","link186":"https://cdn.awwni.me/13i0w.jpg","link187":"https://cdn.awwni.me/13j0c.jpg","link188":"https://cdn.awwni.me/13j8q.jpg","link189":"https://cdn.awwni.me/13n9y.jpg","link190":"https://cdn.awwni.me/13nva.jpg","link191":"https://cdn.awwni.me/13oij.jpg","link192":"https://cdn.awwni.me/13oqx.jpg","link193":"https://cdn.awwni.me/13p8e.jpg","link194":"https://cdn.awwni.me/13qka.jpg","link195":"https://cdn.awwni.me/13qud.jpg","link196":"https://cdn.awwni.me/13qvz.jpg","link197":"https://cdn.awwni.me/13r2e.jpg","link198":"https://cdn.awwni.me/13rjx.jpg","link199":"https://cdn.awwni.me/13s2z.jpg","link200":"https://cdn.awwni.me/13uwc.jpg","link201":"https://cdn.awwni.me/13v2t.jpg","link202":"https://cdn.awwni.me/13w7m.jpg","link203":"https://cdn.awwni.me/13wvo.jpg","link204":"https://cdn.awwni.me/13x2i.jpg","link205":"https://cdn.awwni.me/13xwu.jpg","link206":"https://cdn.awwni.me/13y54.jpg","link207":"https://cdn.awwni.me/140fn.jpg","link208":"https://cdn.awwni.me/140wi.jpg","link209":"https://cdn.awwni.me/14174.jpg","link210":"https://cdn.awwni.me/141bj.jpg","link211":"https://cdn.awwni.me/141rj.jpg","link212":"https://cdn.awwni.me/1427p.jpg","link213":"https://cdn.awwni.me/1449r.jpg","link214":"https://cdn.awwni.me/144xs.jpg","link215":"https://cdn.awwni.me/149y5.jpg","link216":"https://cdn.awwni.me/14c2u.jpg","link217":"https://cdn.awwni.me/14ddr.jpg","link218":"https://cdn.awwni.me/14dq2.jpg","link219":"https://cdn.awwni.me/14ecf.jpg","link220":"https://cdn.awwni.me/14esv.jpg","link221":"https://cdn.awwni.me/14f6n.jpg","link222":"https://cdn.awwni.me/14hg6.jpg","link223":"https://cdn.awwni.me/14jp9.jpg","link224":"https://cdn.awwni.me/14kgm.jpg","link225":"https://cdn.awwni.me/14lbj.jpg","link226":"https://cdn.awwni.me/14lyk.jpg","link227":"https://cdn.awwni.me/14mrw.jpg","link228":"https://cdn.awwni.me/14n1h.jpg","link229":"https://cdn.awwni.me/14rgw.jpg","link230":"https://cdn.awwni.me/14s0f.jpg","link231":"https://cdn.awwni.me/14tpf.jpg","link232":"https://cdn.awwni.me/14tz5.jpg","link233":"https://cdn.awwni.me/14uey.jpg","link234":"https://cdn.awwni.me/14ul7.jpg","link235":"https://cdn.awwni.me/14v33.jpg","link236":"https://cdn.awwni.me/14wf9.jpg","link237":"https://cdn.awwni.me/14wx2.jpg","link238":"https://cdn.awwni.me/14x49.jpg","link239":"https://cdn.awwni.me/14xpz.jpg","link240":"https://cdn.awwni.me/14xtd.jpg","link241":"https://cdn.awwni.me/14xxd.jpg","link242":"https://cdn.awwni.me/14yh3.jpg","link243":"https://cdn.awwni.me/14z6j.jpg","link244":"https://cdn.awwni.me/14zf0.jpg","link245":"https://cdn.awwni.me/1511e.jpg","link246":"https://cdn.awwni.me/152y8.jpg","link247":"https://cdn.awwni.me/153hz.jpg","link248":"https://cdn.awwni.me/153pr.jpg","link249":"https://cdn.awwni.me/1547x.jpg","link250":"https://cdn.awwni.me/154an.jpg","link251":"https://cdn.awwni.me/1555q.jpg","link252":"https://cdn.awwni.me/155cw.jpg","link253":"https://cdn.awwni.me/156cd.jpg","link254":"https://cdn.awwni.me/15870.jpg","link255":"https://cdn.awwni.me/158t0.jpg","link256":"https://cdn.awwni.me/15921.jpg","link257":"https://cdn.awwni.me/1598y.jpg","link258":"https://cdn.awwni.me/159k6.jpg","link259":"https://cdn.awwni.me/15afo.jpg","link260":"https://cdn.awwni.me/15b0h.jpg","link261":"https://cdn.awwni.me/15cil.jpg","link262":"https://cdn.awwni.me/15ew4.jpg","link263":"https://cdn.awwni.me/15g33.jpg","link264":"https://cdn.awwni.me/15g9g.jpg","link265":"https://cdn.awwni.me/15gk3.jpg","link266":"https://cdn.awwni.me/15gzx.jpg","link267":"https://cdn.awwni.me/15i3u.jpg","link268":"https://cdn.awwni.me/15iuo.jpg","link269":"https://cdn.awwni.me/15iw2.jpg","link270":"https://cdn.awwni.me/15jlv.jpg","link271":"https://cdn.awwni.me/15oii.jpg","link272":"https://cdn.awwni.me/15pet.jpg","link273":"https://cdn.awwni.me/15pfw.jpg","link274":"https://cdn.awwni.me/15q4r.jpg","link275":"https://cdn.awwni.me/15rp3.jpg","link276":"https://cdn.awwni.me/15rs1.jpg","link277":"https://cdn.awwni.me/15s5g.jpg","link278":"https://cdn.awwni.me/15sca.jpg","link279":"https://cdn.awwni.me/15t7p.jpg","link280":"https://cdn.awwni.me/15tii.jpg","link281":"https://cdn.awwni.me/15van.jpg","link282":"https://cdn.awwni.me/15x0b.jpg","link283":"https://cdn.awwni.me/15x8m.jpg","link284":"https://cdn.awwni.me/162j4.jpg","link285":"https://cdn.awwni.me/16451.jpg","link286":"https://cdn.awwni.me/164pi.jpg","link287":"https://cdn.awwni.me/165dg.jpg","link288":"https://cdn.awwni.me/16788.jpg","link289":"https://cdn.awwni.me/168nc.jpg","link290":"https://cdn.awwni.me/1695q.jpg","link291":"https://cdn.awwni.me/16acs.jpg","link292":"https://cdn.awwni.me/16aow.jpg","link293":"https://cdn.awwni.me/16b20.jpg","link294":"https://cdn.awwni.me/16c0k.jpg","link295":"https://cdn.awwni.me/16c7i.jpg","link296":"https://cdn.awwni.me/16ckd.jpg","link297":"https://cdn.awwni.me/16dfg.jpg","link298":"https://cdn.awwni.me/16dws.jpg","link299":"https://cdn.awwni.me/16f0l.jpg","link300":"https://cdn.awwni.me/16gj5.jpg","link301":"https://cdn.awwni.me/16jfo.jpg","link302":"https://cdn.awwni.me/16k0s.jpg","link303":"https://cdn.awwni.me/16kd8.jpg","link304":"https://cdn.awwni.me/16l17.jpg","link305":"https://cdn.awwni.me/16n90.jpg","link306":"https://cdn.awwni.me/16nxc.jpg","link307":"https://cdn.awwni.me/16osf.jpg","link308":"https://cdn.awwni.me/16q3g.jpg","link309":"https://cdn.awwni.me/16uab.jpg","link310":"https://cdn.awwni.me/16vtr.jpg","link311":"https://cdn.awwni.me/16wsy.jpg","link312":"https://cdn.awwni.me/16xjc.jpg","link313":"https://cdn.awwni.me/171ff.jpg","link314":"https://cdn.awwni.me/1737h.jpg","link315":"https://cdn.awwni.me/173nh.jpg","link316":"https://cdn.awwni.me/174kc.jpg","link317":"https://cdn.awwni.me/1754a.jpg","link318":"https://cdn.awwni.me/175mx.jpg","link319":"https://cdn.awwni.me/176d1.jpg","link320":"https://cdn.awwni.me/177dw.jpg","link321":"https://cdn.awwni.me/177tb.jpg","link322":"https://cdn.awwni.me/178ki.jpg","link323":"https://cdn.awwni.me/179lb.jpg","link324":"https://cdn.awwni.me/17bqf.jpg","link325":"https://cdn.awwni.me/17cvs.jpg","link326":"https://cdn.awwni.me/17di3.jpg","link327":"https://cdn.awwni.me/17e75.jpg","link328":"https://cdn.awwni.me/17gij.jpg","link329":"https://cdn.awwni.me/17jub.jpg","link330":"https://cdn.awwni.me/17m9p.jpg","link331":"https://cdn.awwni.me/17qcp.jpg","link332":"https://cdn.awwni.me/17tdt.jpg","link333":"https://cdn.awwni.me/180di.jpg","link334":"https://cdn.awwni.me/18173.jpg","link335":"https://cdn.awwni.me/181r8.jpg","link336":"https://cdn.awwni.me/1820i.jpg","link337":"https://cdn.awwni.me/182zn.jpg","link338":"https://cdn.awwni.me/1839g.jpg","link339":"https://cdn.awwni.me/1862t.jpg","link340":"https://cdn.awwni.me/1870m.jpg","link341":"https://cdn.awwni.me/188oo.jpg","link342":"https://cdn.awwni.me/189rs.jpg","link343":"https://cdn.awwni.me/18bot.jpg","link344":"https://cdn.awwni.me/18co9.jpg","link345":"https://cdn.awwni.me/18doa.jpg","link346":"https://cdn.awwni.me/18doe.jpg","link347":"https://cdn.awwni.me/18gdr.jpg","link348":"https://cdn.awwni.me/18jd6.jpg","link349":"https://cdn.awwni.me/18qfk.jpg","link350":"https://cdn.awwni.me/18rob.jpg","link351":"https://cdn.awwni.me/18sb4.jpg","link352":"https://cdn.awwni.me/18sm2.jpg","link353":"https://cdn.awwni.me/18tj2.jpg","link354":"https://cdn.awwni.me/18wkd.jpg","link355":"https://cdn.awwni.me/18z2g.jpg","link356":"https://cdn.awwni.me/190yl.jpg","link357":"https://cdn.awwni.me/195ce.jpg","link358":"https://cdn.awwni.me/1972m.jpg","link359":"https://cdn.awwni.me/198pl.jpg","link360":"https://cdn.awwni.me/19b1l.jpg","link361":"https://cdn.awwni.me/19bac.jpg","link362":"https://cdn.awwni.me/19bv6.jpg","link363":"https://cdn.awwni.me/19fgv.jpg","link364":"https://cdn.awwni.me/19h1o.jpg","link365":"https://cdn.awwni.me/19i3q.jpg","link366":"https://cdn.awwni.me/19iiz.jpg","link367":"https://cdn.awwni.me/19j6q.jpg","link368":"https://cdn.awwni.me/19mb5.jpg","link369":"https://cdn.awwni.me/19oiw.jpg","link370":"https://cdn.awwni.me/19thm.jpg","link371":"https://cdn.awwni.me/19u4f.jpg","link372":"https://cdn.awwni.me/19uo3.jpg","link373":"https://cdn.awwni.me/19yvw.jpg","link374":"https://cdn.awwni.me/1a2pp.jpg","link375":"https://cdn.awwni.me/1a3i8.jpg","link376":"https://cdn.awwni.me/1a46h.jpg","link377":"https://cdn.awwni.me/1a5ne.jpg","link378":"https://cdn.awwni.me/1a6nf.jpg","link379":"https://cdn.awwni.me/1a8bp.jpg","link380":"https://cdn.awwni.me/1ae02.jpg","link381":"https://cdn.awwni.me/1af3n.jpg","link382":"https://cdn.awwni.me/1ahxg.jpg","link383":"https://cdn.awwni.me/1aj2y.jpg","link384":"https://cdn.awwni.me/1ajik.jpg","link385":"https://cdn.awwni.me/1akow.jpg","link386":"https://cdn.awwni.me/1alzc.jpg","link387":"https://cdn.awwni.me/1amoe.jpg","link388":"https://cdn.awwni.me/1ao6i.jpg","link389":"https://cdn.awwni.me/1ap6w.jpg","link390":"https://cdn.awwni.me/1avxt.jpg","link391":"https://cdn.awwni.me/1aypx.jpg","link392":"https://cdn.awwni.me/1azzu.jpg","link393":"https://cdn.awwni.me/1b0pu.jpg","link394":"https://cdn.awwni.me/1b4yj.jpg","link395":"https://cdn.awwni.me/1bc0y.jpg","link396":"https://cdn.awwni.me/1bdw0.jpg","link397":"https://cdn.awwni.me/1bfcq.jpg","link398":"https://cdn.awwni.me/1bgr4.jpg","link399":"https://cdn.awwni.me/1bk5w.jpg","link400":"https://cdn.awwni.me/1bkw9.jpg","link401":"https://cdn.awwni.me/1bmtv.jpg","link402":"https://cdn.awwni.me/1bnsl.jpg","link403":"https://cdn.awwni.me/1bp0t.jpg","link404":"https://cdn.awwni.me/1bqk3.jpg","link405":"https://cdn.awwni.me/1bsac.jpg","link406":"https://cdn.awwni.me/1bsug.jpg","link407":"https://cdn.awwni.me/1btbs.jpg","link408":"https://cdn.awwni.me/1bupn.jpg","link409":"https://cdn.awwni.me/1bxgl.jpg","link410":"https://cdn.awwni.me/1bxxe.jpg","link411":"https://cdn.awwni.me/1bz9y.jpg","link412":"https://cdn.awwni.me/1bzzb.jpg","link413":"https://cdn.awwni.me/1c12h.jpg","link414":"https://cdn.awwni.me/1c2xl.jpg","link415":"https://cdn.awwni.me/1c4mc.jpg","link416":"https://cdn.awwni.me/1c58k.jpg","link417":"https://cdn.awwni.me/1c5rd.jpg","link418":"https://cdn.awwni.me/1c7sm.jpg","link419":"https://cdn.awwni.me/1c88x.jpg","link420":"https://cdn.awwni.me/1c9f6.jpg","link421":"https://cdn.awwni.me/1c9fj.jpg","link422":"https://cdn.awwni.me/1cb53.jpg","link423":"https://cdn.awwni.me/1cck4.jpg","link424":"https://cdn.awwni.me/1cfgs.jpg","link425":"https://cdn.awwni.me/1cgpm.jpg","link426":"https://cdn.awwni.me/1chyz.jpg","link427":"https://cdn.awwni.me/1cjik.jpg","link428":"https://cdn.awwni.me/1ckbt.jpg","link429":"https://cdn.awwni.me/1ckwp.jpg","link430":"https://cdn.awwni.me/1cmg4.jpg","link431":"https://cdn.awwni.me/1cn8z.jpg","link432":"https://cdn.awwni.me/1cnzt.jpg","link433":"https://cdn.awwni.me/1cohm.jpg","link434":"https://cdn.awwni.me/1cp1l.jpg","link435":"https://cdn.awwni.me/1crsc.jpg","link436":"https://cdn.awwni.me/1ctas.jpg","link437":"https://cdn.awwni.me/1cxfj.jpg","link438":"https://cdn.awwni.me/1cyzh.jpg","link439":"https://cdn.awwni.me/1d0q1.jpg","link440":"https://cdn.awwni.me/1d20y.jpg","link441":"https://cdn.awwni.me/1d2yi.jpg","link442":"https://cdn.awwni.me/1d770.jpg","link443":"https://cdn.awwni.me/1d83z.jpg","link444":"https://cdn.awwni.me/1dabe.jpg","link445":"https://cdn.awwni.me/1de9t.jpg","link446":"https://cdn.awwni.me/1diez.jpg","link447":"https://cdn.awwni.me/1dkz4.jpg","link448":"https://cdn.awwni.me/1dm4f.jpg","link449":"https://cdn.awwni.me/1dplu.jpg","link450":"https://cdn.awwni.me/1dsok.jpg","link451":"https://cdn.awwni.me/1dugo.jpg","link452":"https://cdn.awwni.me/1dwu0.jpg","link453":"https://cdn.awwni.me/1dxwa.jpg","link454":"https://cdn.awwni.me/1dyh3.jpg","link455":"https://cdn.awwni.me/1e03b.jpg","link456":"https://cdn.awwni.me/1e46i.jpg","link457":"https://cdn.awwni.me/1e5wr.jpg","link458":"https://cdn.awwni.me/1e6fb.jpg","link459":"https://cdn.awwni.me/1ebe6.jpg","link460":"https://cdn.awwni.me/1ecuy.jpg","link461":"https://cdn.awwni.me/1ee1t.jpg","link462":"https://cdn.awwni.me/1eer6.jpg","link463":"https://cdn.awwni.me/1ehbu.jpg","link464":"https://cdn.awwni.me/1em4a.jpg","link465":"https://cdn.awwni.me/1etys.jpg","link466":"https://cdn.awwni.me/1f50e.jpg","link467":"https://cdn.awwni.me/1f6ei.jpg","link468":"https://cdn.awwni.me/1f8it.jpg","link469":"https://cdn.awwni.me/1f943.jpg","link470":"https://cdn.awwni.me/1fcid.jpg","link471":"https://cdn.awwni.me/1fdff.jpg","link472":"https://cdn.awwni.me/1fejt.jpg","link473":"https://cdn.awwni.me/1ffsf.jpg","link474":"https://cdn.awwni.me/1fguq.jpg","link475":"https://cdn.awwni.me/1fhs8.jpg","link476":"https://cdn.awwni.me/1fn7s.jpg","link477":"https://cdn.awwni.me/1fnyp.jpg","link478":"https://cdn.awwni.me/1fwas.jpg","link479":"https://cdn.awwni.me/1fy50.jpg","link480":"https://cdn.awwni.me/1fzsp.jpg","link481":"https://cdn.awwni.me/1g1wk.jpg","link482":"https://cdn.awwni.me/1gbmy.jpg","link483":"https://cdn.awwni.me/1gfik.jpg","link484":"https://cdn.awwni.me/1gi6n.jpg","link485":"https://cdn.awwni.me/1gimk.jpg","link486":"https://cdn.awwni.me/1gkiz.jpg","link487":"https://cdn.awwni.me/1gq81.jpg","link488":"https://cdn.awwni.me/1gsr0.jpg","link489":"https://cdn.awwni.me/1gulp.jpg","link490":"https://cdn.awwni.me/1gvtq.jpg","link491":"https://cdn.awwni.me/1gw7g.jpg","link492":"https://cdn.awwni.me/1gxtw.jpg","link493":"https://cdn.awwni.me/1h1gh.jpg","link494":"https://cdn.awwni.me/1h4st.jpg","link495":"https://cdn.awwni.me/1h6e8.jpg","link496":"https://cdn.awwni.me/1h6wt.jpg","link497":"https://cdn.awwni.me/1h8rp.jpg","link498":"https://cdn.awwni.me/1hiti.jpg","link499":"https://cdn.awwni.me/1hmas.jpg","link500":"https://cdn.awwni.me/1hntc.jpg","link501":"https://cdn.awwni.me/1hotv.jpg","link502":"https://cdn.awwni.me/1hquu.jpg","link503":"https://cdn.awwni.me/1hs2k.jpg","link504":"https://cdn.awwni.me/1hsbq.jpg","link505":"https://cdn.awwni.me/1hsid.jpg","link506":"https://cdn.awwni.me/1ht3t.jpg","link507":"https://cdn.awwni.me/1hyyc.jpg","link508":"https://cdn.awwni.me/1i3yq.jpg","link509":"https://cdn.awwni.me/1i6lc.jpg","link510":"https://cdn.awwni.me/1iaoy.jpg","link511":"https://cdn.awwni.me/1if7m.jpg","link512":"https://cdn.awwni.me/1ifyv.jpg","link513":"https://cdn.awwni.me/1imp5.jpg","link514":"https://cdn.awwni.me/1inub.jpg","link515":"https://cdn.awwni.me/1irgs.jpg","link516":"https://cdn.awwni.me/1iy2z.jpg","link517":"https://cdn.awwni.me/1j14k.jpg","link518":"https://cdn.awwni.me/1jck4.jpg","link519":"https://cdn.awwni.me/1jkq3.jpg","link520":"https://cdn.awwni.me/1jl33.jpg","link521":"https://cdn.awwni.me/1jo8f.jpg","link522":"https://cdn.awwni.me/1jpdu.jpg","link523":"https://cdn.awwni.me/1jqc5.jpg","link524":"https://cdn.awwni.me/1jrs0.jpg","link525":"https://cdn.awwni.me/1ju9p.jpg","link526":"https://cdn.awwni.me/1jwvz.jpg","link527":"https://cdn.awwni.me/1jy40.jpg","link528":"https://cdn.awwni.me/1jzw5.jpg","link529":"https://cdn.awwni.me/1k5o2.jpg","link530":"https://cdn.awwni.me/1k7lj.jpg","link531":"https://cdn.awwni.me/1k9kf.jpg","link532":"https://cdn.awwni.me/1kaoh.jpg","link533":"https://cdn.awwni.me/1kdoa.jpg","link534":"https://cdn.awwni.me/1kf4d.jpg","link535":"https://cdn.awwni.me/1kgkg.jpg","link536":"https://cdn.awwni.me/1kjl6.jpg","link537":"https://cdn.awwni.me/1kk34.jpg","link538":"https://cdn.awwni.me/1kpir.jpg","link539":"https://cdn.awwni.me/1ksz5.jpg","link540":"https://cdn.awwni.me/1ku09.jpg","link541":"https://cdn.awwni.me/1kv8w.jpg","link542":"https://cdn.awwni.me/t4kg.jpg","link543":"https://cdn.awwni.me/tgge.jpg","link544":"https://cdn.awwni.me/toj2.jpg","link545":"https://cdn.awwni.me/toyp.jpg","link546":"https://cdn.awwni.me/txby.jpg","link547":"https://cdn.awwni.me/u7hu.jpg","link548":"https://cdn.awwni.me/ualb.jpg","link549":"https://cdn.awwni.me/ucfb.jpg","link550":"https://cdn.awwni.me/uesl.jpg","link551":"https://cdn.awwni.me/uj4k.jpg","link552":"https://cdn.awwni.me/v3bn.jpg","link553":"https://cdn.awwni.me/v4qo.jpg","link554":"https://cdn.awwni.me/v9ns.jpg","link555":"https://cdn.awwni.me/ve2l.jpg","link556":"https://cdn.awwni.me/vof1.jpg","link557":"https://cdn.awwni.me/vqp5.jpg","link558":"https://cdn.awwni.me/wijn.jpg","link559":"https://cdn.awwni.me/wk5i.jpg","link560":"https://cdn.awwni.me/wnha.jpg","link561":"https://cdn.awwni.me/wnxn.jpg","link562":"https://cdn.awwni.me/wr89.jpg","link563":"https://cdn.awwni.me/x5uu.jpg","link564":"https://cdn.awwni.me/x7sf.jpg","link565":"https://cdn.awwni.me/xbzg.jpg","link566":"https://cdn.awwni.me/xcml.jpg","link567":"https://cdn.awwni.me/xd3e.jpg","link568":"https://cdn.awwni.me/xdh0.jpg","link569":"https://cdn.awwni.me/xjsx.jpg","link570":"https://cdn.awwni.me/xked.jpg","link571":"https://cdn.awwni.me/xl4y.jpg","link572":"https://cdn.awwni.me/xlgd.jpg","link573":"https://cdn.awwni.me/xrbu.jpg","link574":"https://cdn.awwni.me/xx3g.jpg","link575":"https://cdn.awwni.me/y00b.jpg","link576":"https://cdn.awwni.me/y0xf.jpg","link577":"https://cdn.awwni.me/y42v.jpg","link578":"https://cdn.awwni.me/y9wn.jpg","link579":"https://cdn.awwni.me/yc1t.jpg","link580":"https://cdn.awwni.me/yfsu.jpg","link581":"https://cdn.awwni.me/yhbc.jpg","link582":"https://cdn.awwni.me/yjxh.jpg","link583":"https://cdn.awwni.me/ykjo.jpg","link584":"https://cdn.awwni.me/ylen.jpg","link585":"https://cdn.awwni.me/ym7b.jpg","link586":"https://cdn.awwni.me/yn3a.jpg","link587":"https://cdn.awwni.me/yneb.jpg","link588":"https://cdn.awwni.me/yps6.jpg","link589":"https://cdn.awwni.me/yrc1.jpg","link590":"https://cdn.awwni.me/yrjn.jpg","link591":"https://cdn.awwni.me/ys5p.jpg","link592":"https://cdn.awwni.me/yuca.jpg","link593":"https://cdn.awwni.me/yy32.jpg","link594":"https://cdn.awwni.me/z028.jpg","link595":"https://cdn.awwni.me/z094.jpg","link596":"https://cdn.awwni.me/z1yl.jpg","link597":"https://cdn.awwni.me/z2ac.jpg","link598":"https://cdn.awwni.me/z3os.jpg","link599":"https://cdn.awwni.me/z4g5.jpg","link600":"https://cdn.awwni.me/z7fn.jpg","link601":"https://cdn.awwni.me/z87o.jpg","link602":"https://cdn.awwni.me/z93l.jpg","link603":"https://cdn.awwni.me/z9u5.jpg","link604":"https://cdn.awwni.me/za36.jpg","link605":"https://cdn.awwni.me/ze0d.jpg","link606":"https://cdn.awwni.me/zgzc.jpg","link607":"https://cdn.awwni.me/zhbr.jpg","link608":"https://cdn.awwni.me/zm82.jpg","link609":"https://cdn.awwni.me/zn8m.jpg","link610":"https://cdn.awwni.me/znld.jpg","link611":"https://cdn.awwni.me/znqh.jpg","link612":"https://cdn.awwni.me/znzq.jpg","link613":"https://cdn.awwni.me/zoma.jpg","link614":"https://cdn.awwni.me/zozx.jpg","link615":"https://cdn.awwni.me/zqag.jpg","link616":"https://cdn.awwni.me/zv51.jpg","link617":"https://cdn.awwni.me/zvoe.jpg","link618":"https://cdn.awwni.me/zwef.jpg","link619":"https://cdn.awwni.me/zwlw.jpg","link620":"https://cdn.awwni.me/zz3b.jpg","link621":"https://cdn.discordapp.com/attachments/318617514345103382/638960501258453023/FB_IMG_1572410410991.jpg","link622":"https://cdn2.desu-usergeneratedcontent.xyz/trash/image/1545/23/1545234247063.jpg","link623":"https://danbooru.donmai.us/data/__formidable_azur_lane_drawn_by_oyaji_sou__7145cf14ae22dc703a5b8bca372d2be2.jpg","link624":"https://danbooru.donmai.us/data/__original_drawn_by_akizora_momiji__e641fec1c5542b53ff925a94ff8d345f.jpg","link625":"https://danbooru.donmai.us/data/__original_drawn_by_hima__17c081d5d9af4aceb6577da77fa80b54.jpg","link626":"https://danbooru.donmai.us/data/sample/__original_drawn_by_oda_non__sample-755dc7e7b66ad08d0090aeb4b1ed5eab.jpg","link627":"https://danbooru.donmai.us/data/sample/__shoggoth_monster_girl_encyclopedia_drawn_by_yui_sora__sample-0174917b711bb33b3801464fe542aa9b.jpg","link628":"https://danbooru.donmai.us/data/sample/__taikoubou_houshin_engi_drawn_by_mimoza_96mimo414__sample-c0954324488dd290ca3477e4fcc15319.jpg","link629":"https://files.yande.re/image/4ce1c37806568986f7c3092d3358c25c/yande.re%20492398%20breasts%20garter%20maid%20nipples%20no_bra%20open_shirt%20orange_maru%20pantsu%20pantyhose%20penis%20pubic_hair%20pussy%20pussy_juice%20sex%20thighhighs%20thong%20uncensored%20yang-do.jpg","link630":"https://files.yande.re/image/c7d51775b9295d82f2ef777b91973fe1/yande.re%20483550%20anus%20ass%20bike_shorts%20buruma%20censored%20cum%20heroine_x%20maid%20megane%20nopan%20orange_maru%20pussy%20scanning_dust%20screening%20stockings%20thighhighs%20yang-do.jpg","link631":"https://files.yande.re/image/e08b09c5ad6d7027f06b5e659a0b66df/yande.re%20439525%20akizora_momiji%20areola%20darling_in_the_franxx%20horns%20naked%20wet%20zero_two_%28darling_in_the_franxx%29.jpg","link632":"https://hentaiprn.com/wp-content/gallery/24-4/2Sh9HvwRJ3s.jpg","link633":"https://hentaiprn.com/wp-content/gallery/4-6-hentaiprn/ad18248e0c0f79027aa996c2e8944241.jpg","link634":"https://hentaiprn.com/wp-content/gallery/4-6-hentaiprn/www.hiqqu_.xxx-aca5cf917bb298d0b89754088535df4a4cffb0ca.jpg","link635":"https://hentaiprn.com/wp-content/gallery/ass-and-neko-hentaiprn/m-ZRsVnv7jg.jpg","link636":"https://hentaiprn.com/wp-content/gallery/explicit-hentaiprn-images/66101648_p0.jpg","link637":"https://hentaiprn.com/wp-content/gallery/fresh-pics-hentaiprn/Pokey-gals.jpg","link638":"https://hentaiprn.com/wp-content/gallery/fresh-pics-hentaiprn/the-hunger-for-sperm.jpg","link639":"https://hentaiprn.com/wp-content/gallery/hentai-prn-smex/hh6gXAmy-Uk.jpg","link640":"https://hentaiprn.com/wp-content/gallery/hentaiprn-hentias/20887094.jpg","link641":"https://hentaiprn.com/wp-content/gallery/hentaiprn-nsfw/20890934.jpg","link642":"https://hentaiprn.com/wp-content/gallery/hentaiprn-salvation/204edb548edfc77137088bbbda990098.jpg","link643":"https://hentaiprn.com/wp-content/gallery/hentaiprn-salvation/Dinner.jpg","link644":"https://hentaiprn.com/wp-content/gallery/hentaiprn-xxx/obl6qnarz4p21.jpg","link645":"https://hentaiprn.com/wp-content/gallery/hentay-hentaiprn/Xze3tF3EZN0.jpg","link646":"https://hentaiprn.com/wp-content/gallery/neo-hentaiprn/nregM1lUNcP36Ub-mfCXzELjzyehQamSu4IKc1tv2-U.jpg","link647":"https://hentaiprn.com/wp-content/gallery/s-hentaiprn/22_bfjpaclyo3.jpg","link648":"https://i.imgur.com/02vVbgS.jpg","link649":"https://i.imgur.com/08QFRlb.jpg","link650":"https://i.imgur.com/0ALRBAp.jpg","link651":"https://i.imgur.com/0CLM2NV.jpg","link652":"https://i.imgur.com/0EqOOY3.jpg","link653":"https://i.imgur.com/0FJXB2r.jpg","link654":"https://i.imgur.com/0GnoUpF.jpg","link655":"https://i.imgur.com/0Jzhc9e.jpg","link656":"https://i.imgur.com/0OpX6EH.jpg","link657":"https://i.imgur.com/0Qx0NkV.jpg","link658":"https://i.imgur.com/0SLvrvu.jpg","link659":"https://i.imgur.com/0XFZ8Tv.jpg","link660":"https://i.imgur.com/0XNPeZ4.jpg","link661":"https://i.imgur.com/0aIypYi.jpg","link662":"https://i.imgur.com/0beKyNH.jpg","link663":"https://i.imgur.com/0c3ivB8.jpg","link664":"https://i.imgur.com/0cFwWvV.jpg","link665":"https://i.imgur.com/0dOgxKM.jpg","link666":"https://i.imgur.com/0eefmhB.jpg","link667":"https://i.imgur.com/0mj7OIY.jpg","link668":"https://i.imgur.com/0nIWFak.jpg","link669":"https://i.imgur.com/0oSUsNR.jpg","link670":"https://i.imgur.com/0xNmuc5.jpg","link671":"https://i.imgur.com/0yybbgI.jpg","link672":"https://i.imgur.com/0zoGwW7.jpg","link673":"https://i.imgur.com/12FFhaf.jpg","link674":"https://i.imgur.com/14Boxms.jpg","link675":"https://i.imgur.com/1650HBj.jpg","link676":"https://i.imgur.com/17qHabW.jpg","link677":"https://i.imgur.com/1BBs3RQ.jpg","link678":"https://i.imgur.com/1Ja69ek.jpg","link679":"https://i.imgur.com/1MtgzQJ.jpg","link680":"https://i.imgur.com/1PhwMQl.jpg","link681":"https://i.imgur.com/1aPF4sD.jpg","link682":"https://i.imgur.com/1avX302.jpg","link683":"https://i.imgur.com/1bzBflR.jpg","link684":"https://i.imgur.com/1dgSEqO.jpg","link685":"https://i.imgur.com/1hNlenL.jpg","link686":"https://i.imgur.com/1ijUKHP.jpg","link687":"https://i.imgur.com/1jfH9TN.jpg","link688":"https://i.imgur.com/1mcGX09.jpg","link689":"https://i.imgur.com/1mkPlQB.jpg","link690":"https://i.imgur.com/1mv87fG.jpg","link691":"https://i.imgur.com/1oTNopp.jpg","link692":"https://i.imgur.com/1ogujbt.jpg","link693":"https://i.imgur.com/1qnut90.jpg","link694":"https://i.imgur.com/1u5JXNr.jpg","link695":"https://i.imgur.com/1vnvxFx.jpg","link696":"https://i.imgur.com/1w3Wtrg.jpg","link697":"https://i.imgur.com/22i2aQl.jpg","link698":"https://i.imgur.com/24wZqGx.jpg","link699":"https://i.imgur.com/27wG6Qp.jpg","link700":"https://i.imgur.com/2BITeug.jpg","link701":"https://i.imgur.com/2Dpu4yt.jpg","link702":"https://i.imgur.com/2FZj1qQ.jpg","link703":"https://i.imgur.com/2MgnJbK.jpg","link704":"https://i.imgur.com/2OTKXFz.jpg","link705":"https://i.imgur.com/2PVIQp9.jpg","link706":"https://i.imgur.com/2acEwTr.jpg","link707":"https://i.imgur.com/2g1i7sx.jpg","link708":"https://i.imgur.com/2hdqRtK.jpg","link709":"https://i.imgur.com/2nloW47.jpg","link710":"https://i.imgur.com/2ohMguW.jpg","link711":"https://i.imgur.com/30LkuGu.jpg","link712":"https://i.imgur.com/34sVX8K.jpg","link713":"https://i.imgur.com/36zjS0z.jpg","link714":"https://i.imgur.com/39eoc87.jpg","link715":"https://i.imgur.com/3ARffrP.jpg","link716":"https://i.imgur.com/3AduRjM.jpg","link717":"https://i.imgur.com/3CdAoOf.jpg","link718":"https://i.imgur.com/3Di4Y7j.jpg","link719":"https://i.imgur.com/3EMrSra.jpg","link720":"https://i.imgur.com/3It9V2F.jpg","link721":"https://i.imgur.com/3M1bqYU.jpg","link722":"https://i.imgur.com/3NsDK4B.jpg","link723":"https://i.imgur.com/3Q4MGlp.jpg","link724":"https://i.imgur.com/3QzIuDk.jpg","link725":"https://i.imgur.com/3RW5w4d.jpg","link726":"https://i.imgur.com/3TWvE0W.jpg","link727":"https://i.imgur.com/3YK3t5I.jpg","link728":"https://i.imgur.com/3agcR2r.jpg","link729":"https://i.imgur.com/3c0V8hR.jpg","link730":"https://i.imgur.com/3e0fwDO.jpg","link731":"https://i.imgur.com/3faH073.jpg","link732":"https://i.imgur.com/3mZTrj7.jpg","link733":"https://i.imgur.com/3ngG9De.jpg","link734":"https://i.imgur.com/3oVKkHV.jpg","link735":"https://i.imgur.com/3qMtcxI.jpg","link736":"https://i.imgur.com/3v8d7cm.jpg","link737":"https://i.imgur.com/42mGUPE.jpg","link738":"https://i.imgur.com/49HVSHC.jpg","link739":"https://i.imgur.com/4APm2fT.jpg","link740":"https://i.imgur.com/4CJXLne.jpg","link741":"https://i.imgur.com/4D98kn1.jpg","link742":"https://i.imgur.com/4Dvnkx4.jpg","link743":"https://i.imgur.com/4K1Hvsr.jpg","link744":"https://i.imgur.com/4OY3Xgi.jpg","link745":"https://i.imgur.com/4PKJRkh.jpg","link746":"https://i.imgur.com/4PsK5M2.jpg","link747":"https://i.imgur.com/4RYriQq.jpg","link748":"https://i.imgur.com/4T2czF1.jpg","link749":"https://i.imgur.com/4YxXz6z.jpg","link750":"https://i.imgur.com/4eIQC4a.jpg","link751":"https://i.imgur.com/4el2lEa.jpg","link752":"https://i.imgur.com/4hlGf6R.jpg","link753":"https://i.imgur.com/4huYVTt.jpg","link754":"https://i.imgur.com/4ihJkC9.jpg","link755":"https://i.imgur.com/4im7FRp.jpg","link756":"https://i.imgur.com/4p9wLEf.jpg","link757":"https://i.imgur.com/4qcTz0Q.jpg","link758":"https://i.imgur.com/4tfop6d.jpg","link759":"https://i.imgur.com/4uxeQmE.jpg","link760":"https://i.imgur.com/4v9OeT1.jpg","link761":"https://i.imgur.com/55oGj8r.jpg","link762":"https://i.imgur.com/57ZOX59.jpg","link763":"https://i.imgur.com/5COJ5zV.jpg","link764":"https://i.imgur.com/5DGTPr1.jpg","link765":"https://i.imgur.com/5HcpDJt.jpg","link766":"https://i.imgur.com/5IC3RZP.jpg","link767":"https://i.imgur.com/5Kli7Bh.jpg","link768":"https://i.imgur.com/5O2HqXB.jpg","link769":"https://i.imgur.com/5OCxSmR.jpg","link770":"https://i.imgur.com/5SMJA18.jpg","link771":"https://i.imgur.com/5ZANyA3.jpg","link772":"https://i.imgur.com/5bPq1Zx.jpg","link773":"https://i.imgur.com/5knezML.jpg","link774":"https://i.imgur.com/5nNQtMd.jpg","link775":"https://i.imgur.com/5qkswTC.jpg","link776":"https://i.imgur.com/5sUSVMp.jpg","link777":"https://i.imgur.com/5tAo2PR.jpg","link778":"https://i.imgur.com/5tQ3Bwm.jpg","link779":"https://i.imgur.com/5w8gaz9.jpg","link780":"https://i.imgur.com/600ou0O.jpg","link781":"https://i.imgur.com/60HgIRZ.jpg","link782":"https://i.imgur.com/6193PJa.jpg","link783":"https://i.imgur.com/65RzFp8.jpg","link784":"https://i.imgur.com/66luV9j.jpg","link785":"https://i.imgur.com/6BEuHWQ.jpg","link786":"https://i.imgur.com/6CosTCt.jpg","link787":"https://i.imgur.com/6DpXAjS.jpg","link788":"https://i.imgur.com/6IvNKgS.jpg","link789":"https://i.imgur.com/6JQ9P5z.jpg","link790":"https://i.imgur.com/6LpjWqI.jpg","link791":"https://i.imgur.com/6OFU97I.jpg","link792":"https://i.imgur.com/6ZKN5gR.jpg","link793":"https://i.imgur.com/6gagDs3.jpg","link794":"https://i.imgur.com/6grjARQ.jpg","link795":"https://i.imgur.com/6hDinAg.jpg","link796":"https://i.imgur.com/6mpVEPj.jpg","link797":"https://i.imgur.com/6tkLikP.jpg","link798":"https://i.imgur.com/6tpNVTK.jpg","link799":"https://i.imgur.com/6wNatyf.jpg","link800":"https://i.imgur.com/6wSU6ac.jpg","link801":"https://i.imgur.com/6xyIlnF.jpg","link802":"https://i.imgur.com/6zrMQcZ.jpg","link803":"https://i.imgur.com/72o3rlZ.jpg","link804":"https://i.imgur.com/77KCHis.jpg","link805":"https://i.imgur.com/78ywsFu.jpg","link806":"https://i.imgur.com/7HIsaW3.jpg","link807":"https://i.imgur.com/7P0b2np.jpg","link808":"https://i.imgur.com/7PK2R8I.jpg","link809":"https://i.imgur.com/7SAfMbL.jpg","link810":"https://i.imgur.com/7T4HTG9.jpg","link811":"https://i.imgur.com/7Vrsl9V.jpg","link812":"https://i.imgur.com/7WmVft0.jpg","link813":"https://i.imgur.com/7gElfI4.jpg","link814":"https://i.imgur.com/7gYVgzP.jpg","link815":"https://i.imgur.com/7i0WRQ2.jpg","link816":"https://i.imgur.com/7o8JwEz.jpg","link817":"https://i.imgur.com/7q3ecoa.jpg","link818":"https://i.imgur.com/7sS24Wc.jpg","link819":"https://i.imgur.com/7wygBpy.jpg","link820":"https://i.imgur.com/81Yook6.jpg","link821":"https://i.imgur.com/83qav2S.jpg","link822":"https://i.imgur.com/8BHqyuv.jpg","link823":"https://i.imgur.com/8BlYcWS.jpg","link824":"https://i.imgur.com/8DPZlNs.jpg","link825":"https://i.imgur.com/8Fckv0U.jpg","link826":"https://i.imgur.com/8JbdD8A.jpg","link827":"https://i.imgur.com/8LbG66R.jpg","link828":"https://i.imgur.com/8O0tE2q.jpg","link829":"https://i.imgur.com/8RUvYr5.jpg","link830":"https://i.imgur.com/8TwIZqe.jpg","link831":"https://i.imgur.com/8TzsMJY.jpg","link832":"https://i.imgur.com/8UnsPIz.jpg","link833":"https://i.imgur.com/8YPvjVp.jpg","link834":"https://i.imgur.com/8Za28oB.jpg","link835":"https://i.imgur.com/8aZJrk1.jpg","link836":"https://i.imgur.com/8cyqkUG.jpg","link837":"https://i.imgur.com/8dNCMgT.jpg","link838":"https://i.imgur.com/8kf210t.jpg","link839":"https://i.imgur.com/8nE6Sja.jpg","link840":"https://i.imgur.com/8vk2DBh.jpg","link841":"https://i.imgur.com/8wcwkUf.jpg","link842":"https://i.imgur.com/8znb3wa.jpg","link843":"https://i.imgur.com/90DmD4N.jpg","link844":"https://i.imgur.com/90LGl1w.jpg","link845":"https://i.imgur.com/91Q9CEo.jpg","link846":"https://i.imgur.com/93rmeou.jpg","link847":"https://i.imgur.com/95dOZsZ.jpg","link848":"https://i.imgur.com/964ymFl.jpg","link849":"https://i.imgur.com/97aLEsT.jpg","link850":"https://i.imgur.com/98o0C9W.jpg","link851":"https://i.imgur.com/9Bt7lgt.jpg","link852":"https://i.imgur.com/9GTUm7Z.jpg","link853":"https://i.imgur.com/9KWZfH5.jpg","link854":"https://i.imgur.com/9OoF44t.jpg","link855":"https://i.imgur.com/9XfUvGn.jpg","link856":"https://i.imgur.com/9Zl2LiM.jpg","link857":"https://i.imgur.com/9ZqPxvE.jpg","link858":"https://i.imgur.com/9f3JIqN.jpg","link859":"https://i.imgur.com/9mnwXqy.jpg","link860":"https://i.imgur.com/9nlilzA.jpg","link861":"https://i.imgur.com/9oFy28g.jpg","link862":"https://i.imgur.com/9s5t0ve.jpg","link863":"https://i.imgur.com/9usvTER.jpg","link864":"https://i.imgur.com/9zn3XAU.jpg","link865":"https://i.imgur.com/A0iwD9G.jpg","link866":"https://i.imgur.com/A9xcfJs.jpg","link867":"https://i.imgur.com/AAYJ9L1.jpg","link868":"https://i.imgur.com/ABFBQeg.jpg","link869":"https://i.imgur.com/AFCkgA6.jpg","link870":"https://i.imgur.com/AHkOWsf.jpg","link871":"https://i.imgur.com/AKm1Njk.jpg","link872":"https://i.imgur.com/AMcoVyH.jpg","link873":"https://i.imgur.com/AP4Kr4e.jpg","link874":"https://i.imgur.com/ARi38tA.jpg","link875":"https://i.imgur.com/ATrTcGD.jpg","link876":"https://i.imgur.com/AVlnI9z.jpg","link877":"https://i.imgur.com/AYacZAH.jpg","link878":"https://i.imgur.com/AcJkkKh.jpg","link879":"https://i.imgur.com/Ae69AJq.jpg","link880":"https://i.imgur.com/Af7ETTc.jpg","link881":"https://i.imgur.com/Ah5kgtK.jpg","link882":"https://i.imgur.com/AiQN5pQ.jpg","link883":"https://i.imgur.com/ApMyNGH.jpg","link884":"https://i.imgur.com/ArVIUW2.jpg","link885":"https://i.imgur.com/AsEVyFa.jpg","link886":"https://i.imgur.com/AskHaO6.jpg","link887":"https://i.imgur.com/AtMkkMY.jpg","link888":"https://i.imgur.com/Avw5ErF.jpg","link889":"https://i.imgur.com/AxD82YE.jpg","link890":"https://i.imgur.com/AyCgMHl.jpg?1","link891":"https://i.imgur.com/Aywl4ZN.jpg","link892":"https://i.imgur.com/AzgqGTt.jpg","link893":"https://i.imgur.com/Azy8Vov.jpg","link894":"https://i.imgur.com/B1usY1u.jpg","link895":"https://i.imgur.com/B4w8NiA.jpg","link896":"https://i.imgur.com/B5yMIH5.jpg","link897":"https://i.imgur.com/B6Kmscr.jpg","link898":"https://i.imgur.com/B6gqx8S.jpg","link899":"https://i.imgur.com/BCYhpOp.jpg","link900":"https://i.imgur.com/BFDXaP4.jpg","link901":"https://i.imgur.com/BHaKAuh.jpg","link902":"https://i.imgur.com/BKgz9Kr.jpg","link903":"https://i.imgur.com/BLHivIV.jpg","link904":"https://i.imgur.com/BNwO2n6.jpg","link905":"https://i.imgur.com/BQbdiOq.jpg","link906":"https://i.imgur.com/BQwGQdB.jpg","link907":"https://i.imgur.com/BV3SRmt.jpg","link908":"https://i.imgur.com/Bbjidwu.jpg","link909":"https://i.imgur.com/BbxymCY.jpg","link910":"https://i.imgur.com/Bg8UutI.jpg","link911":"https://i.imgur.com/BjGU3tq.jpg","link912":"https://i.imgur.com/BjoQ9Ns.jpg","link913":"https://i.imgur.com/Bl4qsu0.jpg","link914":"https://i.imgur.com/BlqfviB.jpg","link915":"https://i.imgur.com/BrIXYlU.jpg","link916":"https://i.imgur.com/BtU0udj.jpg","link917":"https://i.imgur.com/BvP9qUj.jpg","link918":"https://i.imgur.com/BzmcT88.jpg","link919":"https://i.imgur.com/C00QJW1.jpg","link920":"https://i.imgur.com/C0usF57.jpg","link921":"https://i.imgur.com/C1REpGC.jpg","link922":"https://i.imgur.com/C5Z2lqU.jpg","link923":"https://i.imgur.com/C5cYrM8.jpg","link924":"https://i.imgur.com/C8y5wOn.jpg","link925":"https://i.imgur.com/CBLBc0s.jpg","link926":"https://i.imgur.com/CIdGYoi.jpg","link927":"https://i.imgur.com/CJuHQ9m.jpg","link928":"https://i.imgur.com/CJys3Uj.jpg","link929":"https://i.imgur.com/CL1ozkq.jpg","link930":"https://i.imgur.com/CM8XxKd.jpg","link931":"https://i.imgur.com/CQyguuv.jpg","link932":"https://i.imgur.com/CTavJrx.jpg","link933":"https://i.imgur.com/CUvlHNE.jpg","link934":"https://i.imgur.com/CZXWs57.jpg","link935":"https://i.imgur.com/CaIWF2e.jpg","link936":"https://i.imgur.com/ChEmoTj.jpg","link937":"https://i.imgur.com/ChonSKW.jpg","link938":"https://i.imgur.com/CiFoOVC.jpg","link939":"https://i.imgur.com/CzDZIRm.jpg","link940":"https://i.imgur.com/Czgwbbc.jpg","link941":"https://i.imgur.com/D3HCouT.jpg","link942":"https://i.imgur.com/D5bFmtM.jpg","link943":"https://i.imgur.com/D8n2ZmI.jpg","link944":"https://i.imgur.com/DGqF00a.jpg","link945":"https://i.imgur.com/DLPwrsP.jpg","link946":"https://i.imgur.com/DMwLdkB.jpg","link947":"https://i.imgur.com/DQGR8J9.jpg","link948":"https://i.imgur.com/DVfA4Wq.jpg","link949":"https://i.imgur.com/DXMEqsh.jpg","link950":"https://i.imgur.com/DXlibtf.jpg","link951":"https://i.imgur.com/DYO5TWM.jpg","link952":"https://i.imgur.com/DZlL2vE.jpg","link953":"https://i.imgur.com/DZziL9z.jpg","link954":"https://i.imgur.com/DcvkQW4.jpg","link955":"https://i.imgur.com/DdDaPey.jpg","link956":"https://i.imgur.com/DegpEoT.jpg","link957":"https://i.imgur.com/DhBwQFB.jpg","link958":"https://i.imgur.com/Dif3nAk.jpg","link959":"https://i.imgur.com/DkkaSb6.jpg","link960":"https://i.imgur.com/DoeNtUa.jpg","link961":"https://i.imgur.com/DtQq3ae.jpg","link962":"https://i.imgur.com/E1q96LN.jpg","link963":"https://i.imgur.com/E3V6hfz.jpg","link964":"https://i.imgur.com/E50AxRa.jpg","link965":"https://i.imgur.com/E7lFGWQ.jpg","link966":"https://i.imgur.com/E8KiNU3.jpg","link967":"https://i.imgur.com/E8YAs1h.jpg","link968":"https://i.imgur.com/EERqfWJ.jpg","link969":"https://i.imgur.com/ELyTijs.jpg","link970":"https://i.imgur.com/EMUlg7K.jpg","link971":"https://i.imgur.com/EWClJZZ.jpg","link972":"https://i.imgur.com/EWgJwgM.jpg","link973":"https://i.imgur.com/EZcQd65.jpg","link974":"https://i.imgur.com/EbMC9Au.jpg","link975":"https://i.imgur.com/EbnntrN.jpg","link976":"https://i.imgur.com/EeEFf1U.jpg","link977":"https://i.imgur.com/EhOeJvW.jpg","link978":"https://i.imgur.com/Ej4UZ3o.jpg","link979":"https://i.imgur.com/EjHmpKS.jpg","link980":"https://i.imgur.com/Ekm5PaA.jpg","link981":"https://i.imgur.com/ElLjUJU.jpg","link982":"https://i.imgur.com/Enoa5IN.jpg","link983":"https://i.imgur.com/Eo79sP5.jpg","link984":"https://i.imgur.com/EpCjtF7.jpg","link985":"https://i.imgur.com/EsNNTwU.jpg","link986":"https://i.imgur.com/EsOulXt.jpg","link987":"https://i.imgur.com/Eu6WyzW.jpg","link988":"https://i.imgur.com/EyeH6bX.jpg","link989":"https://i.imgur.com/Ez6Y8dv.jpg","link990":"https://i.imgur.com/F5EITMV.jpg","link991":"https://i.imgur.com/F9rd9Yd.jpg","link992":"https://i.imgur.com/FB7va1K.jpg","link993":"https://i.imgur.com/FEEuL0b.jpg","link994":"https://i.imgur.com/FG6bBHZ.jpg","link995":"https://i.imgur.com/FKAHLT5.jpg","link996":"https://i.imgur.com/FLLELf6.jpg","link997":"https://i.imgur.com/FM37gVK.jpg","link998":"https://i.imgur.com/FNHAyUx.jpg","link999":"https://i.imgur.com/FR8Zbc7.jpg","link1000":"https://i.imgur.com/FRDHJ07.jpg","link1001":"https://i.imgur.com/FRKlzKF.jpg","link1002":"https://i.imgur.com/FTkBIdB.jpg","link1003":"https://i.imgur.com/FUwZLW2.jpg","link1004":"https://i.imgur.com/FYDdCBe.jpg","link1005":"https://i.imgur.com/Fb3aRKo.jpg","link1006":"https://i.imgur.com/FbHl9vt.jpg","link1007":"https://i.imgur.com/Ff5bRco.jpg","link1008":"https://i.imgur.com/Fiuhkhc.jpg","link1009":"https://i.imgur.com/FoDANQB.jpg","link1010":"https://i.imgur.com/FpE6MLj.jpg","link1011":"https://i.imgur.com/FrovyBP.jpg","link1012":"https://i.imgur.com/Fua2ErC.jpg","link1013":"https://i.imgur.com/FvxQLLD.jpg","link1014":"https://i.imgur.com/FwIAWw9.jpg","link1015":"https://i.imgur.com/FxHjzus.jpg","link1016":"https://i.imgur.com/G1fqgCo.jpg","link1017":"https://i.imgur.com/G23bUkc.jpg","link1018":"https://i.imgur.com/G51e7CC.jpg","link1019":"https://i.imgur.com/G6mqA5K.jpg","link1020":"https://i.imgur.com/GA15JF5.jpg","link1021":"https://i.imgur.com/GAlSPhI.jpg","link1022":"https://i.imgur.com/GBldfye.jpg","link1023":"https://i.imgur.com/GEVI0hz.jpg","link1024":"https://i.imgur.com/GGOa5po.jpg","link1025":"https://i.imgur.com/GGVES8F.jpg","link1026":"https://i.imgur.com/GJPOdIs.jpg","link1027":"https://i.imgur.com/GLacjKb.jpg","link1028":"https://i.imgur.com/GU6K0Wt.jpg","link1029":"https://i.imgur.com/GYjcO5R.jpg","link1030":"https://i.imgur.com/Gb5DwK5.jpg","link1031":"https://i.imgur.com/GbeoDKL.jpg","link1032":"https://i.imgur.com/Gf7Ds0X.jpg","link1033":"https://i.imgur.com/GiUCqkl.jpg","link1034":"https://i.imgur.com/GixePnP.jpg","link1035":"https://i.imgur.com/GjKpDh3.jpg","link1036":"https://i.imgur.com/GkuvEJl.jpg","link1037":"https://i.imgur.com/GnfR6Zx.jpg","link1038":"https://i.imgur.com/GpaNxK9.jpg","link1039":"https://i.imgur.com/GqPbaxJ.jpg","link1040":"https://i.imgur.com/GqmmOan.jpg","link1041":"https://i.imgur.com/Gqtiaef.jpg","link1042":"https://i.imgur.com/GrPUwiu.jpg","link1043":"https://i.imgur.com/Gs256DZ.jpg","link1044":"https://i.imgur.com/Gvww8Hv.jpg","link1045":"https://i.imgur.com/Gy6nWUR.jpg","link1046":"https://i.imgur.com/H15sSB3.jpg","link1047":"https://i.imgur.com/H485lQ7.jpg","link1048":"https://i.imgur.com/H4NpNkJ.jpg","link1049":"https://i.imgur.com/H8dfPp3.jpg","link1050":"https://i.imgur.com/H9tEu3P.jpg","link1051":"https://i.imgur.com/HBt5YJI.jpg","link1052":"https://i.imgur.com/HGhMPVZ.jpg","link1053":"https://i.imgur.com/HHBodQ4.jpg","link1054":"https://i.imgur.com/HKK5SSa.jpg","link1055":"https://i.imgur.com/HM3FqFZ.jpg","link1056":"https://i.imgur.com/HNkOtDe.jpg","link1057":"https://i.imgur.com/HO779NT.jpg","link1058":"https://i.imgur.com/HSSODI1.jpg","link1059":"https://i.imgur.com/HT6D2wZ.jpg","link1060":"https://i.imgur.com/HWcNxEV.jpg","link1061":"https://i.imgur.com/HYSHYgp.jpg","link1062":"https://i.imgur.com/HeW9jfj.jpg","link1063":"https://i.imgur.com/HnYzSoQ.jpg","link1064":"https://i.imgur.com/HouHdf1.jpg","link1065":"https://i.imgur.com/HsZDHOM.jpg","link1066":"https://i.imgur.com/HukEiCU.jpg","link1067":"https://i.imgur.com/HvogHqh.jpg","link1068":"https://i.imgur.com/I0K7N1P.jpg","link1069":"https://i.imgur.com/I1rXeC0.jpg","link1070":"https://i.imgur.com/I6JJJtA.jpg","link1071":"https://i.imgur.com/I6bJ0oe.jpg","link1072":"https://i.imgur.com/I8mXsmr.jpg","link1073":"https://i.imgur.com/I9JGCCh.jpg","link1074":"https://i.imgur.com/IDTASeQ.jpg","link1075":"https://i.imgur.com/IL4PC4x.jpg","link1076":"https://i.imgur.com/IMnW65G.jpg","link1077":"https://i.imgur.com/ISBg29Q.jpg","link1078":"https://i.imgur.com/IXPoqpL.jpg","link1079":"https://i.imgur.com/IZ43ypZ.jpg","link1080":"https://i.imgur.com/IZAn7HJ.jpg","link1081":"https://i.imgur.com/IdYjiOu.jpg","link1082":"https://i.imgur.com/IeqfMYK.jpg","link1083":"https://i.imgur.com/IhfHgbN.jpg","link1084":"https://i.imgur.com/InMjf4u.jpg","link1085":"https://i.imgur.com/IokH2cl.jpg","link1086":"https://i.imgur.com/ItMGIfm.jpg","link1087":"https://i.imgur.com/ItTq474.jpg","link1088":"https://i.imgur.com/ItdVvj4.jpg","link1089":"https://i.imgur.com/IuZ84o5.jpg","link1090":"https://i.imgur.com/J3e98am.jpg","link1091":"https://i.imgur.com/J5l3SFf.jpg","link1092":"https://i.imgur.com/JGCGjBk.jpg","link1093":"https://i.imgur.com/JJMJee5.jpg","link1094":"https://i.imgur.com/JJmi931.jpg","link1095":"https://i.imgur.com/JLGppYJ.jpg","link1096":"https://i.imgur.com/JT1AnNb.jpg","link1097":"https://i.imgur.com/JTlR6qy.jpg","link1098":"https://i.imgur.com/JU6x3BC.jpg","link1099":"https://i.imgur.com/JVUy3B9.jpg","link1100":"https://i.imgur.com/JWUSsza.jpg","link1101":"https://i.imgur.com/JYIvobt.jpg","link1102":"https://i.imgur.com/JbmlIwH.jpg","link1103":"https://i.imgur.com/Ji9kqx4.jpg","link1104":"https://i.imgur.com/JoAWqZr.jpg","link1105":"https://i.imgur.com/JoiKNNn.jpg","link1106":"https://i.imgur.com/JqI2l25.jpg","link1107":"https://i.imgur.com/Ju3xVik.jpg","link1108":"https://i.imgur.com/JuKQSzA.jpg","link1109":"https://i.imgur.com/JvFJrJ0.jpg","link1110":"https://i.imgur.com/JvqfZ4T.jpg","link1111":"https://i.imgur.com/JwxguC5.jpg","link1112":"https://i.imgur.com/K1P89pR.jpg","link1113":"https://i.imgur.com/K1escGZ.jpg","link1114":"https://i.imgur.com/K6YaW03.jpg","link1115":"https://i.imgur.com/K9jMFdZ.jpg","link1116":"https://i.imgur.com/KCWANuC.jpg","link1117":"https://i.imgur.com/KFOecqC.jpg","link1118":"https://i.imgur.com/KIAYVhb.jpg","link1119":"https://i.imgur.com/KJ2t7zw.jpg","link1120":"https://i.imgur.com/KJ8lUmX.jpg","link1121":"https://i.imgur.com/KJPaU8y.jpg","link1122":"https://i.imgur.com/KM2wEGl.jpg","link1123":"https://i.imgur.com/KPX6C3B.jpg","link1124":"https://i.imgur.com/KPimWb6.jpg","link1125":"https://i.imgur.com/KQIUIdg.jpg","link1126":"https://i.imgur.com/KR0lIV5.jpg","link1127":"https://i.imgur.com/KSSEbwx.jpg","link1128":"https://i.imgur.com/KStDeXm.jpg","link1129":"https://i.imgur.com/KbKiRrb.jpg","link1130":"https://i.imgur.com/KiFiQRJ.jpg","link1131":"https://i.imgur.com/Kit3Rzk.jpg","link1132":"https://i.imgur.com/Kk3bFkt.jpg","link1133":"https://i.imgur.com/KpPuthS.jpg","link1134":"https://i.imgur.com/Kxf6rrG.jpg","link1135":"https://i.imgur.com/KyIR58A.jpg","link1136":"https://i.imgur.com/L5UGQUU.jpg","link1137":"https://i.imgur.com/L8Fu1K9.jpg","link1138":"https://i.imgur.com/LD3Oplu.jpg","link1139":"https://i.imgur.com/LD42Opc.jpg","link1140":"https://i.imgur.com/LEK3vZ8.jpg","link1141":"https://i.imgur.com/LF3Hvh7.jpg","link1142":"https://i.imgur.com/LJSWq67.jpg","link1143":"https://i.imgur.com/LJvvWPYh.jpg","link1144":"https://i.imgur.com/LNEw8Wq.jpg","link1145":"https://i.imgur.com/LRGWPZf.jpg","link1146":"https://i.imgur.com/LRLuA1c.jpg","link1147":"https://i.imgur.com/LVHniO0.jpg","link1148":"https://i.imgur.com/LVTnFu4.jpg","link1149":"https://i.imgur.com/LWMDNaa.jpg","link1150":"https://i.imgur.com/LYDP0RI.jpg","link1151":"https://i.imgur.com/LZLa62a.jpg","link1152":"https://i.imgur.com/LbuSADL.jpg","link1153":"https://i.imgur.com/LcicKAT.jpg","link1154":"https://i.imgur.com/Lg0LuGd.jpg","link1155":"https://i.imgur.com/LhkH6rD.jpg","link1156":"https://i.imgur.com/LpuzUTV.jpg","link1157":"https://i.imgur.com/LqURKmV.jpg","link1158":"https://i.imgur.com/LsJGHX6h.jpg","link1159":"https://i.imgur.com/LsPZoFy.jpg","link1160":"https://i.imgur.com/M0K0wtI.jpg","link1161":"https://i.imgur.com/MABK8Ok.jpg","link1162":"https://i.imgur.com/MD412eY.jpg","link1163":"https://i.imgur.com/MDjNwll.jpg","link1164":"https://i.imgur.com/MGL4rVJ.jpg","link1165":"https://i.imgur.com/MGTwxBw.jpg","link1166":"https://i.imgur.com/MINpuvq.jpg","link1167":"https://i.imgur.com/MJjaVHC.jpg","link1168":"https://i.imgur.com/ML15QJB.jpg","link1169":"https://i.imgur.com/MLzEz03.jpg","link1170":"https://i.imgur.com/MTnXXhi.jpg","link1171":"https://i.imgur.com/MaF5cVt.jpg","link1172":"https://i.imgur.com/MgXWxSq.jpg","link1173":"https://i.imgur.com/MlCrQh2.jpg","link1174":"https://i.imgur.com/MogN8x4.jpg","link1175":"https://i.imgur.com/MrTlLUF.jpg","link1176":"https://i.imgur.com/Msktqux.jpg","link1177":"https://i.imgur.com/MyR6wMDh.jpg","link1178":"https://i.imgur.com/N3n0hNF.jpg","link1179":"https://i.imgur.com/N4efHNh.jpg","link1180":"https://i.imgur.com/NCdQdTf.jpg","link1181":"https://i.imgur.com/NCmjmmS.jpg","link1182":"https://i.imgur.com/NDUqt1T.jpg","link1183":"https://i.imgur.com/NJzAoMS.jpg","link1184":"https://i.imgur.com/NLO6rq7.jpg","link1185":"https://i.imgur.com/NP5JMoV.jpg","link1186":"https://i.imgur.com/NPnxTED.jpg","link1187":"https://i.imgur.com/NTN3Jix.jpg","link1188":"https://i.imgur.com/NTks9ws.jpg","link1189":"https://i.imgur.com/NUXsUil.jpg","link1190":"https://i.imgur.com/NUzQLj4.jpg","link1191":"https://i.imgur.com/NXTxw9y.jpg","link1192":"https://i.imgur.com/NXXxCfh.jpg","link1193":"https://i.imgur.com/NYyzCqr.jpg","link1194":"https://i.imgur.com/NaTIu4b.jpg","link1195":"https://i.imgur.com/NesULkO.jpg","link1196":"https://i.imgur.com/NhQSPTy.jpg","link1197":"https://i.imgur.com/Nry1xRN.jpg","link1198":"https://i.imgur.com/Nwu3ELm.jpg","link1199":"https://i.imgur.com/Ny6OZz2.jpg","link1200":"https://i.imgur.com/NzUYFya.jpg","link1201":"https://i.imgur.com/O5MJ4oX.jpg","link1202":"https://i.imgur.com/O6VhnNJ.jpg","link1203":"https://i.imgur.com/OLbt74d.jpg","link1204":"https://i.imgur.com/OMIsvMq.jpg","link1205":"https://i.imgur.com/OOPDJdm.jpg","link1206":"https://i.imgur.com/OOnbYTR.jpg","link1207":"https://i.imgur.com/OOxsB6s.jpg","link1208":"https://i.imgur.com/OQL0f2r.jpg","link1209":"https://i.imgur.com/OQngoFG.jpg","link1210":"https://i.imgur.com/ORWOblR.jpg","link1211":"https://i.imgur.com/ORZwH78.jpg","link1212":"https://i.imgur.com/OUOo9nX.jpg","link1213":"https://i.imgur.com/OV4MeBD.jpg","link1214":"https://i.imgur.com/OW0nscz.jpg","link1215":"https://i.imgur.com/OcSNB2r.jpg","link1216":"https://i.imgur.com/OdEFoPr.jpg","link1217":"https://i.imgur.com/OhYhXUL.jpg","link1218":"https://i.imgur.com/Ojv3x39.jpg","link1219":"https://i.imgur.com/OqLLTaL.jpg","link1220":"https://i.imgur.com/OsjHKFa.jpg","link1221":"https://i.imgur.com/Ov9JIN1.jpg","link1222":"https://i.imgur.com/OwWNxAM.jpg","link1223":"https://i.imgur.com/OxMvjgr.jpg","link1224":"https://i.imgur.com/OyvEkNx.jpg","link1225":"https://i.imgur.com/OzRHfeA.jpg","link1226":"https://i.imgur.com/P4JhAAa.jpg","link1227":"https://i.imgur.com/P4WqAPo.jpg","link1228":"https://i.imgur.com/P6s3F35.jpg","link1229":"https://i.imgur.com/P7Gdmpw.jpg","link1230":"https://i.imgur.com/PBAAvMM.jpg","link1231":"https://i.imgur.com/PBSpGTg.jpg","link1232":"https://i.imgur.com/PJPmYZM.jpg","link1233":"https://i.imgur.com/PLEI4Lc.jpg","link1234":"https://i.imgur.com/POtWz2R.jpg","link1235":"https://i.imgur.com/PP2qJIV.jpg","link1236":"https://i.imgur.com/PXMWiyA.jpg","link1237":"https://i.imgur.com/PYmVJk5.jpg","link1238":"https://i.imgur.com/PZ0bZSs.jpg","link1239":"https://i.imgur.com/PZITkE8.jpg","link1240":"https://i.imgur.com/PczfIMz.jpg","link1241":"https://i.imgur.com/Pd81fI8.jpg","link1242":"https://i.imgur.com/Pere9nW.jpg","link1243":"https://i.imgur.com/PfZE4fe.jpg","link1244":"https://i.imgur.com/PgD6mbH.jpg","link1245":"https://i.imgur.com/PkQsYQ7.jpg","link1246":"https://i.imgur.com/Pl3P81X.jpg","link1247":"https://i.imgur.com/PlJurq0.jpg","link1248":"https://i.imgur.com/PllRkKO.jpg","link1249":"https://i.imgur.com/Pos5hMD.jpg","link1250":"https://i.imgur.com/PpaRzYn.jpg","link1251":"https://i.imgur.com/Ppk0sba.jpg","link1252":"https://i.imgur.com/PtE01u1.jpg","link1253":"https://i.imgur.com/PxRFzM8.jpg","link1254":"https://i.imgur.com/Q3Hz25G.jpg","link1255":"https://i.imgur.com/Q3ctYOY.jpg","link1256":"https://i.imgur.com/Q59yc9n.jpg","link1257":"https://i.imgur.com/QAq0MY6.jpg","link1258":"https://i.imgur.com/QETkF9W.jpg","link1259":"https://i.imgur.com/QHmjqXT.jpg","link1260":"https://i.imgur.com/QHxQDXi.jpg","link1261":"https://i.imgur.com/QKL8uvr.jpg","link1262":"https://i.imgur.com/QOsX6DN.jpg","link1263":"https://i.imgur.com/QSJDBFw.jpg","link1264":"https://i.imgur.com/QSasXX1.jpg","link1265":"https://i.imgur.com/QiN91no.jpg","link1266":"https://i.imgur.com/Qih1oAq.jpg","link1267":"https://i.imgur.com/Qk8YBjD.jpg","link1268":"https://i.imgur.com/QptqwzK.jpg","link1269":"https://i.imgur.com/QuHnygX.jpg","link1270":"https://i.imgur.com/QuvsiGF.jpg","link1271":"https://i.imgur.com/QzPJmxO.jpg","link1272":"https://i.imgur.com/R1gfR0d.jpg","link1273":"https://i.imgur.com/R43t1Px.jpg","link1274":"https://i.imgur.com/R7OZyo4.jpg","link1275":"https://i.imgur.com/R8ibyUJ.jpg","link1276":"https://i.imgur.com/R8peKD5.jpg","link1277":"https://i.imgur.com/RAokkA3.jpg","link1278":"https://i.imgur.com/RBuIkdc.jpg","link1279":"https://i.imgur.com/RCutnCp.jpg","link1280":"https://i.imgur.com/RFPML5q.jpg","link1281":"https://i.imgur.com/RGJhE6g.jpg","link1282":"https://i.imgur.com/RIUcsDW.jpg","link1283":"https://i.imgur.com/RIbNJBz.jpg","link1284":"https://i.imgur.com/RJKZLbk.jpg","link1285":"https://i.imgur.com/RJcqwoo.jpg","link1286":"https://i.imgur.com/RKqJZVO.jpg","link1287":"https://i.imgur.com/RMTvAz1.jpg","link1288":"https://i.imgur.com/ROFRNK2.jpg","link1289":"https://i.imgur.com/RPWaI5n.jpg","link1290":"https://i.imgur.com/RV1u56K.jpg","link1291":"https://i.imgur.com/RXWDV86.jpg","link1292":"https://i.imgur.com/RYH1xZ2.jpg","link1293":"https://i.imgur.com/RfbcQSd.jpg","link1294":"https://i.imgur.com/RmUrFhS.jpg","link1295":"https://i.imgur.com/RmsGeAF.jpg","link1296":"https://i.imgur.com/Rn1csLM.jpg","link1297":"https://i.imgur.com/RnAJeGj.jpg","link1298":"https://i.imgur.com/RnPrLCA.jpg","link1299":"https://i.imgur.com/RocFqdr.jpg","link1300":"https://i.imgur.com/Rphf1ng.jpg","link1301":"https://i.imgur.com/Rr1v3V0.jpg","link1302":"https://i.imgur.com/RrA9JhG.jpg","link1303":"https://i.imgur.com/RtKHOHU.jpg","link1304":"https://i.imgur.com/Rwc5IZV.jpg","link1305":"https://i.imgur.com/S02qAcP.jpg","link1306":"https://i.imgur.com/S1i2X33.jpg","link1307":"https://i.imgur.com/S3Ahmk3.jpg","link1308":"https://i.imgur.com/S4gZ95x.jpg","link1309":"https://i.imgur.com/S5Ix0Cg.jpg","link1310":"https://i.imgur.com/S8TdUCf.jpg","link1311":"https://i.imgur.com/SRHYbXP.jpg","link1312":"https://i.imgur.com/SSfcwKI.jpg","link1313":"https://i.imgur.com/SVtG26u.jpg","link1314":"https://i.imgur.com/SVu37uv.jpg","link1315":"https://i.imgur.com/Sb3q6PI.jpg","link1316":"https://i.imgur.com/Sf9tYak.jpg","link1317":"https://i.imgur.com/SfDK4vK.jpg","link1318":"https://i.imgur.com/SkrGibo.jpg","link1319":"https://i.imgur.com/SlfqFSu.jpg","link1320":"https://i.imgur.com/SmIRN6z.jpg","link1321":"https://i.imgur.com/Sqbyx7o.jpg","link1322":"https://i.imgur.com/Ss1IR28.jpg","link1323":"https://i.imgur.com/SsHcrZU.jpg","link1324":"https://i.imgur.com/T0JMqh3.jpg","link1325":"https://i.imgur.com/T1GncdG.jpg","link1326":"https://i.imgur.com/T3VFLJZ.jpg","link1327":"https://i.imgur.com/T4KvrPC.jpg","link1328":"https://i.imgur.com/T5gB498.jpg","link1329":"https://i.imgur.com/T9UdiEmh.jpg","link1330":"https://i.imgur.com/TAYVo14.jpg","link1331":"https://i.imgur.com/TDX7CkT.jpg","link1332":"https://i.imgur.com/TDjGdtf.jpg","link1333":"https://i.imgur.com/TPI52GC.jpg","link1334":"https://i.imgur.com/TPumbio.jpg","link1335":"https://i.imgur.com/TRbkhEj.jpg","link1336":"https://i.imgur.com/Ta35zDw.jpg","link1337":"https://i.imgur.com/Ta4JzRc.jpg","link1338":"https://i.imgur.com/Tb1vWfg.jpg","link1339":"https://i.imgur.com/Tco6UCd.jpg","link1340":"https://i.imgur.com/TeCHFZs.jpg","link1341":"https://i.imgur.com/TeLp07n.jpg","link1342":"https://i.imgur.com/Tfnbtpw.jpg","link1343":"https://i.imgur.com/TfqINtk.jpg","link1344":"https://i.imgur.com/TgO4f5C.jpg","link1345":"https://i.imgur.com/TiLbSBe.jpg","link1346":"https://i.imgur.com/TjPGG8z.jpg","link1347":"https://i.imgur.com/TjdFkDp.jpg","link1348":"https://i.imgur.com/TkjgFKy.jpg","link1349":"https://i.imgur.com/TkwYPGz.jpg","link1350":"https://i.imgur.com/TvMRkRy.jpg","link1351":"https://i.imgur.com/U1HWCwX.jpg","link1352":"https://i.imgur.com/U2qS6m5.jpg","link1353":"https://i.imgur.com/U3H1PBp.jpg","link1354":"https://i.imgur.com/U6JH2vK.jpg","link1355":"https://i.imgur.com/UExmjIx.jpg","link1356":"https://i.imgur.com/UHRsmdc.jpg","link1357":"https://i.imgur.com/UJxd5sN.jpg","link1358":"https://i.imgur.com/UKF5mVi.jpg","link1359":"https://i.imgur.com/ULHa11f.jpg","link1360":"https://i.imgur.com/UNasH3O.jpg","link1361":"https://i.imgur.com/UWM0pN5.jpg","link1362":"https://i.imgur.com/UWbqE3Q.jpg","link1363":"https://i.imgur.com/Ubmh17c.jpg","link1364":"https://i.imgur.com/UcGGSUR.jpg","link1365":"https://i.imgur.com/UdrnZgd.jpg","link1366":"https://i.imgur.com/UnFW9V6.jpg","link1367":"https://i.imgur.com/UtpXYuV.jpg","link1368":"https://i.imgur.com/UtuEIOs.jpg","link1369":"https://i.imgur.com/UxMCUVU.jpg","link1370":"https://i.imgur.com/V0JiiOh.jpg","link1371":"https://i.imgur.com/VB3scKq.jpg","link1372":"https://i.imgur.com/VD2klgp.jpg","link1373":"https://i.imgur.com/VLjcTg2.jpg","link1374":"https://i.imgur.com/VNPOtkF.jpg","link1375":"https://i.imgur.com/Vd2Inlo.jpg","link1376":"https://i.imgur.com/VdmHhsI.jpg","link1377":"https://i.imgur.com/VdxVGoC.jpg","link1378":"https://i.imgur.com/VeriA7C.jpg","link1379":"https://i.imgur.com/Vgv59VM.jpg","link1380":"https://i.imgur.com/VjPK3iOh.jpg","link1381":"https://i.imgur.com/VlwloE4.jpg","link1382":"https://i.imgur.com/VpJkqDd.jpg","link1383":"https://i.imgur.com/VqbT71k.jpg","link1384":"https://i.imgur.com/VuS6Ut0.jpg","link1385":"https://i.imgur.com/VzgpDFK.jpg","link1386":"https://i.imgur.com/W2mvV8U.jpg","link1387":"https://i.imgur.com/W2upZ4c.jpg","link1388":"https://i.imgur.com/W35VrAe.jpg","link1389":"https://i.imgur.com/W523xAi.jpg","link1390":"https://i.imgur.com/WF6y9SI.jpg","link1391":"https://i.imgur.com/WNigsSy.jpg","link1392":"https://i.imgur.com/WQYrMYp.jpg","link1393":"https://i.imgur.com/WXARhH6.jpg","link1394":"https://i.imgur.com/WXOwh2J.jpg","link1395":"https://i.imgur.com/WZ84FVy.jpg","link1396":"https://i.imgur.com/WdaMFxC.jpg","link1397":"https://i.imgur.com/WikupzJ.jpg","link1398":"https://i.imgur.com/WjejQbA.jpg","link1399":"https://i.imgur.com/WnRnRed.jpg","link1400":"https://i.imgur.com/WpYVI7Q.jpg","link1401":"https://i.imgur.com/WuL8qpc.jpg","link1402":"https://i.imgur.com/X0aSctl.jpg","link1403":"https://i.imgur.com/X5vVQHI.jpg","link1404":"https://i.imgur.com/X7PxZCg.jpg","link1405":"https://i.imgur.com/X8ac8op.jpg","link1406":"https://i.imgur.com/XBcgdSS.jpg","link1407":"https://i.imgur.com/XBrjsAN.jpg","link1408":"https://i.imgur.com/XFqWGmw.jpg","link1409":"https://i.imgur.com/XNHoJPv.jpg","link1410":"https://i.imgur.com/XO0jyN4.jpg","link1411":"https://i.imgur.com/XRjKejo.jpg","link1412":"https://i.imgur.com/XU1Etjb.jpg","link1413":"https://i.imgur.com/XfXibGa.jpg","link1414":"https://i.imgur.com/XjlAtRF.jpg","link1415":"https://i.imgur.com/XjqIcEk.jpg","link1416":"https://i.imgur.com/XjuHLun.jpg","link1417":"https://i.imgur.com/XsKZ3ga.jpg","link1418":"https://i.imgur.com/Xw4tSP0.jpg","link1419":"https://i.imgur.com/Y08icOS.jpg","link1420":"https://i.imgur.com/Y4zqEDQ.jpg","link1421":"https://i.imgur.com/Y6Wi9eH.jpg","link1422":"https://i.imgur.com/Y844B8u.jpg","link1423":"https://i.imgur.com/YC4T5gd.jpg","link1424":"https://i.imgur.com/YCI4DKi.jpg","link1425":"https://i.imgur.com/YDrjYjM.jpg","link1426":"https://i.imgur.com/YGH9hpI.jpg","link1427":"https://i.imgur.com/YHvrdKh.jpg","link1428":"https://i.imgur.com/YJh5UP8.jpg","link1429":"https://i.imgur.com/YMbF3f8.jpg","link1430":"https://i.imgur.com/YPG6Qh3.jpg","link1431":"https://i.imgur.com/YPb1GYO.jpg","link1432":"https://i.imgur.com/YQP6hmd.jpg","link1433":"https://i.imgur.com/YRjbSxs.jpg","link1434":"https://i.imgur.com/YTwyiCb.jpg","link1435":"https://i.imgur.com/YaUvmNz.jpg","link1436":"https://i.imgur.com/Yd0TshB.jpg","link1437":"https://i.imgur.com/YfUKgna.jpg","link1438":"https://i.imgur.com/Yhj4znH.jpg","link1439":"https://i.imgur.com/Yj1tjXA.jpg","link1440":"https://i.imgur.com/YnBVh90.jpg","link1441":"https://i.imgur.com/Yoz6lCM.jpg","link1442":"https://i.imgur.com/Yqk9RFD.jpg","link1443":"https://i.imgur.com/Ysj2EHM.jpg","link1444":"https://i.imgur.com/Z4lThXB.jpg","link1445":"https://i.imgur.com/Z7rOUUU.jpg","link1446":"https://i.imgur.com/ZE9W7qT.jpg","link1447":"https://i.imgur.com/ZEBi7pb.jpg","link1448":"https://i.imgur.com/ZHOOREG.jpg","link1449":"https://i.imgur.com/ZHptuik.jpg","link1450":"https://i.imgur.com/ZJuofLM.jpg","link1451":"https://i.imgur.com/ZMJQP45.jpg","link1452":"https://i.imgur.com/ZORynEi.jpg","link1453":"https://i.imgur.com/ZT8Y3gs.jpg","link1454":"https://i.imgur.com/ZU8lp3A.jpg","link1455":"https://i.imgur.com/ZWHeOZA.jpg","link1456":"https://i.imgur.com/ZZ5Qi6Y.jpg","link1457":"https://i.imgur.com/ZaOyJx8.jpg","link1458":"https://i.imgur.com/ZbdgAdR.jpg","link1459":"https://i.imgur.com/ZdQxGbr.jpg","link1460":"https://i.imgur.com/ZfeeH9f.jpg","link1461":"https://i.imgur.com/ZlLTivS.jpg","link1462":"https://i.imgur.com/ZlysAqt.jpg","link1463":"https://i.imgur.com/ZmMzOSW.jpg","link1464":"https://i.imgur.com/ZnNB8Dy.jpg","link1465":"https://i.imgur.com/Zs7N2xE.jpg","link1466":"https://i.imgur.com/ZwoPDza.jpg","link1467":"https://i.imgur.com/Zxm1SLr.jpg","link1468":"https://i.imgur.com/Zybwffv.jpg","link1469":"https://i.imgur.com/a2eyX4A.jpg","link1470":"https://i.imgur.com/a2mZstY.jpg","link1471":"https://i.imgur.com/a5vFEdM.jpg","link1472":"https://i.imgur.com/a9WHcbz.jpg","link1473":"https://i.imgur.com/aBJvLCj.jpg","link1474":"https://i.imgur.com/aBuGJM0.jpg","link1475":"https://i.imgur.com/aF9vIj6.jpg","link1476":"https://i.imgur.com/aFeXFCU.jpg","link1477":"https://i.imgur.com/aHkPO6d.jpg","link1478":"https://i.imgur.com/aJGR0KU.jpg","link1479":"https://i.imgur.com/aJz7z4K.jpg","link1480":"https://i.imgur.com/aNshun4.jpg","link1481":"https://i.imgur.com/aQ6fAeb.jpg","link1482":"https://i.imgur.com/aQuI2JO.jpg","link1483":"https://i.imgur.com/aRe2hs1.jpg","link1484":"https://i.imgur.com/aUbuuqD.jpg","link1485":"https://i.imgur.com/aZAPIS7.jpg","link1486":"https://i.imgur.com/aZgwKva.jpg","link1487":"https://i.imgur.com/aaAcGbo.jpg","link1488":"https://i.imgur.com/aatNsxF.jpg","link1489":"https://i.imgur.com/adgrgdZ.jpg","link1490":"https://i.imgur.com/agbl7Ei.jpg","link1491":"https://i.imgur.com/agkQAg6.jpg","link1492":"https://i.imgur.com/asi7SNp.jpg","link1493":"https://i.imgur.com/atS9fIv.jpg","link1494":"https://i.imgur.com/auUUgjC.jpg","link1495":"https://i.imgur.com/b3PZJCS.jpg","link1496":"https://i.imgur.com/b3nidNy.jpg","link1497":"https://i.imgur.com/b5Ublr0.jpg","link1498":"https://i.imgur.com/b8JzTXT.jpg","link1499":"https://i.imgur.com/b9DozNH.jpg","link1500":"https://i.imgur.com/bBTcdQa.jpg","link1501":"https://i.imgur.com/bFNzU6H.jpg","link1502":"https://i.imgur.com/bHny6qq.jpg","link1503":"https://i.imgur.com/bLpq3dU.jpg","link1504":"https://i.imgur.com/bThCS90.jpg","link1505":"https://i.imgur.com/bTi9uJO.jpg","link1506":"https://i.imgur.com/bTjt6YA.jpg","link1507":"https://i.imgur.com/bUKydsf.jpg","link1508":"https://i.imgur.com/bUOBKgD.jpg","link1509":"https://i.imgur.com/bYZQAts.jpg","link1510":"https://i.imgur.com/bjv1TyU.jpg","link1511":"https://i.imgur.com/bnOHkNs.jpg","link1512":"https://i.imgur.com/bqXln50.jpg","link1513":"https://i.imgur.com/brigSit.jpg","link1514":"https://i.imgur.com/bsQuu35.jpg","link1515":"https://i.imgur.com/bw201se.jpg","link1516":"https://i.imgur.com/bz2DPde.jpg","link1517":"https://i.imgur.com/c4SsvL5.jpg","link1518":"https://i.imgur.com/c7aFTDG.jpg","link1519":"https://i.imgur.com/c8e1rYH.jpg","link1520":"https://i.imgur.com/cDUFc3a.jpg","link1521":"https://i.imgur.com/cDzRjiI.jpg","link1522":"https://i.imgur.com/cGWrG0p.jpg","link1523":"https://i.imgur.com/cIbqwb8.jpg","link1524":"https://i.imgur.com/cKfVN7i.jpg","link1525":"https://i.imgur.com/cLMFjpX.jpg","link1526":"https://i.imgur.com/cLkJYTm.jpg","link1527":"https://i.imgur.com/cMSdr5l.jpg","link1528":"https://i.imgur.com/cS6VPnU.jpg","link1529":"https://i.imgur.com/cUIG9bA.jpg","link1530":"https://i.imgur.com/cXDuM7B.jpg","link1531":"https://i.imgur.com/cZxE5LC.jpg","link1532":"https://i.imgur.com/ccdlyHs.jpg","link1533":"https://i.imgur.com/cdI2yH1.jpg","link1534":"https://i.imgur.com/cdN5Bag.jpg","link1535":"https://i.imgur.com/ceE51IY.jpg","link1536":"https://i.imgur.com/chAqMLs.jpg","link1537":"https://i.imgur.com/ck81PLJ.jpg","link1538":"https://i.imgur.com/cnk0BZu.jpg","link1539":"https://i.imgur.com/cve9cMa.jpg","link1540":"https://i.imgur.com/cwc4mPZ.jpg","link1541":"https://i.imgur.com/cxqvMiC.jpg","link1542":"https://i.imgur.com/cyYEXG2.jpg","link1543":"https://i.imgur.com/czAbRUe.jpg","link1544":"https://i.imgur.com/czdcrzl.jpg","link1545":"https://i.imgur.com/d0ggvzI.jpg","link1546":"https://i.imgur.com/d7il5wX.jpg","link1547":"https://i.imgur.com/d7pybSy.jpg","link1548":"https://i.imgur.com/d8EYwEt.jpg","link1549":"https://i.imgur.com/d8H9ZNl.jpg","link1550":"https://i.imgur.com/dBVFPs4.jpg","link1551":"https://i.imgur.com/dBsPJrP.jpg","link1552":"https://i.imgur.com/dGfzRMd.jpg","link1553":"https://i.imgur.com/dGmr4rw.jpg","link1554":"https://i.imgur.com/dJa6uLK.jpg","link1555":"https://i.imgur.com/dPt7hF6.jpg","link1556":"https://i.imgur.com/dQFByZ6.jpg","link1557":"https://i.imgur.com/dQyPLpo.jpg","link1558":"https://i.imgur.com/dT4z3px.jpg","link1559":"https://i.imgur.com/dV6UxSC.jpg","link1560":"https://i.imgur.com/dYZIj6F.jpg","link1561":"https://i.imgur.com/dYef2cT.jpg","link1562":"https://i.imgur.com/dZVYYZ6.jpg","link1563":"https://i.imgur.com/dZx528f.jpg","link1564":"https://i.imgur.com/dmXNjO8.jpg","link1565":"https://i.imgur.com/dn3ssog.jpg","link1566":"https://i.imgur.com/dvj0EIW.jpg","link1567":"https://i.imgur.com/dyd6z81.jpg","link1568":"https://i.imgur.com/dydu9bp.jpg","link1569":"https://i.imgur.com/e2mAG2N.jpg","link1570":"https://i.imgur.com/e3CDEkB.jpg","link1571":"https://i.imgur.com/e6cZwTm.jpg","link1572":"https://i.imgur.com/e7HMr8J.jpg","link1573":"https://i.imgur.com/e925IHt.jpg","link1574":"https://i.imgur.com/eAoYk26.jpg","link1575":"https://i.imgur.com/eEEGfnz.jpg","link1576":"https://i.imgur.com/eJyTlKS.jpg","link1577":"https://i.imgur.com/eLzhRqh.jpg","link1578":"https://i.imgur.com/eOCnxFB.jpg","link1579":"https://i.imgur.com/eQvGwyV.jpg","link1580":"https://i.imgur.com/eZgFm3d.jpg","link1581":"https://i.imgur.com/eep49c7.jpg","link1582":"https://i.imgur.com/epuCU6D.jpg","link1583":"https://i.imgur.com/eqXpQXg.jpg","link1584":"https://i.imgur.com/esqXquq.jpg","link1585":"https://i.imgur.com/etjuYfH.jpg","link1586":"https://i.imgur.com/evi59Hk.jpg","link1587":"https://i.imgur.com/exZPv6j.jpg","link1588":"https://i.imgur.com/fAkfFz9.jpg","link1589":"https://i.imgur.com/fCKsAR5.jpg","link1590":"https://i.imgur.com/fHDvmmp.jpg","link1591":"https://i.imgur.com/fHt55NB.jpg","link1592":"https://i.imgur.com/fKLe9Jd.jpg","link1593":"https://i.imgur.com/fLJZxkg.jpg","link1594":"https://i.imgur.com/fStuQ1P.jpg","link1595":"https://i.imgur.com/fX6uUyn.jpg","link1596":"https://i.imgur.com/fb34d3Y.jpg","link1597":"https://i.imgur.com/fdHLBHO.jpg","link1598":"https://i.imgur.com/flkLFOJ.jpg","link1599":"https://i.imgur.com/fr5vJVv.jpg","link1600":"https://i.imgur.com/frYWYM9.jpg","link1601":"https://i.imgur.com/fvoAasb.jpg","link1602":"https://i.imgur.com/fzVDA18.jpg","link1603":"https://i.imgur.com/g1n2ii0.jpg","link1604":"https://i.imgur.com/g2iiwAo.jpg","link1605":"https://i.imgur.com/g32KfOL.jpg","link1606":"https://i.imgur.com/g6bbi1W.jpg","link1607":"https://i.imgur.com/g9cWnBC.jpg","link1608":"https://i.imgur.com/gBTNJMx.jpg","link1609":"https://i.imgur.com/gEOJAVH.jpg","link1610":"https://i.imgur.com/gIDJ09G.jpg","link1611":"https://i.imgur.com/gRwIdc1.jpg","link1612":"https://i.imgur.com/gSIhxxx.jpg","link1613":"https://i.imgur.com/gUw42iV.jpg","link1614":"https://i.imgur.com/gVafVCK.jpg","link1615":"https://i.imgur.com/gVj1Uls.jpg","link1616":"https://i.imgur.com/gW5Yvt0.jpg","link1617":"https://i.imgur.com/gX4lydU.jpg","link1618":"https://i.imgur.com/gZE9SGZ.jpg","link1619":"https://i.imgur.com/ggQh5dp.jpg","link1620":"https://i.imgur.com/glnZijD.jpg","link1621":"https://i.imgur.com/gmDDmXT.jpg","link1622":"https://i.imgur.com/gmlGoBb.jpg","link1623":"https://i.imgur.com/gneQTsB.jpg","link1624":"https://i.imgur.com/gusdQwx.jpg","link1625":"https://i.imgur.com/gvwlyhp.jpg","link1626":"https://i.imgur.com/gxy01oC.jpg","link1627":"https://i.imgur.com/h3PC83M.jpg","link1628":"https://i.imgur.com/h5vnZ9g.jpg","link1629":"https://i.imgur.com/hAdY1za.jpg","link1630":"https://i.imgur.com/hKFc66x.jpg","link1631":"https://i.imgur.com/hRO6LI4.jpg","link1632":"https://i.imgur.com/hUlXhYv.jpg","link1633":"https://i.imgur.com/hV2ziky.jpg","link1634":"https://i.imgur.com/hbFmoHB.jpg","link1635":"https://i.imgur.com/hbJTKBP.jpg","link1636":"https://i.imgur.com/hexgJNZ.jpg","link1637":"https://i.imgur.com/hg8bUu9.jpg","link1638":"https://i.imgur.com/hgP2Ohb.jpg","link1639":"https://i.imgur.com/hhRda3b.jpg","link1640":"https://i.imgur.com/hhvz59L.jpg","link1641":"https://i.imgur.com/hj3eCUy.jpg","link1642":"https://i.imgur.com/hkIfV73.jpg","link1643":"https://i.imgur.com/hnE45Ri.jpg","link1644":"https://i.imgur.com/hqHoPBr.jpg","link1645":"https://i.imgur.com/hzhxcJR.jpg","link1646":"https://i.imgur.com/i23Xn5W.jpg","link1647":"https://i.imgur.com/i6LjlDk.jpg","link1648":"https://i.imgur.com/iF2FqkU.jpg","link1649":"https://i.imgur.com/iF9FP7n.jpg","link1650":"https://i.imgur.com/iObHRt9.jpg","link1651":"https://i.imgur.com/iTlVls0.jpg","link1652":"https://i.imgur.com/icXHPkH.jpg","link1653":"https://i.imgur.com/igYKugO.jpg","link1654":"https://i.imgur.com/inP6kjB.jpg","link1655":"https://i.imgur.com/ip6CsVm.jpg","link1656":"https://i.imgur.com/iqHOOCh.jpg","link1657":"https://i.imgur.com/irymXXs.jpg","link1658":"https://i.imgur.com/iv2kAro.jpg","link1659":"https://i.imgur.com/iwthdLu.jpg","link1660":"https://i.imgur.com/j1IO6Ec.jpg","link1661":"https://i.imgur.com/j3sTp8l.jpg","link1662":"https://i.imgur.com/j657AEH.jpg","link1663":"https://i.imgur.com/j9dkakc.jpg","link1664":"https://i.imgur.com/jEgDdfg.jpg","link1665":"https://i.imgur.com/jFNebPG.jpg","link1666":"https://i.imgur.com/jH1mARg.jpg","link1667":"https://i.imgur.com/jHo3eGA.jpg","link1668":"https://i.imgur.com/jNLgjNk.jpg","link1669":"https://i.imgur.com/jRdEelG.jpg","link1670":"https://i.imgur.com/jXnSpWp.jpg","link1671":"https://i.imgur.com/jbb9Dbc.jpg","link1672":"https://i.imgur.com/jfnriUT.jpg","link1673":"https://i.imgur.com/jj6WMEo.jpg","link1674":"https://i.imgur.com/jlLQAIV.jpg","link1675":"https://i.imgur.com/juwCJW6.jpg","link1676":"https://i.imgur.com/jvktrg6.jpg","link1677":"https://i.imgur.com/jyhwXsD.jpg","link1678":"https://i.imgur.com/k2Jg3YV.jpg","link1679":"https://i.imgur.com/k2ckgbU.jpg","link1680":"https://i.imgur.com/k69X83h.jpg","link1681":"https://i.imgur.com/k9ozzLR.jpg","link1682":"https://i.imgur.com/kIXiPmp.jpg","link1683":"https://i.imgur.com/kLzSvFP.jpg","link1684":"https://i.imgur.com/kMTlLxS.jpg","link1685":"https://i.imgur.com/kNblCOZ.jpg","link1686":"https://i.imgur.com/kPPicM6.jpg","link1687":"https://i.imgur.com/kRXS3iP.jpg","link1688":"https://i.imgur.com/kYZRXHn.jpg","link1689":"https://i.imgur.com/kZUoUvk.jpg","link1690":"https://i.imgur.com/khFuqf9.jpg","link1691":"https://i.imgur.com/khLLvrF.jpg","link1692":"https://i.imgur.com/khTt6Kw.jpg","link1693":"https://i.imgur.com/kldzud9.jpg","link1694":"https://i.imgur.com/klvLz1m.jpg","link1695":"https://i.imgur.com/km2iQi7.jpg","link1696":"https://i.imgur.com/kqtHPEs.jpg","link1697":"https://i.imgur.com/kuNu6Z0.jpg","link1698":"https://i.imgur.com/kujhFEs.jpg","link1699":"https://i.imgur.com/kw4n2ig.jpg","link1700":"https://i.imgur.com/kx6eHMi.jpg","link1701":"https://i.imgur.com/kzJT93i.jpg","link1702":"https://i.imgur.com/l1avowQ.jpg","link1703":"https://i.imgur.com/l26LNqS.jpg","link1704":"https://i.imgur.com/l2iO72G.jpg","link1705":"https://i.imgur.com/l5WKqDu.jpg","link1706":"https://i.imgur.com/l7Lps3o.jpg","link1707":"https://i.imgur.com/lA0ZBLk.jpg","link1708":"https://i.imgur.com/lAUxu09.jpg","link1709":"https://i.imgur.com/lBfBdQd.jpg","link1710":"https://i.imgur.com/lG16xVE.jpg","link1711":"https://i.imgur.com/lGRdbF5.jpg","link1712":"https://i.imgur.com/lIqxfL8.jpg","link1713":"https://i.imgur.com/lLkLCXa.jpg","link1714":"https://i.imgur.com/lNGN4KA.jpg","link1715":"https://i.imgur.com/lQBnngG.jpg","link1716":"https://i.imgur.com/lSrJZUQ.jpg","link1717":"https://i.imgur.com/lUKjyEO.jpg","link1718":"https://i.imgur.com/lUy52wQ.jpg","link1719":"https://i.imgur.com/lVjja8Y.jpg","link1720":"https://i.imgur.com/lWLM8n5.jpg","link1721":"https://i.imgur.com/lWkPLXX.jpg","link1722":"https://i.imgur.com/lXQTDkY.jpg","link1723":"https://i.imgur.com/lZivT0V.jpg","link1724":"https://i.imgur.com/lcQVEkl.jpg","link1725":"https://i.imgur.com/lckhW0t.jpg","link1726":"https://i.imgur.com/ldzbAn9.jpg","link1727":"https://i.imgur.com/lfEOE9I.jpg","link1728":"https://i.imgur.com/ll5L9FM.jpg","link1729":"https://i.imgur.com/lmCiVka.jpg","link1730":"https://i.imgur.com/lpVxIHJ.jpg","link1731":"https://i.imgur.com/lpkMrDt.jpg","link1732":"https://i.imgur.com/lrkdjpW.jpg","link1733":"https://i.imgur.com/lrnlS0w.jpg","link1734":"https://i.imgur.com/ltKTi5y.jpg","link1735":"https://i.imgur.com/lvJyI5R.jpg","link1736":"https://i.imgur.com/m4T0ne7.jpg","link1737":"https://i.imgur.com/m91uXl5.jpg","link1738":"https://i.imgur.com/mAPuaO1.jpg","link1739":"https://i.imgur.com/mAdtUQ0.jpg","link1740":"https://i.imgur.com/mI6jdxV.jpg","link1741":"https://i.imgur.com/mIHgYFh.jpg","link1742":"https://i.imgur.com/mK8vzmZ.jpg","link1743":"https://i.imgur.com/mMV7xqw.jpg","link1744":"https://i.imgur.com/mVF2lUh.jpg","link1745":"https://i.imgur.com/mX0LbXG.jpg","link1746":"https://i.imgur.com/mcGoYAr.jpg","link1747":"https://i.imgur.com/mco3xjK.jpg","link1748":"https://i.imgur.com/mgspf1j.jpg","link1749":"https://i.imgur.com/mlTr1ko.jpg","link1750":"https://i.imgur.com/mpdBal3.jpg","link1751":"https://i.imgur.com/muOvg1V.jpg","link1752":"https://i.imgur.com/mxv6Lbp.jpg","link1753":"https://i.imgur.com/n1ZHiV8.jpg","link1754":"https://i.imgur.com/n2u2P7E.jpg","link1755":"https://i.imgur.com/n6WosSf.jpg","link1756":"https://i.imgur.com/nDHyIa6.jpg","link1757":"https://i.imgur.com/nFU1Drt.jpg","link1758":"https://i.imgur.com/nHu7zqH.jpg","link1759":"https://i.imgur.com/nHwGVct.jpg","link1760":"https://i.imgur.com/nILM3po.jpg","link1761":"https://i.imgur.com/nMYRb92.jpg","link1762":"https://i.imgur.com/nNLHCXA.jpg","link1763":"https://i.imgur.com/nO9BcpH.jpg","link1764":"https://i.imgur.com/nRa87pX.jpg","link1765":"https://i.imgur.com/nYWLXh2.jpg","link1766":"https://i.imgur.com/nZN0oKx.jpg","link1767":"https://i.imgur.com/nZqLFN9.jpg","link1768":"https://i.imgur.com/nddz0RB.jpg","link1769":"https://i.imgur.com/neVRCM5.jpg","link1770":"https://i.imgur.com/nf1DIIe.jpg","link1771":"https://i.imgur.com/nkIAcXR.jpg","link1772":"https://i.imgur.com/nnMaEYD.jpg","link1773":"https://i.imgur.com/nrs2f05.jpg","link1774":"https://i.imgur.com/nvmmOG9.jpg","link1775":"https://i.imgur.com/o0vXz3e.jpg","link1776":"https://i.imgur.com/o2tsMO2.jpg","link1777":"https://i.imgur.com/o3kgJTF.jpg","link1778":"https://i.imgur.com/o4d69S0.jpg","link1779":"https://i.imgur.com/o5b9APu.jpg","link1780":"https://i.imgur.com/o6E0n1y.jpg","link1781":"https://i.imgur.com/o9v9RcV.jpg","link1782":"https://i.imgur.com/oE3sUxD.jpg","link1783":"https://i.imgur.com/oHQbx6Y.jpg","link1784":"https://i.imgur.com/oIJbQQX.jpg","link1785":"https://i.imgur.com/oIQ94L4.jpg","link1786":"https://i.imgur.com/oIgjhLa.jpg","link1787":"https://i.imgur.com/oKm0128.jpg","link1788":"https://i.imgur.com/oLb14If.jpg","link1789":"https://i.imgur.com/oQJV58D.jpg","link1790":"https://i.imgur.com/oaYmf7Z.jpg","link1791":"https://i.imgur.com/oaym8pw.jpg","link1792":"https://i.imgur.com/obGhtzS.jpg","link1793":"https://i.imgur.com/obQ7WbH.jpg","link1794":"https://i.imgur.com/og8D9SC.jpg","link1795":"https://i.imgur.com/oiLM0gn.jpg","link1796":"https://i.imgur.com/ojj0kZu.jpg","link1797":"https://i.imgur.com/oo4Ilrg.jpg","link1798":"https://i.imgur.com/oqyQSiC.jpg","link1799":"https://i.imgur.com/ovwi8iV.jpg","link1800":"https://i.imgur.com/p2PFb3n.jpg","link1801":"https://i.imgur.com/p2nyG9R.jpg","link1802":"https://i.imgur.com/p4LnS8T.jpg","link1803":"https://i.imgur.com/p6aW1as.jpg","link1804":"https://i.imgur.com/pA1X8P3.jpg","link1805":"https://i.imgur.com/pBxjirc.jpg","link1806":"https://i.imgur.com/pGxbCj5.jpg","link1807":"https://i.imgur.com/pH3sWlT.jpg","link1808":"https://i.imgur.com/pTDIugf.jpg","link1809":"https://i.imgur.com/pWysWiL.jpg","link1810":"https://i.imgur.com/pY8CY0Y.jpg","link1811":"https://i.imgur.com/pY9kmom.jpg","link1812":"https://i.imgur.com/pZabQCJ.jpg","link1813":"https://i.imgur.com/pZiGAIn.jpg","link1814":"https://i.imgur.com/paQ83pY.jpg","link1815":"https://i.imgur.com/pb3I0Mt.jpg","link1816":"https://i.imgur.com/pb47gTW.jpg","link1817":"https://i.imgur.com/pgizfla.jpg","link1818":"https://i.imgur.com/pjdOUsr.jpg","link1819":"https://i.imgur.com/plIJW2b.jpg","link1820":"https://i.imgur.com/ppKxZrE.jpg","link1821":"https://i.imgur.com/pvM2jWo.jpg","link1822":"https://i.imgur.com/pwDKzM8.jpg","link1823":"https://i.imgur.com/pwdsaj6.jpg","link1824":"https://i.imgur.com/pyjcZ4l.jpg","link1825":"https://i.imgur.com/q6I8z4J.jpg","link1826":"https://i.imgur.com/qB7zZ51.jpg","link1827":"https://i.imgur.com/qDURjAu.jpg","link1828":"https://i.imgur.com/qFL2LpK.jpg","link1829":"https://i.imgur.com/qFLOpQO.jpg","link1830":"https://i.imgur.com/qFXZWLp.jpg","link1831":"https://i.imgur.com/qHEkKRl.jpg","link1832":"https://i.imgur.com/qLukTnV.jpg","link1833":"https://i.imgur.com/qPeaBC8.jpg","link1834":"https://i.imgur.com/qQ27K2d.jpg","link1835":"https://i.imgur.com/qUH7pAb.jpg","link1836":"https://i.imgur.com/qV2noor.jpg","link1837":"https://i.imgur.com/qViZB8E.jpg","link1838":"https://i.imgur.com/qXyFI0y.jpg","link1839":"https://i.imgur.com/qejkiLP.jpg","link1840":"https://i.imgur.com/qiVDFrM.jpg","link1841":"https://i.imgur.com/qkaKKEo.jpg","link1842":"https://i.imgur.com/qoMsNM4.jpg","link1843":"https://i.imgur.com/qqc8mjJ.jpg","link1844":"https://i.imgur.com/qrBOYWK.jpg","link1845":"https://i.imgur.com/quA5IuS.jpg","link1846":"https://i.imgur.com/qx5RQ33.jpg","link1847":"https://i.imgur.com/r01iOZI.jpg","link1848":"https://i.imgur.com/r0nRfWF.jpg","link1849":"https://i.imgur.com/r3o3NBg.jpg","link1850":"https://i.imgur.com/r6LNV66.jpg","link1851":"https://i.imgur.com/r6TfSan.jpg","link1852":"https://i.imgur.com/r7YnhlR.jpg","link1853":"https://i.imgur.com/rSIwxuq.jpg","link1854":"https://i.imgur.com/rSKY9kZ.jpg","link1855":"https://i.imgur.com/rSk7xQQ.jpg","link1856":"https://i.imgur.com/raIk38u.jpg","link1857":"https://i.imgur.com/rewyanJ.jpg","link1858":"https://i.imgur.com/rhvwsYV.jpg","link1859":"https://i.imgur.com/riqV1T6.jpg","link1860":"https://i.imgur.com/rpK8Mvi.jpg","link1861":"https://i.imgur.com/rs1g30w.jpg","link1862":"https://i.imgur.com/rv3IZiN.jpg","link1863":"https://i.imgur.com/s04tIvD.jpg","link1864":"https://i.imgur.com/s3CG7Ul.jpg","link1865":"https://i.imgur.com/s3aOAzG.jpg","link1866":"https://i.imgur.com/s4GFaC3.jpg","link1867":"https://i.imgur.com/s5SydUV.jpg","link1868":"https://i.imgur.com/s6ckZbA.jpg","link1869":"https://i.imgur.com/s7qABmT.jpg","link1870":"https://i.imgur.com/s9zNbgo.jpg","link1871":"https://i.imgur.com/sDD3T5d.jpg","link1872":"https://i.imgur.com/sDSmMEe.jpg","link1873":"https://i.imgur.com/sKcaRea.jpg","link1874":"https://i.imgur.com/sZvwDgI.jpg","link1875":"https://i.imgur.com/scAlOc7.jpg","link1876":"https://i.imgur.com/scKDmPk.jpg","link1877":"https://i.imgur.com/snMazc9.jpg","link1878":"https://i.imgur.com/sno2g4o.jpg","link1879":"https://i.imgur.com/so0Hxwd.jpg","link1880":"https://i.imgur.com/stYemnb.jpg","link1881":"https://i.imgur.com/swE6XJy.jpg","link1882":"https://i.imgur.com/sywF4wY.jpg","link1883":"https://i.imgur.com/t6I9HyQ.jpg","link1884":"https://i.imgur.com/t8afjpj.jpg","link1885":"https://i.imgur.com/tABp0ic.jpg","link1886":"https://i.imgur.com/tBV8bFt.jpg","link1887":"https://i.imgur.com/tBvmbEF.jpg","link1888":"https://i.imgur.com/tBwIwfA.jpg","link1889":"https://i.imgur.com/tFyv55D.jpg","link1890":"https://i.imgur.com/tHCJs05.jpg","link1891":"https://i.imgur.com/tJjwNWl.jpg","link1892":"https://i.imgur.com/tJzcyNf.jpg","link1893":"https://i.imgur.com/tLImiBI.jpg","link1894":"https://i.imgur.com/tNoR58t.jpg","link1895":"https://i.imgur.com/tRJ2nuu.jpg","link1896":"https://i.imgur.com/tSjQqxb.jpg","link1897":"https://i.imgur.com/tWEGmSn.jpg","link1898":"https://i.imgur.com/tZlsUAC.jpg","link1899":"https://i.imgur.com/tbWF20j.jpg","link1900":"https://i.imgur.com/tbav3A7.jpg","link1901":"https://i.imgur.com/tf2tWBQ.jpg","link1902":"https://i.imgur.com/tj1oY5f.jpg","link1903":"https://i.imgur.com/tpxj5iv.jpg","link1904":"https://i.imgur.com/trINZcd.jpg","link1905":"https://i.imgur.com/trcUbBc.jpg","link1906":"https://i.imgur.com/tsnQgyT.jpg","link1907":"https://i.imgur.com/tvSRA9a.jpg","link1908":"https://i.imgur.com/tvpr67S.jpg","link1909":"https://i.imgur.com/txtfL1b.jpg","link1910":"https://i.imgur.com/tzamwaj.jpg","link1911":"https://i.imgur.com/u3W4eZ7.jpg","link1912":"https://i.imgur.com/u3zpetF.jpg","link1913":"https://i.imgur.com/u9bUuCr.jpg","link1914":"https://i.imgur.com/uB3QlfY.jpg","link1915":"https://i.imgur.com/uGIG45t.jpg","link1916":"https://i.imgur.com/uGRJ6KK.jpg","link1917":"https://i.imgur.com/uNbE03s.jpg","link1918":"https://i.imgur.com/uROq22c.jpg","link1919":"https://i.imgur.com/uRjeVBg.jpg","link1920":"https://i.imgur.com/uSA8qoe.jpg","link1921":"https://i.imgur.com/uSQ9ydR.jpg","link1922":"https://i.imgur.com/uSiogSi.jpg","link1923":"https://i.imgur.com/uXDE1XC.jpg","link1924":"https://i.imgur.com/uXz3Ihz.jpg","link1925":"https://i.imgur.com/umLj2Og.jpg","link1926":"https://i.imgur.com/unATJJW.jpg","link1927":"https://i.imgur.com/urBzLSN.jpg","link1928":"https://i.imgur.com/urW1OVa.jpg","link1929":"https://i.imgur.com/uuYBxQG.jpg","link1930":"https://i.imgur.com/v04AIZu.jpg","link1931":"https://i.imgur.com/v3aYAsG.jpg","link1932":"https://i.imgur.com/v4kC4n5.jpg","link1933":"https://i.imgur.com/v4oBWc7.jpg","link1934":"https://i.imgur.com/v5ETK7v.jpg","link1935":"https://i.imgur.com/v6jPevH.jpg","link1936":"https://i.imgur.com/vB7gDXW.jpg","link1937":"https://i.imgur.com/vD7XI8Q.jpg","link1938":"https://i.imgur.com/vEmwiiF.jpg","link1939":"https://i.imgur.com/vGHLpLN.jpg","link1940":"https://i.imgur.com/vJKzmCt.jpg","link1941":"https://i.imgur.com/vK4ZdIm.jpg","link1942":"https://i.imgur.com/vLipcJu.jpg","link1943":"https://i.imgur.com/vNWcTVr.jpg","link1944":"https://i.imgur.com/vRRCYTF.jpg","link1945":"https://i.imgur.com/vSk99yR.jpg","link1946":"https://i.imgur.com/vcpEYrp.jpg","link1947":"https://i.imgur.com/vk6NA5V.jpg","link1948":"https://i.imgur.com/vqURg5A.jpg","link1949":"https://i.imgur.com/vuw2Wq2.jpg","link1950":"https://i.imgur.com/vzffgoY.jpg","link1951":"https://i.imgur.com/w0VSkq2.jpg","link1952":"https://i.imgur.com/w4wWZtR.jpg","link1953":"https://i.imgur.com/w8EaWRI.jpg","link1954":"https://i.imgur.com/w95cyGU.jpg","link1955":"https://i.imgur.com/w97T6re.jpg","link1956":"https://i.imgur.com/wFrCVya.jpg","link1957":"https://i.imgur.com/wOYbF4G.jpg","link1958":"https://i.imgur.com/wV8elMT.jpg","link1959":"https://i.imgur.com/wY1mKsBh.jpg","link1960":"https://i.imgur.com/wYYBcTf.jpg","link1961":"https://i.imgur.com/wZGpYEj.jpg","link1962":"https://i.imgur.com/wZru1Eq.jpg","link1963":"https://i.imgur.com/wdQ3mp4.jpg","link1964":"https://i.imgur.com/wenkCda.jpg","link1965":"https://i.imgur.com/wg6MN4P.jpg","link1966":"https://i.imgur.com/wiwAdwO.jpg","link1967":"https://i.imgur.com/wqLDKcI.jpg","link1968":"https://i.imgur.com/wrMfqXa.jpg","link1969":"https://i.imgur.com/ws2Zxe2.jpg","link1970":"https://i.imgur.com/wtMFDzu.jpg","link1971":"https://i.imgur.com/wwV8scu.jpg","link1972":"https://i.imgur.com/wygm4Ik.jpg","link1973":"https://i.imgur.com/x1q6AFv.jpg","link1974":"https://i.imgur.com/x81OjRK.jpg","link1975":"https://i.imgur.com/xHqrNOs.jpg","link1976":"https://i.imgur.com/xJ7gbxQ.jpg","link1977":"https://i.imgur.com/xKzk2Es.jpg","link1978":"https://i.imgur.com/xOEqdzB.jpg","link1979":"https://i.imgur.com/xQDH9hR.jpg","link1980":"https://i.imgur.com/xTmOiOY.jpg","link1981":"https://i.imgur.com/xVxB0Kh.jpg","link1982":"https://i.imgur.com/xcuDpXN.jpg","link1983":"https://i.imgur.com/xdxlR6n.jpg","link1984":"https://i.imgur.com/xhd9Cf9.jpg","link1985":"https://i.imgur.com/xjtJvLV.jpg","link1986":"https://i.imgur.com/xm1wUqH.jpg","link1987":"https://i.imgur.com/xvStRue.jpg","link1988":"https://i.imgur.com/y0b4Ci2.jpg","link1989":"https://i.imgur.com/y5L7mnc.jpg","link1990":"https://i.imgur.com/y8KbZ0rh.jpg","link1991":"https://i.imgur.com/yKzJhXX.jpg","link1992":"https://i.imgur.com/yNKmHFU.jpg","link1993":"https://i.imgur.com/yPTDfXu.jpg","link1994":"https://i.imgur.com/ySC1y2f.jpg","link1995":"https://i.imgur.com/yTD7Z0T.jpg","link1996":"https://i.imgur.com/yUQwEL3.jpg","link1997":"https://i.imgur.com/yWOjySQ.jpg","link1998":"https://i.imgur.com/yZKhxq6.jpg","link1999":"https://i.imgur.com/yZwi9af.jpg","link2000":"https://i.imgur.com/ycX5IXN.jpg","link2001":"https://i.imgur.com/ydGJnsI.jpg","link2002":"https://i.imgur.com/yeAXKty.jpg","link2003":"https://i.imgur.com/yl92h6I.jpg","link2004":"https://i.imgur.com/yllRbQA.jpg","link2005":"https://i.imgur.com/yls41d5.jpg","link2006":"https://i.imgur.com/yoFzQQN.jpg","link2007":"https://i.imgur.com/yoxkaLP.jpg","link2008":"https://i.imgur.com/ysGC0EI.jpg","link2009":"https://i.imgur.com/ytS7zmO.jpg","link2010":"https://i.imgur.com/yvUmpqj.jpg","link2011":"https://i.imgur.com/yvXKCr2.jpg","link2012":"https://i.imgur.com/yxD6rVC.jpg","link2013":"https://i.imgur.com/z4EQ63u.jpg","link2014":"https://i.imgur.com/z4PSiIH.jpg","link2015":"https://i.imgur.com/z95eJoj.jpg","link2016":"https://i.imgur.com/zH2EFgq.jpg","link2017":"https://i.imgur.com/zI4kr8U.jpg","link2018":"https://i.imgur.com/zMYJNkS.jpg","link2019":"https://i.imgur.com/zTcnTVk.jpg","link2020":"https://i.imgur.com/zV1fApN.jpg","link2021":"https://i.imgur.com/zWQhEfu.jpg","link2022":"https://i.imgur.com/zXPGh9v.jpg","link2023":"https://i.imgur.com/zYpzITQ.jpg","link2024":"https://i.imgur.com/zbTLKY2.jpg","link2025":"https://i.imgur.com/zcVbnUk.jpg","link2026":"https://i.imgur.com/zfvo7E1.jpg","link2027":"https://i.imgur.com/zhMdvd0.jpg","link2028":"https://i.imgur.com/zm33tyR.jpg","link2029":"https://i.imgur.com/zmB3wHF.jpg","link2030":"https://i.imgur.com/zpocy6D.jpg","link2031":"https://i.imgur.com/zqDpjzw.jpg","link2032":"https://i.imgur.com/zt0fdS7.jpg","link2033":"https://i.imgur.com/zuSzJ0r.jpg","link2034":"https://i.imgur.com/zvcAUbK.jpg","link2035":"https://i.imgur.com/zx8K8Ye.jpg","link2036":"https://i.imgur.com/zyfy3kv.jpg","link2037":"https://i.imgur.com/zzYc7Eg.jpg","link2038":"https://i.kym-cdn.com/photos/images/original/000/957/922/1c1.jpg","link2039":"https://i.kym-cdn.com/photos/images/original/001/439/209/3f7.jpg","link2040":"https://i.pximg.net/img-master/img/2018/12/28/00/00/03/72336161_p0_master1200.jpg","link2041":"https://i.redd.it/002kxqezr9f11.jpg","link2042":"https://i.redd.it/00pj2f78yxi31.jpg","link2043":"https://i.redd.it/00twk64wxwd11.jpg","link2044":"https://i.redd.it/01575x2nxaq21.jpg","link2045":"https://i.redd.it/01p0tu2ocy631.jpg","link2046":"https://i.redd.it/01syqmaf0jf01.jpg","link2047":"https://i.redd.it/02myo1bos5331.jpg","link2048":"https://i.redd.it/02zz5tvjf2921.jpg","link2049":"https://i.redd.it/03av1ktinp141.jpg","link2050":"https://i.redd.it/03dsvaluke241.jpg","link2051":"https://i.redd.it/0416ee4shaf11.jpg","link2052":"https://i.redd.it/0482wkwg5l531.jpg","link2053":"https://i.redd.it/04bjmu8y9yh21.jpg","link2054":"https://i.redd.it/04btd2wbvfx21.jpg","link2055":"https://i.redd.it/04rhljq40q531.jpg","link2056":"https://i.redd.it/052z45y8y9l31.jpg","link2057":"https://i.redd.it/05svybhqews21.jpg","link2058":"https://i.redd.it/06to7y677w931.jpg","link2059":"https://i.redd.it/06vd1wzquky31.jpg","link2060":"https://i.redd.it/078es4plzne21.jpg","link2061":"https://i.redd.it/07hbsz3a7xo31.jpg","link2062":"https://i.redd.it/07tslhq8fcj31.jpg","link2063":"https://i.redd.it/08h5r7zkmgj31.jpg","link2064":"https://i.redd.it/094wlas10l631.jpg","link2065":"https://i.redd.it/096cdkak9gh21.jpg","link2066":"https://i.redd.it/09qft9c3gtb21.jpg","link2067":"https://i.redd.it/09su52xu4p031.jpg","link2068":"https://i.redd.it/09x1lsw0prk31.jpg","link2069":"https://i.redd.it/0bfocjvir1d21.jpg","link2070":"https://i.redd.it/0bxmt6o4zmq21.jpg","link2071":"https://i.redd.it/0dbfwf0lqtq21.jpg","link2072":"https://i.redd.it/0e33o8l1fre21.jpg","link2073":"https://i.redd.it/0f7l8mmocot21.jpg","link2074":"https://i.redd.it/0gqhb0q1vhw31.jpg","link2075":"https://i.redd.it/0gqxj0v9lhw31.jpg","link2076":"https://i.redd.it/0gssksto83931.jpg","link2077":"https://i.redd.it/0jfaueue6s841.jpg","link2078":"https://i.redd.it/0jhq4g1jhvd31.jpg","link2079":"https://i.redd.it/0jsw5xe4jgb21.jpg","link2080":"https://i.redd.it/0knuurhb6x721.jpg","link2081":"https://i.redd.it/0kv370xhe1t21.jpg","link2082":"https://i.redd.it/0kyku1tkfgs21.jpg","link2083":"https://i.redd.it/0lfozvejgeb21.jpg","link2084":"https://i.redd.it/0lz3zos0f2541.jpg","link2085":"https://i.redd.it/0m063kt61wp31.jpg","link2086":"https://i.redd.it/0m2e5pfnw4l21.jpg","link2087":"https://i.redd.it/0ndwzp03kn841.jpg","link2088":"https://i.redd.it/0ne0ag8h7p141.jpg","link2089":"https://i.redd.it/0o01cc06tke11.jpg","link2090":"https://i.redd.it/0owb62hqi7831.jpg","link2091":"https://i.redd.it/0pb5v6dtv3o21.jpg","link2092":"https://i.redd.it/0pj8rbilwwe31.jpg","link2093":"https://i.redd.it/0ppdmdxggz741.jpg","link2094":"https://i.redd.it/0pvnyea762b31.jpg","link2095":"https://i.redd.it/0qz4skg0iip21.jpg","link2096":"https://i.redd.it/0r9j2moh92341.jpg","link2097":"https://i.redd.it/0ra9qb5klu031.jpg","link2098":"https://i.redd.it/0ri8iraijod21.jpg","link2099":"https://i.redd.it/0rqe8ht0m0021.jpg","link2100":"https://i.redd.it/0s58rioroad21.jpg","link2101":"https://i.redd.it/0ta36rltb4s31.jpg","link2102":"https://i.redd.it/0tjkl6v536921.jpg","link2103":"https://i.redd.it/0umn551bxb721.jpg","link2104":"https://i.redd.it/0wfccdki9hm31.jpg","link2105":"https://i.redd.it/0wxdpjfui7j31.jpg","link2106":"https://i.redd.it/0xhl1ujxza531.jpg","link2107":"https://i.redd.it/0yh7swbofl831.jpg","link2108":"https://i.redd.it/0yxfywa3pho11.jpg","link2109":"https://i.redd.it/0zr76d6l6b541.jpg","link2110":"https://i.redd.it/0zuxeuucd9t21.jpg","link2111":"https://i.redd.it/10j80v2cnbm21.jpg","link2112":"https://i.redd.it/1103rnlxvoq21.jpg","link2113":"https://i.redd.it/119nz3ohk2g21.jpg","link2114":"https://i.redd.it/11pf272za9y21.jpg","link2115":"https://i.redd.it/11r52vtvs4n21.jpg","link2116":"https://i.redd.it/11tejqdl2s331.jpg","link2117":"https://i.redd.it/12cjuggerfk31.jpg","link2118":"https://i.redd.it/12u0k9krwtw21.jpg","link2119":"https://i.redd.it/142tx1v68wi31.jpg","link2120":"https://i.redd.it/14xkw1n26j221.jpg","link2121":"https://i.redd.it/1517g935zju31.jpg","link2122":"https://i.redd.it/155emz11lq721.jpg","link2123":"https://i.redd.it/1649whrnn5c11.jpg","link2124":"https://i.redd.it/166x5dyo3i321.jpg","link2125":"https://i.redd.it/16fkyrkojt441.jpg","link2126":"https://i.redd.it/16ubr36u0q641.jpg","link2127":"https://i.redd.it/1783ojy88q031.jpg","link2128":"https://i.redd.it/178wt4jc4sd11.jpg","link2129":"https://i.redd.it/18hil7py1t041.jpg","link2130":"https://i.redd.it/18ltb6yvsip31.jpg","link2131":"https://i.redd.it/18pt1ggrhxv21.jpg","link2132":"https://i.redd.it/1a4umddabu041.jpg","link2133":"https://i.redd.it/1a9r7hyqxvi31.jpg","link2134":"https://i.redd.it/1ahfy339kq541.jpg","link2135":"https://i.redd.it/1axax5qpylr31.jpg","link2136":"https://i.redd.it/1azqwbmgp2u21.jpg","link2137":"https://i.redd.it/1b90lr97v3641.jpg","link2138":"https://i.redd.it/1btxs3rao7n11.jpg","link2139":"https://i.redd.it/1bzd5j07lhw21.jpg","link2140":"https://i.redd.it/1ca7n7njf5o31.jpg","link2141":"https://i.redd.it/1cj06u0qdbs31.jpg","link2142":"https://i.redd.it/1cjmaj5ft9b21.jpg","link2143":"https://i.redd.it/1cu7w45yk8841.jpg","link2144":"https://i.redd.it/1en6o5cx3dl31.jpg","link2145":"https://i.redd.it/1f311bjfn4431.jpg","link2146":"https://i.redd.it/1fyizu4tj4431.jpg","link2147":"https://i.redd.it/1gwppap2qp541.jpg","link2148":"https://i.redd.it/1h134dvpoho21.jpg","link2149":"https://i.redd.it/1i1m4or4ro531.jpg","link2150":"https://i.redd.it/1ig5u8vv39l01.jpg","link2151":"https://i.redd.it/1imgj6vhx0u31.jpg","link2152":"https://i.redd.it/1iwt924eyfk01.jpg","link2153":"https://i.redd.it/1je75mml1mn31.jpg","link2154":"https://i.redd.it/1jhw34b901821.jpg","link2155":"https://i.redd.it/1kbvq5y2kv631.jpg","link2156":"https://i.redd.it/1l1cmw040e241.jpg","link2157":"https://i.redd.it/1l3d2pex46031.jpg","link2158":"https://i.redd.it/1l68qg8w1l121.jpg","link2159":"https://i.redd.it/1lc8eu8lx4031.jpg","link2160":"https://i.redd.it/1lff17qfbj621.jpg","link2161":"https://i.redd.it/1n4ckuufce431.jpg","link2162":"https://i.redd.it/1nlk29of2he11.jpg","link2163":"https://i.redd.it/1omvqbdcord21.jpg","link2164":"https://i.redd.it/1p8p508uywy31.jpg","link2165":"https://i.redd.it/1r1kwyfup4731.jpg","link2166":"https://i.redd.it/1sop93v3sgl31.jpg","link2167":"https://i.redd.it/1t552wd7s8741.jpg","link2168":"https://i.redd.it/1u94d64yvat31.jpg","link2169":"https://i.redd.it/1v8qy5lt8d621.jpg","link2170":"https://i.redd.it/1vqv4enabv241.jpg","link2171":"https://i.redd.it/1w47t11xdy141.jpg","link2172":"https://i.redd.it/1wyga6rgrj831.jpg","link2173":"https://i.redd.it/1xboppmcqz931.jpg","link2174":"https://i.redd.it/1xqbp08x6hw21.jpg","link2175":"https://i.redd.it/1ysc7e9zln531.jpg","link2176":"https://i.redd.it/1yxhp24ityl21.jpg","link2177":"https://i.redd.it/1zb2mmfhj7q31.jpg","link2178":"https://i.redd.it/1zg97h8bm2641.jpg","link2179":"https://i.redd.it/1zgv5w7h5ut31.jpg","link2180":"https://i.redd.it/2094lhr6zqc31.jpg","link2181":"https://i.redd.it/20kxf505ask31.jpg","link2182":"https://i.redd.it/20p4qve2ed031.jpg","link2183":"https://i.redd.it/219rpl6qxl241.jpg","link2184":"https://i.redd.it/22ouccv05mx21.jpg","link2185":"https://i.redd.it/22qeevwwyou21.jpg","link2186":"https://i.redd.it/22vgydgxawo21.jpg","link2187":"https://i.redd.it/23cuyabkaj331.jpg","link2188":"https://i.redd.it/23h7gikluwb31.jpg","link2189":"https://i.redd.it/23lw0kuzoef21.jpg","link2190":"https://i.redd.it/24759acbsih11.jpg","link2191":"https://i.redd.it/24tke9pd7mg21.jpg","link2192":"https://i.redd.it/2531rkufmi331.jpg","link2193":"https://i.redd.it/25f2rj6b7tq31.jpg","link2194":"https://i.redd.it/267szo7vdvu21.jpg","link2195":"https://i.redd.it/26bs3jym1xs21.jpg","link2196":"https://i.redd.it/27002m4yai311.jpg","link2197":"https://i.redd.it/273j3jck62c11.jpg","link2198":"https://i.redd.it/27fp9iuan5o31.jpg","link2199":"https://i.redd.it/27ig4x5hsp731.jpg","link2200":"https://i.redd.it/27vkplxe5sv21.jpg","link2201":"https://i.redd.it/28ihettp2vf11.jpg","link2202":"https://i.redd.it/28mi3fm3re241.jpg","link2203":"https://i.redd.it/28q50f65yrw31.jpg","link2204":"https://i.redd.it/29n4xcuqzk231.jpg","link2205":"https://i.redd.it/2a7sob6vme641.jpg","link2206":"https://i.redd.it/2b94ioizqgh31.jpg","link2207":"https://i.redd.it/2bfc4pjyxyw21.jpg","link2208":"https://i.redd.it/2c07h2lb9o541.jpg","link2209":"https://i.redd.it/2cmd9oeyvhc31.jpg","link2210":"https://i.redd.it/2f6aqxbw6i931.jpg","link2211":"https://i.redd.it/2frr1a4y7u241.jpg","link2212":"https://i.redd.it/2gqqrjfm01641.jpg","link2213":"https://i.redd.it/2hxq2ceiw9g31.jpg","link2214":"https://i.redd.it/2i3m8qfk7ak31.jpg","link2215":"https://i.redd.it/2i3p3k58goe11.jpg","link2216":"https://i.redd.it/2i4mhymc99031.jpg","link2217":"https://i.redd.it/2it6lynt6ub11.jpg","link2218":"https://i.redd.it/2iw9luginm921.jpg","link2219":"https://i.redd.it/2jauri0ia5h11.jpg","link2220":"https://i.redd.it/2lv7aplk3jt31.jpg","link2221":"https://i.redd.it/2mjvi3b2ely11.jpg","link2222":"https://i.redd.it/2mx7h4dx07b21.jpg","link2223":"https://i.redd.it/2n5lcp0opvj31.jpg","link2224":"https://i.redd.it/2nrqjel1pmz21.jpg","link2225":"https://i.redd.it/2os1cvlb0gy31.jpg","link2226":"https://i.redd.it/2phbd1nljwd31.jpg","link2227":"https://i.redd.it/2pnikzawym331.jpg","link2228":"https://i.redd.it/2qbizlrbrny21.jpg","link2229":"https://i.redd.it/2qi1l5pnzc641.jpg","link2230":"https://i.redd.it/2qts4rvn8px21.jpg","link2231":"https://i.redd.it/2qza5asnq6o21.jpg","link2232":"https://i.redd.it/2r55kiq0yvm31.jpg","link2233":"https://i.redd.it/2raj93a3sla31.jpg","link2234":"https://i.redd.it/2rph4xinmxv31.jpg","link2235":"https://i.redd.it/2s95a7t1gjr21.jpg","link2236":"https://i.redd.it/2sxi2ws6czx21.jpg","link2237":"https://i.redd.it/2t4mxxmro9t21.jpg","link2238":"https://i.redd.it/2tq45n56ss731.jpg","link2239":"https://i.redd.it/2ttxdkz7ykd21.jpg","link2240":"https://i.redd.it/2tww93m2z8h21.jpg","link2241":"https://i.redd.it/2u80i4w622231.jpg","link2242":"https://i.redd.it/2umxzvpqmln31.jpg","link2243":"https://i.redd.it/2uqgakcyxjk21.jpg","link2244":"https://i.redd.it/2v3cwnx6kbb31.jpg","link2245":"https://i.redd.it/2v43u6m7er721.jpg","link2246":"https://i.redd.it/2vb7r647vuy31.jpg","link2247":"https://i.redd.it/2vjdo3j3tk541.jpg","link2248":"https://i.redd.it/2vo7hvqhi6g21.jpg","link2249":"https://i.redd.it/2waxigbpdcj21.jpg","link2250":"https://i.redd.it/2wirmdjzgxl21.jpg","link2251":"https://i.redd.it/2wsolj1gm7n21.jpg","link2252":"https://i.redd.it/2x4v41jrwtw21.jpg","link2253":"https://i.redd.it/2xnhqcyrazb31.jpg","link2254":"https://i.redd.it/2xo8gts0pnh31.jpg","link2255":"https://i.redd.it/2xsq1jqsij441.jpg","link2256":"https://i.redd.it/2ycc3ns40yn21.jpg","link2257":"https://i.redd.it/2yugczoppys21.jpg","link2258":"https://i.redd.it/2yvrv00rgcy31.jpg","link2259":"https://i.redd.it/2zguqxzc6p041.jpg","link2260":"https://i.redd.it/2zm6bt45cnt21.jpg","link2261":"https://i.redd.it/30jm9193qa521.jpg","link2262":"https://i.redd.it/31r8aq118d831.jpg","link2263":"https://i.redd.it/31ugfkxr7fm31.jpg","link2264":"https://i.redd.it/32dw4j1s0ye31.jpg","link2265":"https://i.redd.it/32ywu7u39f031.jpg","link2266":"https://i.redd.it/33slvhmqufi21.jpg","link2267":"https://i.redd.it/34fizstc79441.jpg","link2268":"https://i.redd.it/35mnpr645mq21.jpg","link2269":"https://i.redd.it/35rjavrre3k21.jpg","link2270":"https://i.redd.it/36a52iloo8541.jpg","link2271":"https://i.redd.it/376i6vrg38w31.jpg","link2272":"https://i.redd.it/37rm4btxee821.jpg","link2273":"https://i.redd.it/383ehtcja6w21.jpg","link2274":"https://i.redd.it/3980lh8oat741.jpg","link2275":"https://i.redd.it/39y3kiavvvl21.jpg","link2276":"https://i.redd.it/3a6x0t4vauy31.jpg","link2277":"https://i.redd.it/3azv1x0s7zu21.jpg","link2278":"https://i.redd.it/3b5jzxzs1j111.jpg","link2279":"https://i.redd.it/3c1ja6s049y21.jpg","link2280":"https://i.redd.it/3c8sbfc4at831.jpg","link2281":"https://i.redd.it/3ci3gob1up131.jpg","link2282":"https://i.redd.it/3cjo13mwk0x31.jpg","link2283":"https://i.redd.it/3cofef6la7t31.jpg","link2284":"https://i.redd.it/3dthy532sle31.jpg","link2285":"https://i.redd.it/3e80s0odavs31.jpg","link2286":"https://i.redd.it/3ed34ahrlhq21.jpg","link2287":"https://i.redd.it/3eky65g2s7k21.jpg","link2288":"https://i.redd.it/3ffmsyvf1rl31.jpg","link2289":"https://i.redd.it/3fk3x359rj641.jpg","link2290":"https://i.redd.it/3fnje9fx1w241.jpg","link2291":"https://i.redd.it/3g35d48g9dz11.jpg","link2292":"https://i.redd.it/3gb4ympjvlz31.jpg","link2293":"https://i.redd.it/3h8v10ddc6z21.jpg","link2294":"https://i.redd.it/3hgbd1xszvy11.jpg","link2295":"https://i.redd.it/3hnlhvl8op341.jpg","link2296":"https://i.redd.it/3i2vkddqrxp21.jpg","link2297":"https://i.redd.it/3i581immjip21.jpg","link2298":"https://i.redd.it/3i6mnyp4op131.jpg","link2299":"https://i.redd.it/3kbn5v4f9i741.jpg","link2300":"https://i.redd.it/3kqizlu0web31.jpg","link2301":"https://i.redd.it/3kxfpirt1ow31.jpg","link2302":"https://i.redd.it/3l6giaj2ei111.jpg","link2303":"https://i.redd.it/3n8qa1vfmyd31.jpg","link2304":"https://i.redd.it/3ng7lw2xsbt31.jpg","link2305":"https://i.redd.it/3nolqf9me9w21.jpg","link2306":"https://i.redd.it/3o2iqpt0p5m31.jpg","link2307":"https://i.redd.it/3o8mr19mdce21.jpg","link2308":"https://i.redd.it/3ocfg4nh6eg21.jpg","link2309":"https://i.redd.it/3opgh7hkbid31.jpg","link2310":"https://i.redd.it/3opoiiefjiv01.jpg","link2311":"https://i.redd.it/3p6btl1phnf21.jpg","link2312":"https://i.redd.it/3plgwl4h1kj31.jpg","link2313":"https://i.redd.it/3pvstf2ajz741.jpg","link2314":"https://i.redd.it/3qaitxpk04l31.jpg","link2315":"https://i.redd.it/3qfx0fk8nj241.jpg","link2316":"https://i.redd.it/3qhfoomspi141.jpg","link2317":"https://i.redd.it/3rdly2u3gf431.jpg","link2318":"https://i.redd.it/3rz0erye74e31.jpg","link2319":"https://i.redd.it/3sh5k9rzqkd11.jpg","link2320":"https://i.redd.it/3ta0pygon6931.jpg","link2321":"https://i.redd.it/3ubmb5dcek721.jpg","link2322":"https://i.redd.it/3uk6i0djqe031.jpg","link2323":"https://i.redd.it/3v2dzadp00031.jpg","link2324":"https://i.redd.it/3vygoqqx6rz31.jpg","link2325":"https://i.redd.it/3wd95gwr5hf21.jpg","link2326":"https://i.redd.it/3wxsbwn260m31.jpg","link2327":"https://i.redd.it/3xn84ly4fwx21.jpg","link2328":"https://i.redd.it/3xo1ywcl3yb31.jpg","link2329":"https://i.redd.it/3xyce9uuv9w31.jpg","link2330":"https://i.redd.it/3yjqk8vpnif31.jpg","link2331":"https://i.redd.it/3zv6edpum4341.jpg","link2332":"https://i.redd.it/3zzsw8x0y6b31.jpg","link2333":"https://i.redd.it/40g5p1jssqt31.jpg","link2334":"https://i.redd.it/411guuw3bhg21.jpg","link2335":"https://i.redd.it/41admf068mj31.jpg","link2336":"https://i.redd.it/41b3mpy80ls31.jpg","link2337":"https://i.redd.it/425uitjk0op31.jpg","link2338":"https://i.redd.it/42ay1a2skrh21.jpg","link2339":"https://i.redd.it/44tjs6h1yew21.jpg","link2340":"https://i.redd.it/45vs1c31fyx31.jpg","link2341":"https://i.redd.it/46tfewjfvjh31.jpg","link2342":"https://i.redd.it/475x9yf7el331.jpg","link2343":"https://i.redd.it/48sm81we6ev21.jpg","link2344":"https://i.redd.it/48u18onkhrz21.jpg","link2345":"https://i.redd.it/49fiy2856t141.jpg","link2346":"https://i.redd.it/49qwaj9rcq721.jpg","link2347":"https://i.redd.it/4a1o5khhavm21.jpg","link2348":"https://i.redd.it/4a7onb2yq4131.jpg","link2349":"https://i.redd.it/4alqwr9hbau21.jpg","link2350":"https://i.redd.it/4aquh96rph541.jpg","link2351":"https://i.redd.it/4c2hlk6yymj21.jpg","link2352":"https://i.redd.it/4c8athufp5c11.jpg","link2353":"https://i.redd.it/4cmzk2waf6341.jpg","link2354":"https://i.redd.it/4cntqly2rv241.jpg","link2355":"https://i.redd.it/4dl345lf4o721.jpg","link2356":"https://i.redd.it/4dt8m5aczq041.jpg","link2357":"https://i.redd.it/4f9kbnmxt5i31.jpg","link2358":"https://i.redd.it/4fg4xngvdin21.jpg","link2359":"https://i.redd.it/4gj6l92tooy31.jpg","link2360":"https://i.redd.it/4gnfnndm2it21.jpg","link2361":"https://i.redd.it/4hluujcu16531.jpg","link2362":"https://i.redd.it/4hrjskaifpo31.jpg","link2363":"https://i.redd.it/4hryypj5r8a31.jpg","link2364":"https://i.redd.it/4i61lnvgiem31.jpg","link2365":"https://i.redd.it/4i62q7p2t4831.jpg","link2366":"https://i.redd.it/4ifqoqaefiu21.jpg","link2367":"https://i.redd.it/4irv7jo7yk041.jpg","link2368":"https://i.redd.it/4jdev2sf5bg21.jpg","link2369":"https://i.redd.it/4jiokrf41ci31.jpg","link2370":"https://i.redd.it/4jv3minmhw441.jpg","link2371":"https://i.redd.it/4jw45pux9wd31.jpg","link2372":"https://i.redd.it/4khpuqmj88n01.jpg","link2373":"https://i.redd.it/4kqjh0on49k11.jpg","link2374":"https://i.redd.it/4kzd5itusln31.jpg","link2375":"https://i.redd.it/4nbhk10wlw431.jpg","link2376":"https://i.redd.it/4ndi1p1nz3841.jpg","link2377":"https://i.redd.it/4neb5iz06av21.jpg","link2378":"https://i.redd.it/4otm7pj684641.jpg","link2379":"https://i.redd.it/4q66cd6snlh21.jpg","link2380":"https://i.redd.it/4r4h8ylzi9v21.jpg","link2381":"https://i.redd.it/4remw29r52q31.jpg","link2382":"https://i.redd.it/4rjc1jiy4t721.jpg","link2383":"https://i.redd.it/4s09tniuv1341.jpg","link2384":"https://i.redd.it/4scqxxdnmiz21.jpg","link2385":"https://i.redd.it/4sof34yegow31.jpg","link2386":"https://i.redd.it/4suujzulv1j31.jpg","link2387":"https://i.redd.it/4sw5cuyc36441.jpg","link2388":"https://i.redd.it/4u39h9mmhw721.jpg","link2389":"https://i.redd.it/4u8ueg61vw341.jpg","link2390":"https://i.redd.it/4ukyvmrfxp331.jpg","link2391":"https://i.redd.it/4v20uynm7nt21.jpg","link2392":"https://i.redd.it/4v9cckevavr21.jpg","link2393":"https://i.redd.it/4ve9aioq65c21.jpg","link2394":"https://i.redd.it/4vw7m2x2ku031.jpg","link2395":"https://i.redd.it/4vx4unsqqkd11.jpg","link2396":"https://i.redd.it/4waldx3r8ui31.jpg","link2397":"https://i.redd.it/4wj23sfe4e231.jpg","link2398":"https://i.redd.it/4y6r1zoq1gt21.jpg","link2399":"https://i.redd.it/4z0vzmrl36841.jpg","link2400":"https://i.redd.it/4z75qpsn08j21.jpg","link2401":"https://i.redd.it/50lftltqv2b21.jpg","link2402":"https://i.redd.it/50r3voni5uz21.jpg","link2403":"https://i.redd.it/50xhhzjjn2v11.jpg","link2404":"https://i.redd.it/51gijsy1il041.jpg","link2405":"https://i.redd.it/51s0yhgltmb11.jpg","link2406":"https://i.redd.it/52apd8583ke31.jpg","link2407":"https://i.redd.it/52j451v7v7c11.jpg","link2408":"https://i.redd.it/53erujtbjtg31.jpg","link2409":"https://i.redd.it/53ouw7dx2mp31.jpg","link2410":"https://i.redd.it/54srgfc0ttu21.jpg","link2411":"https://i.redd.it/54xk4lz1fal21.jpg","link2412":"https://i.redd.it/54yjgnd3jvh31.jpg","link2413":"https://i.redd.it/597ljrkfzh241.jpg","link2414":"https://i.redd.it/5cc0a4p3gdx31.jpg","link2415":"https://i.redd.it/5cd8k9ypeuq31.jpg","link2416":"https://i.redd.it/5djm6x1bucc11.jpg","link2417":"https://i.redd.it/5dmd0g0yiia31.jpg","link2418":"https://i.redd.it/5dqb4ilgpjp31.jpg","link2419":"https://i.redd.it/5dt7bydswtw21.jpg","link2420":"https://i.redd.it/5dvtx1cn87m21.jpg","link2421":"https://i.redd.it/5ekv4wk8hmf31.jpg","link2422":"https://i.redd.it/5f31kv0p5ds31.jpg","link2423":"https://i.redd.it/5f3nw4ei24x11.jpg","link2424":"https://i.redd.it/5g41tvowow831.jpg","link2425":"https://i.redd.it/5g43p85u8ln31.jpg","link2426":"https://i.redd.it/5gddjerio3631.jpg","link2427":"https://i.redd.it/5if7ykla54q21.jpg","link2428":"https://i.redd.it/5igtnougj3s31.jpg","link2429":"https://i.redd.it/5j2b7o7v0yw21.jpg","link2430":"https://i.redd.it/5j7fesx9di111.jpg","link2431":"https://i.redd.it/5k3p4xf8uug31.jpg","link2432":"https://i.redd.it/5l2v5u1dsi141.jpg","link2433":"https://i.redd.it/5lz5ii47qn031.jpg","link2434":"https://i.redd.it/5ngp5te936131.jpg","link2435":"https://i.redd.it/5nzgyclg0xn21.jpg","link2436":"https://i.redd.it/5p9t7jwbrtl31.jpg","link2437":"https://i.redd.it/5pre0mtwm8n21.jpg","link2438":"https://i.redd.it/5qz03xiaf5331.jpg","link2439":"https://i.redd.it/5r5otm4mm1m31.jpg","link2440":"https://i.redd.it/5ri7kfveljg21.jpg","link2441":"https://i.redd.it/5tc8dxuyof841.jpg","link2442":"https://i.redd.it/5tgop4ubib121.jpg","link2443":"https://i.redd.it/5tkom1dko6341.jpg","link2444":"https://i.redd.it/5uc2kmyaggv31.jpg","link2445":"https://i.redd.it/5uhh5i9jvmp21.jpg","link2446":"https://i.redd.it/5upruptwaci21.jpg","link2447":"https://i.redd.it/5vlb2n289i841.jpg","link2448":"https://i.redd.it/5w7qb497znc31.jpg","link2449":"https://i.redd.it/5wzh4ktwizy31.jpg","link2450":"https://i.redd.it/5xsydu9w49c21.jpg","link2451":"https://i.redd.it/5y6ihqp4bi111.jpg","link2452":"https://i.redd.it/5yd57auzjku31.jpg","link2453":"https://i.redd.it/5ygwvrcuqmk31.jpg","link2454":"https://i.redd.it/60w76xreao241.jpg","link2455":"https://i.redd.it/61xlfpuj12j21.jpg","link2456":"https://i.redd.it/62ym5446jre31.jpg","link2457":"https://i.redd.it/630ltm088ey11.jpg","link2458":"https://i.redd.it/640mi0wfcjq21.jpg","link2459":"https://i.redd.it/64o7shfaoo041.jpg","link2460":"https://i.redd.it/64r6mcmvjxa21.jpg","link2461":"https://i.redd.it/65td4rn1vjm31.jpg","link2462":"https://i.redd.it/66bu96tz1ek31.jpg","link2463":"https://i.redd.it/66i07rv03p841.jpg","link2464":"https://i.redd.it/67fztlm2bp831.jpg","link2465":"https://i.redd.it/67uh9knfbi111.jpg","link2466":"https://i.redd.it/6804u9qxopr21.jpg","link2467":"https://i.redd.it/68jl8d7rdbq31.jpg","link2468":"https://i.redd.it/695wrjezjxa21.jpg","link2469":"https://i.redd.it/6a2hb1tgo7h31.jpg","link2470":"https://i.redd.it/6a6ujahfr8h21.jpg","link2471":"https://i.redd.it/6ad2zgeykmz31.jpg","link2472":"https://i.redd.it/6ae57jdgq8s21.jpg","link2473":"https://i.redd.it/6avj8cy82fd31.jpg","link2474":"https://i.redd.it/6bdvcli5u7d21.jpg","link2475":"https://i.redd.it/6c37wqsgwgm31.jpg","link2476":"https://i.redd.it/6d1hz7dw0q641.jpg","link2477":"https://i.redd.it/6fpyi70kapr31.jpg","link2478":"https://i.redd.it/6gy5s62aid831.jpg","link2479":"https://i.redd.it/6h31gzyo23n21.jpg","link2480":"https://i.redd.it/6h59b66uuz801.jpg","link2481":"https://i.redd.it/6h61nxbiwqu31.jpg","link2482":"https://i.redd.it/6jikgcq3mq831.jpg","link2483":"https://i.redd.it/6k22es7jt0n21.jpg","link2484":"https://i.redd.it/6k29eq8a5w931.jpg","link2485":"https://i.redd.it/6ko1trmqxfq21.jpg","link2486":"https://i.redd.it/6ko7ckgt2qq31.jpg","link2487":"https://i.redd.it/6kr39vqljmt31.jpg","link2488":"https://i.redd.it/6kztgpulrx431.jpg","link2489":"https://i.redd.it/6lux93auaov31.jpg","link2490":"https://i.redd.it/6m0p0hqsmpb21.jpg","link2491":"https://i.redd.it/6p7wg4ql4rr21.jpg","link2492":"https://i.redd.it/6pedeke6bft21.jpg","link2493":"https://i.redd.it/6pls9onvt8n21.jpg","link2494":"https://i.redd.it/6q543pb2c8d21.jpg","link2495":"https://i.redd.it/6q75m4wwxy421.jpg","link2496":"https://i.redd.it/6q9pj8xw12c11.jpg","link2497":"https://i.redd.it/6qki0vswwfr31.jpg","link2498":"https://i.redd.it/6rh8s9ub77e11.jpg","link2499":"https://i.redd.it/6so1md7yqr541.jpg","link2500":"https://i.redd.it/6tdd1kbuqbo21.jpg","link2501":"https://i.redd.it/6u20dqgs18p31.jpg","link2502":"https://i.redd.it/6wa8bbpl2uc31.jpg","link2503":"https://i.redd.it/6wrrug9trnt01.jpg","link2504":"https://i.redd.it/6x3dzx7nnra31.jpg","link2505":"https://i.redd.it/6xbbadd7b7w31.jpg","link2506":"https://i.redd.it/6xo391dhi1x31.jpg","link2507":"https://i.redd.it/6xxq74ai5pf11.jpg","link2508":"https://i.redd.it/6xy1dw7je6231.jpg","link2509":"https://i.redd.it/6yyvaaa8n2g31.jpg","link2510":"https://i.redd.it/6ze21ggz10u21.jpg","link2511":"https://i.redd.it/70iuqsl2syz21.jpg","link2512":"https://i.redd.it/71ahes5cfu141.jpg","link2513":"https://i.redd.it/71vwrsan84v21.jpg","link2514":"https://i.redd.it/7338elq7g2421.jpg","link2515":"https://i.redd.it/73l3lnw0srd11.jpg","link2516":"https://i.redd.it/73wbm07crcz21.jpg","link2517":"https://i.redd.it/73yv1pp77vn21.jpg","link2518":"https://i.redd.it/747c5dud81731.jpg","link2519":"https://i.redd.it/74gu4a0mhwt21.jpg","link2520":"https://i.redd.it/74zxg1r9z6641.jpg","link2521":"https://i.redd.it/75fy0gq8j2621.jpg","link2522":"https://i.redd.it/75zpu3h9hsk21.jpg","link2523":"https://i.redd.it/764ii9svo0541.jpg","link2524":"https://i.redd.it/764ld5005f141.jpg","link2525":"https://i.redd.it/775u2fsdlaj21.jpg","link2526":"https://i.redd.it/78qmuepaeu621.jpg","link2527":"https://i.redd.it/79me94dnf1q21.jpg","link2528":"https://i.redd.it/79mpoiu8ym541.jpg","link2529":"https://i.redd.it/7a8q3d5ke9541.jpg","link2530":"https://i.redd.it/7anfdsqss1u01.jpg","link2531":"https://i.redd.it/7atrv31cxuc31.jpg","link2532":"https://i.redd.it/7c6g1wigavo21.jpg","link2533":"https://i.redd.it/7c8zuho2uza31.jpg","link2534":"https://i.redd.it/7c9h0utu3hn21.jpg","link2535":"https://i.redd.it/7cdd5rol4e231.jpg","link2536":"https://i.redd.it/7euftavda9h21.jpg","link2537":"https://i.redd.it/7evc9kshqun21.jpg","link2538":"https://i.redd.it/7fn7mzt9qx031.jpg","link2539":"https://i.redd.it/7g0fy6ny75031.jpg","link2540":"https://i.redd.it/7g6vzgftl9s31.jpg","link2541":"https://i.redd.it/7gbibqehm5y21.jpg","link2542":"https://i.redd.it/7h6yorhvgbl21.jpg","link2543":"https://i.redd.it/7hnv6julb8041.jpg","link2544":"https://i.redd.it/7hs85maj8r621.jpg","link2545":"https://i.redd.it/7i4xhhuh2x231.jpg","link2546":"https://i.redd.it/7ied9u4swwz31.jpg","link2547":"https://i.redd.it/7itj2gzlmt621.jpg","link2548":"https://i.redd.it/7iz679jm9jf31.jpg","link2549":"https://i.redd.it/7jfmfwkfvdi21.jpg","link2550":"https://i.redd.it/7js5zugf5xz21.jpg","link2551":"https://i.redd.it/7jynzxddapw21.jpg","link2552":"https://i.redd.it/7lghrqx0omx21.jpg","link2553":"https://i.redd.it/7mcavcjj91i31.jpg","link2554":"https://i.redd.it/7n7ep1509gt21.jpg","link2555":"https://i.redd.it/7n8jps0tgb241.jpg","link2556":"https://i.redd.it/7oc3y2b91gt21.jpg","link2557":"https://i.redd.it/7pawbfk0dm331.jpg","link2558":"https://i.redd.it/7q0fznqod3y21.jpg","link2559":"https://i.redd.it/7qbjxsv62rv31.jpg","link2560":"https://i.redd.it/7qctg57jn4q31.jpg","link2561":"https://i.redd.it/7qesnuvndv031.jpg","link2562":"https://i.redd.it/7que60cbjea31.jpg","link2563":"https://i.redd.it/7r7nh3r8a6o21.jpg","link2564":"https://i.redd.it/7rbvpzq6nt931.jpg","link2565":"https://i.redd.it/7rf26u7fr8l31.jpg","link2566":"https://i.redd.it/7rgjz1pde5m31.jpg","link2567":"https://i.redd.it/7rwb0ntbnhw21.jpg","link2568":"https://i.redd.it/7tiw40y2nr741.jpg","link2569":"https://i.redd.it/7tp3b3anzhy21.jpg","link2570":"https://i.redd.it/7tti9hb842231.jpg","link2571":"https://i.redd.it/7u0ggs6tyh521.jpg","link2572":"https://i.redd.it/7u69rpq9k1241.jpg","link2573":"https://i.redd.it/7u8xnjgjziw21.jpg","link2574":"https://i.redd.it/7uddq15kvm331.jpg","link2575":"https://i.redd.it/7vno6knca8731.jpg","link2576":"https://i.redd.it/7w5fldcnbco31.jpg","link2577":"https://i.redd.it/7x7w14yi54d31.jpg","link2578":"https://i.redd.it/7xnsso1228p31.jpg","link2579":"https://i.redd.it/7y0635tz6jr21.jpg","link2580":"https://i.redd.it/7yc97twp96p31.jpg","link2581":"https://i.redd.it/7yum6p469us21.jpg","link2582":"https://i.redd.it/7z8b9qt37d131.jpg","link2583":"https://i.redd.it/7zps8819iu441.jpg","link2584":"https://i.redd.it/800j52m3q1a31.jpg","link2585":"https://i.redd.it/803bokzlugv11.jpg","link2586":"https://i.redd.it/803zbfkvtrn21.jpg","link2587":"https://i.redd.it/80lq9k9iid041.jpg","link2588":"https://i.redd.it/810arw2wya031.jpg","link2589":"https://i.redd.it/81387acqro821.jpg","link2590":"https://i.redd.it/818dci3jlnu01.jpg","link2591":"https://i.redd.it/831mi3d6tgb31.jpg","link2592":"https://i.redd.it/832osgn0xyt31.jpg","link2593":"https://i.redd.it/834xc9dryyd21.jpg","link2594":"https://i.redd.it/84cogen7yoq21.jpg","link2595":"https://i.redd.it/84sqww0cm4621.jpg","link2596":"https://i.redd.it/84y6fxnswz041.jpg","link2597":"https://i.redd.it/85tkx3l98ss21.jpg","link2598":"https://i.redd.it/85xi8nzn1m731.jpg","link2599":"https://i.redd.it/85zjv83a3dl21.jpg","link2600":"https://i.redd.it/86zutrbwegy21.jpg","link2601":"https://i.redd.it/871hg0rsnag31.jpg","link2602":"https://i.redd.it/876kkmfehdu31.jpg","link2603":"https://i.redd.it/88nz0yzuel721.jpg","link2604":"https://i.redd.it/89n052w3loh31.jpg","link2605":"https://i.redd.it/8ace57i9v6p31.jpg","link2606":"https://i.redd.it/8br0c83wtuc21.jpg","link2607":"https://i.redd.it/8bwnla26yug31.jpg","link2608":"https://i.redd.it/8c05wc99ydd21.jpg","link2609":"https://i.redd.it/8cl4ftygpys21.jpg","link2610":"https://i.redd.it/8d657lfkprm11.jpg","link2611":"https://i.redd.it/8fag2dbb9p741.jpg","link2612":"https://i.redd.it/8fey296zr6621.jpg","link2613":"https://i.redd.it/8fgrxpumri241.jpg","link2614":"https://i.redd.it/8fhwf8fli3841.jpg","link2615":"https://i.redd.it/8ft8g3ytuf131.jpg","link2616":"https://i.redd.it/8ftqni4fbjs21.jpg","link2617":"https://i.redd.it/8g2xdzkccso31.jpg","link2618":"https://i.redd.it/8jurb50ur5h21.jpg","link2619":"https://i.redd.it/8m58xf6e5hw31.jpg","link2620":"https://i.redd.it/8m94k4x75xb21.jpg","link2621":"https://i.redd.it/8mrhf9t2x4s21.jpg","link2622":"https://i.redd.it/8nowl6hxg2u11.jpg","link2623":"https://i.redd.it/8nx4mf9xzrg31.jpg","link2624":"https://i.redd.it/8oq4u5ynelw21.jpg","link2625":"https://i.redd.it/8oyxh7x9kln21.jpg","link2626":"https://i.redd.it/8p77zbgyrhi21.jpg","link2627":"https://i.redd.it/8p9hih5296x11.jpg","link2628":"https://i.redd.it/8pexza3yexz31.jpg","link2629":"https://i.redd.it/8qlvztrv9am31.jpg","link2630":"https://i.redd.it/8rvc3wy7orf11.jpg","link2631":"https://i.redd.it/8s2q1pd9uk741.jpg","link2632":"https://i.redd.it/8s6sznw85gz31.jpg","link2633":"https://i.redd.it/8slu9ydy4je11.jpg","link2634":"https://i.redd.it/8t7x0o9yl6031.jpg","link2635":"https://i.redd.it/8ttc9uyrq0t21.jpg","link2636":"https://i.redd.it/8txuqkv5opq31.jpg","link2637":"https://i.redd.it/8uynasn131731.jpg","link2638":"https://i.redd.it/8v8ht5sngeg31.jpg","link2639":"https://i.redd.it/8v8qb2dpik741.jpg","link2640":"https://i.redd.it/8vi6ytru8sv21.jpg","link2641":"https://i.redd.it/8vm2pwc0hr531.jpg","link2642":"https://i.redd.it/8vv88rk6rn341.jpg","link2643":"https://i.redd.it/8wh5p14hx4f31.jpg","link2644":"https://i.redd.it/8wsawcwg4wu21.jpg","link2645":"https://i.redd.it/8x20m3ghl8641.jpg","link2646":"https://i.redd.it/8xrinqi96zz01.jpg","link2647":"https://i.redd.it/8y7limp57bf21.jpg","link2648":"https://i.redd.it/8yfb3yhku0721.jpg","link2649":"https://i.redd.it/8yn143f219e31.jpg","link2650":"https://i.redd.it/8zb6ynae3n041.jpg","link2651":"https://i.redd.it/9066he5t2r431.jpg","link2652":"https://i.redd.it/90t0eti2asg31.jpg","link2653":"https://i.redd.it/9473cbtiojq31.jpg","link2654":"https://i.redd.it/94p27ddbu8x21.jpg","link2655":"https://i.redd.it/96szz7z69vc31.jpg","link2656":"https://i.redd.it/974a05hk12d31.jpg","link2657":"https://i.redd.it/97djce0lf9x31.jpg","link2658":"https://i.redd.it/97vu54tvv8931.jpg","link2659":"https://i.redd.it/988si7mxuyc11.jpg","link2660":"https://i.redd.it/993jk8wbx2d31.jpg","link2661":"https://i.redd.it/993mgy0jfp931.jpg","link2662":"https://i.redd.it/9a7pvdp43xs31.jpg","link2663":"https://i.redd.it/9add5sjzcx841.jpg","link2664":"https://i.redd.it/9aei2fd6dv331.jpg","link2665":"https://i.redd.it/9ahij7fwtwz31.jpg","link2666":"https://i.redd.it/9aqe5efy7ze21.jpg","link2667":"https://i.redd.it/9c8grh13jrx21.jpg","link2668":"https://i.redd.it/9cddo4uocmf31.jpg","link2669":"https://i.redd.it/9cmupazb0kp31.jpg","link2670":"https://i.redd.it/9cuw6r0apnd31.jpg","link2671":"https://i.redd.it/9d8stff8rt541.jpg","link2672":"https://i.redd.it/9dme74jqtd031.jpg","link2673":"https://i.redd.it/9dye1qydzdn21.jpg","link2674":"https://i.redd.it/9e1ax18uwsx21.jpg","link2675":"https://i.redd.it/9ff8fjavw0131.jpg","link2676":"https://i.redd.it/9g48qqqlwl931.jpg","link2677":"https://i.redd.it/9h3ytwz88qi11.jpg","link2678":"https://i.redd.it/9h5d3hg5ii641.jpg","link2679":"https://i.redd.it/9hp721wlsxd31.jpg","link2680":"https://i.redd.it/9hpmmnhrwtw21.jpg","link2681":"https://i.redd.it/9j3mszddkkk31.jpg","link2682":"https://i.redd.it/9jaohj8nntf31.jpg","link2683":"https://i.redd.it/9je3nwpgp4u31.jpg","link2684":"https://i.redd.it/9jnnzkvugit31.jpg","link2685":"https://i.redd.it/9k351ulm5yt31.jpg","link2686":"https://i.redd.it/9ksxxq3vge721.jpg","link2687":"https://i.redd.it/9m51efi3a1x21.jpg","link2688":"https://i.redd.it/9mlyti5k8uz21.jpg","link2689":"https://i.redd.it/9mxat73d3ju11.jpg","link2690":"https://i.redd.it/9mxlqiih3cf21.jpg","link2691":"https://i.redd.it/9n1y07ip1i141.jpg","link2692":"https://i.redd.it/9n4wpudfnyy21.jpg","link2693":"https://i.redd.it/9naa3vgmdi111.jpg","link2694":"https://i.redd.it/9ns9a6ara8x21.jpg","link2695":"https://i.redd.it/9nvg2nonl0n21.jpg","link2696":"https://i.redd.it/9oxp7uiv3nc31.jpg","link2697":"https://i.redd.it/9phin93lthp21.jpg","link2698":"https://i.redd.it/9pxmpi1c96d21.jpg","link2699":"https://i.redd.it/9qa1iuykz2241.jpg","link2700":"https://i.redd.it/9rgeg6e1r3x21.jpg","link2701":"https://i.redd.it/9rhkdysizq331.jpg","link2702":"https://i.redd.it/9rile4225km31.jpg","link2703":"https://i.redd.it/9rpkk3l47jr21.jpg","link2704":"https://i.redd.it/9s27x7o8k4q31.jpg","link2705":"https://i.redd.it/9tn5av4litf31.jpg","link2706":"https://i.redd.it/9uoxcgyqon241.jpg","link2707":"https://i.redd.it/9vm5l2ntxkj31.jpg","link2708":"https://i.redd.it/9vwatzr7edi31.jpg","link2709":"https://i.redd.it/9wkwa8ng4l641.jpg","link2710":"https://i.redd.it/9wo8gzdzf3231.jpg","link2711":"https://i.redd.it/9xkqny718rg21.jpg","link2712":"https://i.redd.it/9yvuapyq3qx01.jpg","link2713":"https://i.redd.it/9z94qvmqy7r31.jpg","link2714":"https://i.redd.it/9zmshkwy0ni31.jpg","link2715":"https://i.redd.it/a0bjw13zevr31.jpg","link2716":"https://i.redd.it/a1fuyq2ciqh21.jpg","link2717":"https://i.redd.it/a1pdt70x6gw31.jpg","link2718":"https://i.redd.it/a1zepnspfiu21.jpg","link2719":"https://i.redd.it/a29off7jsaw31.jpg","link2720":"https://i.redd.it/a2br7b9qlar21.jpg","link2721":"https://i.redd.it/a2id2ot10sp31.jpg","link2722":"https://i.redd.it/a3b5ba8gzrb31.jpg","link2723":"https://i.redd.it/a3eq96t3zue31.jpg","link2724":"https://i.redd.it/a3oxajx6ob731.jpg","link2725":"https://i.redd.it/a3xt8400qsl21.jpg","link2726":"https://i.redd.it/a5ahwo79av341.jpg","link2727":"https://i.redd.it/a5lrbnfze1231.jpg","link2728":"https://i.redd.it/a63cjwutn3y21.jpg","link2729":"https://i.redd.it/a6iwgbpxz5241.jpg","link2730":"https://i.redd.it/a6onotmlb5g31.jpg","link2731":"https://i.redd.it/a8l9l1vojw531.jpg","link2732":"https://i.redd.it/a8wv2dgb7y331.jpg","link2733":"https://i.redd.it/a8yy6jktgos31.jpg","link2734":"https://i.redd.it/a95jsmk0d5731.jpg","link2735":"https://i.redd.it/a9938ir5yx731.jpg","link2736":"https://i.redd.it/ab25n2hi2eb31.jpg","link2737":"https://i.redd.it/ab3kg4vpm4r31.jpg","link2738":"https://i.redd.it/ac7jzpy3v6f11.jpg","link2739":"https://i.redd.it/ad922xh4hzb11.jpg","link2740":"https://i.redd.it/ad9j31a0azo31.jpg","link2741":"https://i.redd.it/ae84bq9a0gt21.jpg","link2742":"https://i.redd.it/aecz143u7gk31.jpg","link2743":"https://i.redd.it/aevbnnfiexm21.jpg","link2744":"https://i.redd.it/ag5lxn4h0hv31.jpg","link2745":"https://i.redd.it/ah4z1wimcyb31.jpg","link2746":"https://i.redd.it/ai27i38jpw831.jpg","link2747":"https://i.redd.it/ai78zr1d71741.jpg","link2748":"https://i.redd.it/aifu5a3eosn31.jpg","link2749":"https://i.redd.it/al70w4fwl1821.jpg","link2750":"https://i.redd.it/alddfzp8vn831.jpg","link2751":"https://i.redd.it/alsuhmjk1q541.jpg","link2752":"https://i.redd.it/am1rr7f6t0z21.jpg","link2753":"https://i.redd.it/am2i9a39pb841.jpg","link2754":"https://i.redd.it/am48evyw9p011.jpg","link2755":"https://i.redd.it/am717mh5ydk21.jpg","link2756":"https://i.redd.it/amfs49wxxeh21.jpg","link2757":"https://i.redd.it/anjx2umfza821.jpg","link2758":"https://i.redd.it/anplmupwpt041.jpg","link2759":"https://i.redd.it/aoxwqvdrwtw21.jpg","link2760":"https://i.redd.it/apwyqjgf90841.jpg","link2761":"https://i.redd.it/apxxz1dfx4h31.jpg","link2762":"https://i.redd.it/asivib87gfw31.jpg","link2763":"https://i.redd.it/aszwkrkvqp231.jpg","link2764":"https://i.redd.it/at581m4ufy641.jpg","link2765":"https://i.redd.it/atdflde6erf21.jpg","link2766":"https://i.redd.it/aulg236o7cu21.jpg","link2767":"https://i.redd.it/av8ei4jticx31.jpg","link2768":"https://i.redd.it/avbkybqxzfe31.jpg","link2769":"https://i.redd.it/avfnyx04do031.jpg","link2770":"https://i.redd.it/aw62cy97hvf11.jpg","link2771":"https://i.redd.it/aweehy7lxii21.jpg","link2772":"https://i.redd.it/awrp09xm6qu21.jpg","link2773":"https://i.redd.it/awsqcjiygzc21.jpg","link2774":"https://i.redd.it/axbtydd562c11.jpg","link2775":"https://i.redd.it/axu6yht7gzd21.jpg","link2776":"https://i.redd.it/aybr4kel4t131.jpg","link2777":"https://i.redd.it/ayibfvbr1e731.jpg","link2778":"https://i.redd.it/ayjz76barsr31.jpg","link2779":"https://i.redd.it/azw6v92hh7031.jpg","link2780":"https://i.redd.it/b02612u3fha21.jpg","link2781":"https://i.redd.it/b0gjuytbdi111.jpg","link2782":"https://i.redd.it/b16k2b1v16921.jpg","link2783":"https://i.redd.it/b25z3w86pgi21.jpg","link2784":"https://i.redd.it/b2e5cdqhtf841.jpg","link2785":"https://i.redd.it/b2oc4gmqmr031.jpg","link2786":"https://i.redd.it/b4375ptaqmc11.jpg","link2787":"https://i.redd.it/b4h307talt441.jpg","link2788":"https://i.redd.it/b4vsna4kuzz31.jpg","link2789":"https://i.redd.it/b51zw40c12z31.jpg","link2790":"https://i.redd.it/b5vvgi8b4vz21.jpg","link2791":"https://i.redd.it/b682p70iirt31.jpg","link2792":"https://i.redd.it/b6ktcv5e3ww11.jpg","link2793":"https://i.redd.it/b6pjx2zjm0w31.jpg","link2794":"https://i.redd.it/b778x45h0k931.jpg","link2795":"https://i.redd.it/b7ne6x6g72g31.jpg","link2796":"https://i.redd.it/b97i8xaagbb31.jpg","link2797":"https://i.redd.it/ba8syrfz83a21.jpg","link2798":"https://i.redd.it/barkob2ft4z31.jpg","link2799":"https://i.redd.it/bb42273httf11.jpg","link2800":"https://i.redd.it/bbwcudeghbe11.jpg","link2801":"https://i.redd.it/bci7y20nopj21.jpg","link2802":"https://i.redd.it/bd2w6etjc5o21.jpg","link2803":"https://i.redd.it/bd391jpzp7531.jpg","link2804":"https://i.redd.it/bd75mx05da341.jpg","link2805":"https://i.redd.it/bevkr9zwwyz21.jpg","link2806":"https://i.redd.it/bey5xzjjiup21.jpg","link2807":"https://i.redd.it/bf8ax8hiegm21.jpg","link2808":"https://i.redd.it/bfb0wnf76r711.jpg","link2809":"https://i.redd.it/bgk98penack31.jpg","link2810":"https://i.redd.it/bhb0ctfxlx831.jpg","link2811":"https://i.redd.it/bhna4l4lkkj21.jpg","link2812":"https://i.redd.it/bhuqamus0bs21.jpg","link2813":"https://i.redd.it/bj2wai962zw21.jpg","link2814":"https://i.redd.it/bjwbl9jpple11.jpg","link2815":"https://i.redd.it/bkc15zonawn21.jpg","link2816":"https://i.redd.it/bkpfx6rri3821.jpg","link2817":"https://i.redd.it/bl61iw2csg241.jpg","link2818":"https://i.redd.it/bl7nunv7bhv21.jpg","link2819":"https://i.redd.it/blisjur0asc31.jpg","link2820":"https://i.redd.it/blpla4r1mw431.jpg","link2821":"https://i.redd.it/blrazem9y0m31.jpg","link2822":"https://i.redd.it/blsm0afiut621.jpg","link2823":"https://i.redd.it/bm71hbw74qw31.jpg","link2824":"https://i.redd.it/bnenziyuhx231.jpg","link2825":"https://i.redd.it/bnrwg7xtduj11.jpg","link2826":"https://i.redd.it/bnstchbndei31.jpg","link2827":"https://i.redd.it/bnz83xjulzj31.jpg","link2828":"https://i.redd.it/bo3snjfqsz631.jpg","link2829":"https://i.redd.it/bouk7ykdofe31.jpg","link2830":"https://i.redd.it/bp7d6lyvh7z21.jpg","link2831":"https://i.redd.it/bq0seme2abr31.jpg","link2832":"https://i.redd.it/br2bxddkvy131.jpg","link2833":"https://i.redd.it/br3kjn2xlel31.jpg","link2834":"https://i.redd.it/br6o4mch4h341.jpg","link2835":"https://i.redd.it/br9ebknxwwv21.jpg","link2836":"https://i.redd.it/brdv9ept3wk21.jpg","link2837":"https://i.redd.it/bsihir55ec541.jpg","link2838":"https://i.redd.it/bsm6sv15a0931.jpg","link2839":"https://i.redd.it/bts5v36yxm541.jpg","link2840":"https://i.redd.it/budhmavei1z21.jpg","link2841":"https://i.redd.it/bueqgv61i8041.jpg","link2842":"https://i.redd.it/bung53yezb341.jpg","link2843":"https://i.redd.it/bv8mdilh3sd21.jpg","link2844":"https://i.redd.it/bvb4suquci111.jpg","link2845":"https://i.redd.it/bvesan9sgo731.jpg","link2846":"https://i.redd.it/bvf8i83lxqs31.jpg","link2847":"https://i.redd.it/bw6kjxtrhw721.jpg","link2848":"https://i.redd.it/bw8gdlezccx11.jpg","link2849":"https://i.redd.it/bwy1awlps4q31.jpg","link2850":"https://i.redd.it/bwz8iutk0gv21.jpg","link2851":"https://i.redd.it/bxm09r1wpgp31.jpg","link2852":"https://i.redd.it/byqcgp2ucl311.jpg","link2853":"https://i.redd.it/bzgra8quyim31.jpg","link2854":"https://i.redd.it/bzkf2xknqew31.jpg","link2855":"https://i.redd.it/c0yc2d80vt621.jpg","link2856":"https://i.redd.it/c13l4wdz3nm31.jpg","link2857":"https://i.redd.it/c1ipga5yu2w21.jpg","link2858":"https://i.redd.it/c1m16lc0gog31.jpg","link2859":"https://i.redd.it/c1p4rao5wlt31.jpg","link2860":"https://i.redd.it/c2fkylfyj3n31.jpg","link2861":"https://i.redd.it/c2qmtng8h4z31.jpg","link2862":"https://i.redd.it/c36q31ocei111.jpg","link2863":"https://i.redd.it/c3galrswti721.jpg","link2864":"https://i.redd.it/c5kmunrpc6541.jpg","link2865":"https://i.redd.it/c5wrowymjn821.jpg","link2866":"https://i.redd.it/c83mwvl5sro21.jpg","link2867":"https://i.redd.it/c8iw0v7uehn31.jpg","link2868":"https://i.redd.it/c8pqfqtdlw041.jpg","link2869":"https://i.redd.it/c8z61g9pac131.jpg","link2870":"https://i.redd.it/ca6ei1o6fv431.jpg","link2871":"https://i.redd.it/cacz4dueo8z31.jpg","link2872":"https://i.redd.it/cb7kx7itjt741.jpg","link2873":"https://i.redd.it/cba1l7miter31.jpg","link2874":"https://i.redd.it/cbzhumxohzc31.jpg","link2875":"https://i.redd.it/ccxji46b6yz21.jpg","link2876":"https://i.redd.it/cd2xi32epif21.jpg","link2877":"https://i.redd.it/cdf81v88jin21.jpg","link2878":"https://i.redd.it/cdmvwz6cjrk31.jpg","link2879":"https://i.redd.it/cdpgbsrh34z21.jpg","link2880":"https://i.redd.it/cdratz7nsoi31.jpg","link2881":"https://i.redd.it/cenfb8sa9nc31.jpg","link2882":"https://i.redd.it/cez41f0xddt21.jpg","link2883":"https://i.redd.it/cf5q4a5p4i731.jpg","link2884":"https://i.redd.it/cfnkd83av4v21.jpg","link2885":"https://i.redd.it/cfwx105aiqp21.jpg","link2886":"https://i.redd.it/ch0gstbr81uz.jpg","link2887":"https://i.redd.it/ch19ioqvudr11.jpg","link2888":"https://i.redd.it/chin5i7cary31.jpg","link2889":"https://i.redd.it/chrvwk1g7w241.jpg","link2890":"https://i.redd.it/ciqdl2atv8pz.jpg","link2891":"https://i.redd.it/cj3qumk0di111.jpg","link2892":"https://i.redd.it/ck5ybmalkp331.jpg","link2893":"https://i.redd.it/ckfwiov1iln11.jpg","link2894":"https://i.redd.it/cltkr3wqwtw21.jpg","link2895":"https://i.redd.it/cmsaiz3u8r231.jpg","link2896":"https://i.redd.it/cmzjfvbgyew21.jpg","link2897":"https://i.redd.it/cn2q8jnh28s31.jpg","link2898":"https://i.redd.it/cnnp8751e8o31.jpg","link2899":"https://i.redd.it/co12z1p2s5331.jpg","link2900":"https://i.redd.it/co77kvxq3io21.jpg","link2901":"https://i.redd.it/cocqs8nk4op11.jpg","link2902":"https://i.redd.it/coy46n5b05441.jpg","link2903":"https://i.redd.it/cpphd2l7e2b31.jpg","link2904":"https://i.redd.it/cq1iduiyp7921.jpg","link2905":"https://i.redd.it/cq385x27e7n31.jpg","link2906":"https://i.redd.it/cqc1erd4o2r21.jpg","link2907":"https://i.redd.it/cqr2qycnzss31.jpg","link2908":"https://i.redd.it/cr3yjuj242a31.jpg","link2909":"https://i.redd.it/cr4gq0iosaz31.jpg","link2910":"https://i.redd.it/crh5m5s5qwt21.jpg","link2911":"https://i.redd.it/crxdfe6qv6n31.jpg","link2912":"https://i.redd.it/cs925ze7vpu31.jpg","link2913":"https://i.redd.it/csf9r1j1r9q21.jpg","link2914":"https://i.redd.it/csmyc4zl1ym21.jpg","link2915":"https://i.redd.it/cxhbuivxvne11.jpg","link2916":"https://i.redd.it/cy85sj9qms741.jpg","link2917":"https://i.redd.it/cybdodn7zxp21.jpg","link2918":"https://i.redd.it/cyfftqlk1fe21.jpg","link2919":"https://i.redd.it/cymkjwgnxfq31.jpg","link2920":"https://i.redd.it/czw43mnpr8331.jpg","link2921":"https://i.redd.it/d0qjxwksnif31.jpg","link2922":"https://i.redd.it/d12p2fhlfd541.jpg","link2923":"https://i.redd.it/d1g69d14s2d21.jpg","link2924":"https://i.redd.it/d2x4iem1af731.jpg","link2925":"https://i.redd.it/d3a8wrdo43831.jpg","link2926":"https://i.redd.it/d4oexaigwq741.jpg","link2927":"https://i.redd.it/d542j5x5frp11.jpg","link2928":"https://i.redd.it/d57zotyude141.jpg","link2929":"https://i.redd.it/d6277m9h3ws11.jpg","link2930":"https://i.redd.it/d67uo8jxag721.jpg","link2931":"https://i.redd.it/d697ruvlzgu21.jpg","link2932":"https://i.redd.it/d6balrnn1f721.jpg","link2933":"https://i.redd.it/d6es5fdxb8l31.jpg","link2934":"https://i.redd.it/d7kqx0hrwtw21.jpg","link2935":"https://i.redd.it/d7qnc8tzx6231.jpg","link2936":"https://i.redd.it/d8pks43tz0y21.jpg","link2937":"https://i.redd.it/d9w7i0elddr31.jpg","link2938":"https://i.redd.it/daj94x3t26s31.jpg","link2939":"https://i.redd.it/daqr9lcbyig21.jpg","link2940":"https://i.redd.it/dbadc0tjxfx31.jpg","link2941":"https://i.redd.it/dc0uu9hhpk841.jpg","link2942":"https://i.redd.it/dc1s5v9drfn01.jpg","link2943":"https://i.redd.it/dc4wa4srnrr11.jpg","link2944":"https://i.redd.it/dccieee5qag31.jpg","link2945":"https://i.redd.it/dcqp736w25c21.jpg","link2946":"https://i.redd.it/ddzflw7v07p31.jpg","link2947":"https://i.redd.it/de4ui7je90r31.jpg","link2948":"https://i.redd.it/dea6d40kioo31.jpg","link2949":"https://i.redd.it/dek98irf2bl31.jpg","link2950":"https://i.redd.it/denuiidjzlu31.jpg","link2951":"https://i.redd.it/depsy91p9uc31.jpg","link2952":"https://i.redd.it/deuvbiuziz131.jpg","link2953":"https://i.redd.it/dezv98y7u0s21.jpg","link2954":"https://i.redd.it/df7oia6qkzq31.jpg","link2955":"https://i.redd.it/dfulgaxe31d31.jpg","link2956":"https://i.redd.it/dfx1pr28gw841.jpg","link2957":"https://i.redd.it/dg7esnrizut21.jpg","link2958":"https://i.redd.it/dirq82t7x3t21.jpg","link2959":"https://i.redd.it/djvc3l3zlo141.jpg","link2960":"https://i.redd.it/dk3iud3f6h131.jpg","link2961":"https://i.redd.it/dkav7s1yssa11.jpg","link2962":"https://i.redd.it/dkb5uejzprb31.jpg","link2963":"https://i.redd.it/dkl1cbua47431.jpg","link2964":"https://i.redd.it/dllr5mjh3vf31.jpg","link2965":"https://i.redd.it/dlpj1h21h7231.jpg","link2966":"https://i.redd.it/dm1ms5sbatg31.jpg","link2967":"https://i.redd.it/dm470rjyirp21.jpg","link2968":"https://i.redd.it/dn4vh43g6gz21.jpg","link2969":"https://i.redd.it/dn8nc8x3iva21.jpg","link2970":"https://i.redd.it/dnh64iryxhb31.jpg","link2971":"https://i.redd.it/dnoalug80uy21.jpg","link2972":"https://i.redd.it/dofj9ehy7z441.jpg","link2973":"https://i.redd.it/doll2qiz12c11.jpg","link2974":"https://i.redd.it/dou2y666m0o21.jpg","link2975":"https://i.redd.it/doy4fy8sf9n31.jpg","link2976":"https://i.redd.it/dp4p59kqwtp21.jpg","link2977":"https://i.redd.it/dp7ex7hw6jk21.jpg","link2978":"https://i.redd.it/dpakn86149821.jpg","link2979":"https://i.redd.it/dpgldy8n4ug21.jpg","link2980":"https://i.redd.it/dq7dgj8b8vk31.jpg","link2981":"https://i.redd.it/dqfizbza10t31.jpg","link2982":"https://i.redd.it/dsfnrx2rwtw21.jpg","link2983":"https://i.redd.it/dt9dbbac4zt31.jpg","link2984":"https://i.redd.it/dtfu4j6j47631.jpg","link2985":"https://i.redd.it/dtgeacl3vnz31.jpg","link2986":"https://i.redd.it/du2gdyuool631.jpg","link2987":"https://i.redd.it/dv381j24umt21.jpg","link2988":"https://i.redd.it/dvj1yoax8gh21.jpg","link2989":"https://i.redd.it/dvvmgh8iqk531.jpg","link2990":"https://i.redd.it/dw1nrrcu8rw31.jpg","link2991":"https://i.redd.it/dwbwpezdssk21.jpg","link2992":"https://i.redd.it/dwi51cknmgo21.jpg","link2993":"https://i.redd.it/dwrzq3rd7dy31.jpg","link2994":"https://i.redd.it/dxrdslip5ta31.jpg","link2995":"https://i.redd.it/dyauv2703mu31.jpg","link2996":"https://i.redd.it/dybk4uqrz9a11.jpg","link2997":"https://i.redd.it/dypm6vy5tko21.jpg","link2998":"https://i.redd.it/dz7yu3j5tsh21.jpg","link2999":"https://i.redd.it/e00ogq5aori31.jpg","link3000":"https://i.redd.it/e011aldmpa141.jpg","link3001":"https://i.redd.it/e0tx9pf2gps21.jpg","link3002":"https://i.redd.it/e0yd5vajrlx11.jpg","link3003":"https://i.redd.it/e11plnsiqe721.jpg","link3004":"https://i.redd.it/e1lpg7112d621.jpg","link3005":"https://i.redd.it/e1tviurnvhp31.jpg","link3006":"https://i.redd.it/e3a89xirwtw21.jpg","link3007":"https://i.redd.it/e4cakn5gg0q31.jpg","link3008":"https://i.redd.it/e4k188l08st21.jpg","link3009":"https://i.redd.it/e4lmmwxfe5d31.jpg","link3010":"https://i.redd.it/e51uuwen0eg31.jpg","link3011":"https://i.redd.it/e61hypnz3os31.jpg","link3012":"https://i.redd.it/e631zmq6f2821.jpg","link3013":"https://i.redd.it/e67nvqj2ci111.jpg","link3014":"https://i.redd.it/e6ssytnkgke11.jpg","link3015":"https://i.redd.it/e6uzf1d1cee31.jpg","link3016":"https://i.redd.it/e6xe1oiaubp31.jpg","link3017":"https://i.redd.it/e76mbmagxrs31.jpg","link3018":"https://i.redd.it/e7d0zlgaivc21.jpg","link3019":"https://i.redd.it/e837cxiz8bs31.jpg","link3020":"https://i.redd.it/e89sv724dje31.jpg","link3021":"https://i.redd.it/e9tekkh2pn641.jpg","link3022":"https://i.redd.it/ea3buu2mh9031.jpg","link3023":"https://i.redd.it/eal2gkgeork21.jpg","link3024":"https://i.redd.it/eanbmyx1yac31.jpg","link3025":"https://i.redd.it/eb7oickfwbe31.jpg","link3026":"https://i.redd.it/ebn7wadjzqp31.jpg","link3027":"https://i.redd.it/ebtrwey9wfv21.jpg","link3028":"https://i.redd.it/ecambacjr0r21.jpg","link3029":"https://i.redd.it/edd6a6kuwul21.jpg","link3030":"https://i.redd.it/edwfoneq9o131.jpg","link3031":"https://i.redd.it/eeouv8519d621.jpg","link3032":"https://i.redd.it/eeudwau8aev21.jpg","link3033":"https://i.redd.it/eey82fdgfq521.jpg","link3034":"https://i.redd.it/efwiigk42di21.jpg","link3035":"https://i.redd.it/ehdl2myjnex31.jpg","link3036":"https://i.redd.it/ehdxi6bluf221.jpg","link3037":"https://i.redd.it/ehwn2eargq441.jpg","link3038":"https://i.redd.it/ei84838oujf31.jpg","link3039":"https://i.redd.it/eikld414ofx21.jpg","link3040":"https://i.redd.it/ej1sqyi05qb31.jpg","link3041":"https://i.redd.it/ej5sl6ab9r621.jpg","link3042":"https://i.redd.it/ejajlrxmlv341.jpg","link3043":"https://i.redd.it/ejia4u8ze2641.jpg","link3044":"https://i.redd.it/ekwpgby3e5f21.jpg","link3045":"https://i.redd.it/em0enlil2x721.jpg","link3046":"https://i.redd.it/emrla78uwr701.jpg","link3047":"https://i.redd.it/enarjxnzopg31.jpg","link3048":"https://i.redd.it/eo36nb217lp21.jpg","link3049":"https://i.redd.it/eo4i47e61bg31.jpg","link3050":"https://i.redd.it/eod7ymhdp4o11.jpg","link3051":"https://i.redd.it/eot1wg1r4yy31.jpg","link3052":"https://i.redd.it/eptvu1v5cwh31.jpg","link3053":"https://i.redd.it/erc737udpc531.jpg","link3054":"https://i.redd.it/es4223qbbm431.jpg","link3055":"https://i.redd.it/esfqc0s9w0041.jpg","link3056":"https://i.redd.it/etdc2b1u44041.jpg","link3057":"https://i.redd.it/ethpm7zho2441.jpg","link3058":"https://i.redd.it/etlsfcmqqso31.jpg","link3059":"https://i.redd.it/eu83dknl22s21.jpg","link3060":"https://i.redd.it/ev7kqoay7f841.jpg","link3061":"https://i.redd.it/evb89fyc0xe11.jpg","link3062":"https://i.redd.it/evqtz49jxog31.jpg","link3063":"https://i.redd.it/ewy2y462yro31.jpg","link3064":"https://i.redd.it/exlpnkvish241.jpg","link3065":"https://i.redd.it/exphgxxjdqo21.jpg","link3066":"https://i.redd.it/exzz66utw2131.jpg","link3067":"https://i.redd.it/ey6cy0kipse21.jpg","link3068":"https://i.redd.it/ey8v14cl8vu31.jpg","link3069":"https://i.redd.it/ez8r2da784l31.jpg","link3070":"https://i.redd.it/ez9zqk97swi21.jpg","link3071":"https://i.redd.it/ezdbwfoprb031.jpg","link3072":"https://i.redd.it/f0rzgvn9cj331.jpg","link3073":"https://i.redd.it/f0z28meutml31.jpg","link3074":"https://i.redd.it/f1rv4uxm2mm21.jpg","link3075":"https://i.redd.it/f1ydtsdhzqn21.jpg","link3076":"https://i.redd.it/f1z2orla5sa21.jpg","link3077":"https://i.redd.it/f23dzfd8z8s21.jpg","link3078":"https://i.redd.it/f2868thuvf131.jpg","link3079":"https://i.redd.it/f2cbd2zsiur21.jpg","link3080":"https://i.redd.it/f2lu5h5u7lt11.jpg","link3081":"https://i.redd.it/f3pmv3y6fu621.jpg","link3082":"https://i.redd.it/f41diure43721.jpg","link3083":"https://i.redd.it/f494sjwbur031.jpg","link3084":"https://i.redd.it/f4s4uhv49nm21.jpg","link3085":"https://i.redd.it/f4y4wgw5vuq31.jpg","link3086":"https://i.redd.it/f5eh4t7h5am31.jpg","link3087":"https://i.redd.it/f5ywpclb8h441.jpg","link3088":"https://i.redd.it/f62zq8ik5l641.jpg","link3089":"https://i.redd.it/f7hyb9hu6az21.jpg","link3090":"https://i.redd.it/f7xjcw81fz541.jpg","link3091":"https://i.redd.it/f80ghkpwnxf31.jpg","link3092":"https://i.redd.it/f8k19hh771d11.jpg","link3093":"https://i.redd.it/f8mk0cptm3s21.jpg","link3094":"https://i.redd.it/f9wjf66y72c11.jpg","link3095":"https://i.redd.it/fa8ud587az701.jpg","link3096":"https://i.redd.it/fbqxp5azpax21.jpg","link3097":"https://i.redd.it/fcynbssb6qc21.jpg","link3098":"https://i.redd.it/fd0ywf4h14r21.jpg","link3099":"https://i.redd.it/fdo72sn01kx31.jpg","link3100":"https://i.redd.it/fdpj2r45mi621.jpg","link3101":"https://i.redd.it/fdrlu0ip12e21.jpg","link3102":"https://i.redd.it/feimdjvv6yo21.jpg","link3103":"https://i.redd.it/fftjckvjvk131.jpg","link3104":"https://i.redd.it/ffwfvf8cqd321.jpg","link3105":"https://i.redd.it/fg4dp0gqgf041.jpg","link3106":"https://i.redd.it/fg66g3vj9xx31.jpg","link3107":"https://i.redd.it/fhjo2vo21l431.jpg","link3108":"https://i.redd.it/fimsryhsh9431.jpg","link3109":"https://i.redd.it/fizp3t8e0hw21.jpg","link3110":"https://i.redd.it/fko5fr3jy7731.jpg","link3111":"https://i.redd.it/fkul64kg09831.jpg","link3112":"https://i.redd.it/flakv3kg8qi31.jpg","link3113":"https://i.redd.it/flhksfsot0031.jpg","link3114":"https://i.redd.it/fmw8gddcmmw21.jpg","link3115":"https://i.redd.it/fn3sgwhbl1631.jpg","link3116":"https://i.redd.it/fn8hqnc9psj21.jpg","link3117":"https://i.redd.it/fo9jwjrg83s31.jpg","link3118":"https://i.redd.it/foeob0ycymv01.jpg","link3119":"https://i.redd.it/fpqj06c03ab31.jpg","link3120":"https://i.redd.it/fq2um9czc3d31.jpg","link3121":"https://i.redd.it/fqxdkqasthd31.jpg","link3122":"https://i.redd.it/fr5yrpji75m21.jpg","link3123":"https://i.redd.it/frv5f1g5txn21.jpg","link3124":"https://i.redd.it/fsfedeqlwko21.jpg","link3125":"https://i.redd.it/fte61wdvnx131.jpg","link3126":"https://i.redd.it/furwhpwvpi721.jpg","link3127":"https://i.redd.it/fusg7llz52c11.jpg","link3128":"https://i.redd.it/fvexyujeu5t21.jpg","link3129":"https://i.redd.it/fxlp4x7ev5401.jpg","link3130":"https://i.redd.it/fxza8ne45mq21.jpg","link3131":"https://i.redd.it/fy0h37jabi111.jpg","link3132":"https://i.redd.it/fy5g90ee5a041.jpg","link3133":"https://i.redd.it/fy8hpiknxfy31.jpg","link3134":"https://i.redd.it/fygxsu47bmy31.jpg","link3135":"https://i.redd.it/fyp22qn326r11.jpg","link3136":"https://i.redd.it/fyqbpg0skcm21.jpg","link3137":"https://i.redd.it/fzfw4m8wdn131.jpg","link3138":"https://i.redd.it/fzo25jp6nop21.jpg","link3139":"https://i.redd.it/fzu4q7kaol931.jpg","link3140":"https://i.redd.it/fzuz3av12c531.jpg","link3141":"https://i.redd.it/g02k8cs7clr31.jpg","link3142":"https://i.redd.it/g1ebnpxkuq011.jpg","link3143":"https://i.redd.it/g1tmcwdkj8f21.jpg","link3144":"https://i.redd.it/g254jfcz56s21.jpg","link3145":"https://i.redd.it/g293tl51w5u21.jpg","link3146":"https://i.redd.it/g2qj0cjuc4q31.jpg","link3147":"https://i.redd.it/g3ix3t11l3x31.jpg","link3148":"https://i.redd.it/g3mxcs7m1mz21.jpg","link3149":"https://i.redd.it/g4d3a5smv7741.jpg","link3150":"https://i.redd.it/g4fzvr2k5xf31.jpg","link3151":"https://i.redd.it/g5bwwex6uwu21.jpg","link3152":"https://i.redd.it/g5srtrlbaff11.jpg","link3153":"https://i.redd.it/g5xx6kv49rz31.jpg","link3154":"https://i.redd.it/g61skcxdtb441.jpg","link3155":"https://i.redd.it/g6xm62rn7ba01.jpg","link3156":"https://i.redd.it/g77b11av02x01.jpg","link3157":"https://i.redd.it/g786bq0a82c11.jpg","link3158":"https://i.redd.it/g84dh2cqtcr11.jpg","link3159":"https://i.redd.it/g85c5t942zs31.jpg","link3160":"https://i.redd.it/g8gc4rb23pc31.jpg","link3161":"https://i.redd.it/g8qulvz2a1p21.jpg","link3162":"https://i.redd.it/g8x7zha4aqi21.jpg","link3163":"https://i.redd.it/g9riw4nm23g31.jpg","link3164":"https://i.redd.it/gacimo31anq31.jpg","link3165":"https://i.redd.it/gaqom8lrsd641.jpg","link3166":"https://i.redd.it/gb45gfqctye21.jpg","link3167":"https://i.redd.it/gc4gdw4t5nb11.jpg","link3168":"https://i.redd.it/gclorbyjyra31.jpg","link3169":"https://i.redd.it/gcmcdjtw58241.jpg","link3170":"https://i.redd.it/gcw4qznynf731.jpg","link3171":"https://i.redd.it/gdw40gdf9bt21.jpg","link3172":"https://i.redd.it/ge6ysfj8pdd21.jpg","link3173":"https://i.redd.it/geddv8vkapf11.jpg","link3174":"https://i.redd.it/genaa5c265h21.jpg","link3175":"https://i.redd.it/gffbtl0i3za21.jpg","link3176":"https://i.redd.it/gg0qal313fp31.jpg","link3177":"https://i.redd.it/ggfbvee1xph31.jpg","link3178":"https://i.redd.it/ggibfdg47d141.jpg","link3179":"https://i.redd.it/ggsetvpr1mr11.jpg","link3180":"https://i.redd.it/gjbcuxvnqtf11.jpg","link3181":"https://i.redd.it/gjcloaxn1d741.jpg","link3182":"https://i.redd.it/gju5e0puj2821.jpg","link3183":"https://i.redd.it/gk0yrazl9mk31.jpg","link3184":"https://i.redd.it/gkkvamv9xul21.jpg","link3185":"https://i.redd.it/gliixak5yz231.jpg","link3186":"https://i.redd.it/gliz83p8rx031.jpg","link3187":"https://i.redd.it/gloiopftsvx31.jpg","link3188":"https://i.redd.it/gm2ccnxj8y731.jpg","link3189":"https://i.redd.it/gna84c4c8n141.jpg","link3190":"https://i.redd.it/gnfnsv6fa7m21.jpg","link3191":"https://i.redd.it/gp61td5j2bj21.jpg","link3192":"https://i.redd.it/gq114ey06rf11.jpg","link3193":"https://i.redd.it/gqaqcm8dg6831.jpg","link3194":"https://i.redd.it/grol8wqrwdg31.jpg","link3195":"https://i.redd.it/grxxn9pgyz441.jpg","link3196":"https://i.redd.it/gsmnygqp34241.jpg","link3197":"https://i.redd.it/gt8k73uvmc731.jpg","link3198":"https://i.redd.it/gtcna9ia26j31.jpg","link3199":"https://i.redd.it/gtk6zk9bdzm21.jpg","link3200":"https://i.redd.it/gtugsgl3h0731.jpg","link3201":"https://i.redd.it/gu4r2e901xs21.jpg","link3202":"https://i.redd.it/gujkhp5cqrs11.jpg","link3203":"https://i.redd.it/gulu7yv8cwf11.jpg","link3204":"https://i.redd.it/guqga06274x31.jpg","link3205":"https://i.redd.it/guz723dh3ql21.jpg","link3206":"https://i.redd.it/gvff1ctqavb31.jpg","link3207":"https://i.redd.it/gvxjg7fuzrr31.jpg","link3208":"https://i.redd.it/gxd1do2l6z531.jpg","link3209":"https://i.redd.it/gxjuqf8towx31.jpg","link3210":"https://i.redd.it/gxz9pn963sm31.jpg","link3211":"https://i.redd.it/gy6kxsp6qqp31.jpg","link3212":"https://i.redd.it/gygbu1bq5fp21.jpg","link3213":"https://i.redd.it/gylqkldorrg21.jpg","link3214":"https://i.redd.it/gz7cj7eze1x21.jpg","link3215":"https://i.redd.it/gze1937mg3q01.jpg","link3216":"https://i.redd.it/gzxzlfsq6z441.jpg","link3217":"https://i.redd.it/h0488ex2no441.jpg","link3218":"https://i.redd.it/h0nasks9x4a21.jpg","link3219":"https://i.redd.it/h25475epaqu21.jpg","link3220":"https://i.redd.it/h2g0e2g777d11.jpg","link3221":"https://i.redd.it/h2i2hu2qvyc11.jpg","link3222":"https://i.redd.it/h2vkx2aszw641.jpg","link3223":"https://i.redd.it/h3hfbrgh8ev21.jpg","link3224":"https://i.redd.it/h3yoe8or72c11.jpg","link3225":"https://i.redd.it/h4iqzr5g72c11.jpg","link3226":"https://i.redd.it/h4sez6ky6wq21.jpg","link3227":"https://i.redd.it/h4uiawr1ua041.jpg","link3228":"https://i.redd.it/h57p79kwk8f11.jpg","link3229":"https://i.redd.it/h5aogw4i7au21.jpg","link3230":"https://i.redd.it/h5ogd5lmr1i21.jpg","link3231":"https://i.redd.it/h60bt50z7pw21.jpg","link3232":"https://i.redd.it/h60sf33pdbt21.jpg","link3233":"https://i.redd.it/h75h6mbaa7p21.jpg","link3234":"https://i.redd.it/h7ueuolu0l831.jpg","link3235":"https://i.redd.it/h7vi4ob5qiy31.jpg","link3236":"https://i.redd.it/h8265dvzlt441.jpg","link3237":"https://i.redd.it/h8307khois031.jpg","link3238":"https://i.redd.it/h8vlht49ch911.jpg","link3239":"https://i.redd.it/h9vxb3aonr541.jpg","link3240":"https://i.redd.it/havsjsoxi5931.jpg","link3241":"https://i.redd.it/hc511khngvj21.jpg","link3242":"https://i.redd.it/hceoof2t1hr31.jpg","link3243":"https://i.redd.it/hcuc57awtsu21.jpg","link3244":"https://i.redd.it/hdfw26vcl7f21.jpg","link3245":"https://i.redd.it/hdt2ntb25d031.jpg","link3246":"https://i.redd.it/hduispuxm4831.jpg","link3247":"https://i.redd.it/hdyml0z36gc31.jpg","link3248":"https://i.redd.it/hf2mxoniths31.jpg","link3249":"https://i.redd.it/hftlx3lg0cs21.jpg","link3250":"https://i.redd.it/hgaepd3k0f931.jpg","link3251":"https://i.redd.it/hgjhacapwsz21.jpg","link3252":"https://i.redd.it/hgnp2e2jq3l21.jpg","link3253":"https://i.redd.it/hh1ih9n9ei111.jpg","link3254":"https://i.redd.it/hh2jm2g6msm31.jpg","link3255":"https://i.redd.it/hh6dee3lflf31.jpg","link3256":"https://i.redd.it/hhaa956rmlw21.jpg","link3257":"https://i.redd.it/hhbylhp6dbw31.jpg","link3258":"https://i.redd.it/hidv76zgei111.jpg","link3259":"https://i.redd.it/hjhd9nq6deb21.jpg","link3260":"https://i.redd.it/hjo28ikjgbe11.jpg","link3261":"https://i.redd.it/hk22o393a1441.jpg","link3262":"https://i.redd.it/hk315707e6w31.jpg","link3263":"https://i.redd.it/hkqyi6sklr531.jpg","link3264":"https://i.redd.it/ho983xgdums21.jpg","link3265":"https://i.redd.it/hoiofz0dgpj21.jpg","link3266":"https://i.redd.it/howxkho5ye131.jpg","link3267":"https://i.redd.it/hp3b5600wj341.jpg","link3268":"https://i.redd.it/hp7paf7ddb841.jpg","link3269":"https://i.redd.it/hq5tgoqrxx341.jpg","link3270":"https://i.redd.it/hs2y7a8vadp31.jpg","link3271":"https://i.redd.it/hskmgay27fd21.jpg","link3272":"https://i.redd.it/hsxk9pa9pbz11.jpg","link3273":"https://i.redd.it/htbms1digd741.jpg","link3274":"https://i.redd.it/hu7jyz3khy821.jpg","link3275":"https://i.redd.it/hupb8q9q1nh21.jpg","link3276":"https://i.redd.it/hupxfz4268i21.jpg","link3277":"https://i.redd.it/huwnt9dsc7y21.jpg","link3278":"https://i.redd.it/hvaz6zhlfqh31.jpg","link3279":"https://i.redd.it/hvguzxbg0l541.jpg","link3280":"https://i.redd.it/hvzftxsaqas21.jpg","link3281":"https://i.redd.it/hw3xsq4x0yq31.jpg","link3282":"https://i.redd.it/hxkhc330qax21.jpg","link3283":"https://i.redd.it/hxphyeff9yx21.jpg","link3284":"https://i.redd.it/hyfynzwzppr31.jpg","link3285":"https://i.redd.it/i017ir7t2ka31.jpg","link3286":"https://i.redd.it/i0z50ezvrlu31.jpg","link3287":"https://i.redd.it/i2h9gdg4v8241.jpg","link3288":"https://i.redd.it/i2y0sh6j7a441.jpg","link3289":"https://i.redd.it/i38qvs85nhz31.jpg","link3290":"https://i.redd.it/i4ajx4ukcph21.jpg","link3291":"https://i.redd.it/i4k2okfzakx31.jpg","link3292":"https://i.redd.it/i53bh45d0zj21.jpg","link3293":"https://i.redd.it/i5mt37i3vkv21.jpg","link3294":"https://i.redd.it/i5yl5nv56r621.jpg","link3295":"https://i.redd.it/i6hcw40molw21.jpg","link3296":"https://i.redd.it/i6j4f6gume331.jpg","link3297":"https://i.redd.it/i6ld247c5e841.jpg","link3298":"https://i.redd.it/i6xq2g3oax541.jpg","link3299":"https://i.redd.it/i7bhxn2dk8f31.jpg","link3300":"https://i.redd.it/i7blkp7xlxj31.jpg","link3301":"https://i.redd.it/i9t4a5rigan31.jpg","link3302":"https://i.redd.it/iaiw4ebv46241.jpg","link3303":"https://i.redd.it/ib9xhxhpj3d11.jpg","link3304":"https://i.redd.it/icictwafkc721.jpg","link3305":"https://i.redd.it/id2s5umgdft31.jpg","link3306":"https://i.redd.it/ie5ygqdogh241.jpg","link3307":"https://i.redd.it/iex8e7upq9421.jpg","link3308":"https://i.redd.it/ifb6tzz2e7r31.jpg","link3309":"https://i.redd.it/igc8zkj2scz31.jpg","link3310":"https://i.redd.it/iguk311q7jv31.jpg","link3311":"https://i.redd.it/ih9uubnct1221.jpg","link3312":"https://i.redd.it/ihexojagq1b31.jpg","link3313":"https://i.redd.it/ihi4zlquu8pz.jpg","link3314":"https://i.redd.it/ihtwuqygyjf21.jpg","link3315":"https://i.redd.it/ii10j89qede21.jpg","link3316":"https://i.redd.it/ijzlqhka1u241.jpg","link3317":"https://i.redd.it/ik6csi9c5b741.jpg","link3318":"https://i.redd.it/ilapjfdj6yq21.jpg","link3319":"https://i.redd.it/imftdvx5ci111.jpg","link3320":"https://i.redd.it/imsxxvoypjm31.jpg","link3321":"https://i.redd.it/in2k1x6apyi21.jpg","link3322":"https://i.redd.it/iniv2q10ei111.jpg","link3323":"https://i.redd.it/ioiudoqhptw21.jpg","link3324":"https://i.redd.it/ipqeu5m0ggs21.jpg","link3325":"https://i.redd.it/iq4ef05pcpo11.jpg","link3326":"https://i.redd.it/iq50q9qh9i321.jpg","link3327":"https://i.redd.it/iq9495cktzr31.jpg","link3328":"https://i.redd.it/iqd44lsx4s511.jpg","link3329":"https://i.redd.it/iqhzuc9xmt841.jpg","link3330":"https://i.redd.it/iqulugz736721.jpg","link3331":"https://i.redd.it/irqy9e4fzm921.jpg","link3332":"https://i.redd.it/isbotc8s82131.jpg","link3333":"https://i.redd.it/iuoaz7h4nfz31.jpg","link3334":"https://i.redd.it/iv9vkhmxx9441.jpg","link3335":"https://i.redd.it/ivsrvtrya9m21.jpg","link3336":"https://i.redd.it/ivusm76vbfm31.jpg","link3337":"https://i.redd.it/iwrqp02e2dd21.jpg","link3338":"https://i.redd.it/iwsxrh41f5h31.jpg","link3339":"https://i.redd.it/ixucgs11yvl21.jpg","link3340":"https://i.redd.it/iy7tgfdhjde11.jpg","link3341":"https://i.redd.it/iyjol2mk99s21.jpg","link3342":"https://i.redd.it/iytt5z85x9v21.jpg","link3343":"https://i.redd.it/izhwlypkdx631.jpg","link3344":"https://i.redd.it/izlififp95f21.jpg","link3345":"https://i.redd.it/j06mhecygaw31.jpg","link3346":"https://i.redd.it/j0ycycdmydp31.jpg","link3347":"https://i.redd.it/j18jb6m6i7541.jpg","link3348":"https://i.redd.it/j18o2ng6am531.jpg","link3349":"https://i.redd.it/j1ptwfstoaw31.jpg","link3350":"https://i.redd.it/j1rtwmstleq31.jpg","link3351":"https://i.redd.it/j22dayhp2px31.jpg","link3352":"https://i.redd.it/j41ubniq4v521.jpg","link3353":"https://i.redd.it/j489x8rnfxd31.jpg","link3354":"https://i.redd.it/j5ag8ahmxui11.jpg","link3355":"https://i.redd.it/j5d6qk3p7qe31.jpg","link3356":"https://i.redd.it/j66k642a05y11.jpg","link3357":"https://i.redd.it/j7342yzupkd11.jpg","link3358":"https://i.redd.it/j83dx7kd3ig31.jpg","link3359":"https://i.redd.it/j8yz6siv07d31.jpg","link3360":"https://i.redd.it/j8zg6pg8a8t31.jpg","link3361":"https://i.redd.it/j90hzy5qfm141.jpg","link3362":"https://i.redd.it/j93ofunovxr31.jpg","link3363":"https://i.redd.it/j98y0fkz2zc21.jpg","link3364":"https://i.redd.it/j9j5qa8iudn21.jpg","link3365":"https://i.redd.it/j9pztw3yxib31.jpg","link3366":"https://i.redd.it/j9z8aesvek431.jpg","link3367":"https://i.redd.it/jbpv3gg5t3u31.jpg","link3368":"https://i.redd.it/jby4kz233yz31.jpg","link3369":"https://i.redd.it/jcoxxazw73931.jpg","link3370":"https://i.redd.it/jcykd8f4e9521.jpg","link3371":"https://i.redd.it/jdnwwfh1ayc31.jpg","link3372":"https://i.redd.it/jfwui1wmy0031.jpg","link3373":"https://i.redd.it/jg5kpjlak1521.jpg","link3374":"https://i.redd.it/jgs7bs9kmyb11.jpg","link3375":"https://i.redd.it/jh44qrqay0841.jpg","link3376":"https://i.redd.it/ji52cbvzsnv31.jpg","link3377":"https://i.redd.it/jicpbjs0sr131.jpg","link3378":"https://i.redd.it/jiwdgrbu0ej31.jpg","link3379":"https://i.redd.it/jiyea4t1fa221.jpg","link3380":"https://i.redd.it/jjdqxtbheyy21.jpg","link3381":"https://i.redd.it/jjyr9d3hxa131.jpg","link3382":"https://i.redd.it/jko7m29lzvj21.jpg","link3383":"https://i.redd.it/jl2mpsimkdb31.jpg","link3384":"https://i.redd.it/jmpnb7ywmt421.jpg","link3385":"https://i.redd.it/jmt7mt0dfpu21.jpg","link3386":"https://i.redd.it/jn36bdpl1kf31.jpg","link3387":"https://i.redd.it/jnacq59pn6741.jpg","link3388":"https://i.redd.it/jnbxyd1nuzk31.jpg","link3389":"https://i.redd.it/jnhj5366k9131.jpg","link3390":"https://i.redd.it/jnl4hzlmr8431.jpg","link3391":"https://i.redd.it/jnysfpsxms641.jpg","link3392":"https://i.redd.it/jp9804b2clu31.jpg","link3393":"https://i.redd.it/jq2elwzzs8l21.jpg","link3394":"https://i.redd.it/jqm96j33ol131.jpg","link3395":"https://i.redd.it/jrf1l2fewkn21.jpg","link3396":"https://i.redd.it/jrgjzayjrm541.jpg","link3397":"https://i.redd.it/jry39mv9irr31.jpg","link3398":"https://i.redd.it/js8h67mtdkj21.jpg","link3399":"https://i.redd.it/jsd6u0a7asz31.jpg","link3400":"https://i.redd.it/jsfl1n07r1v21.jpg","link3401":"https://i.redd.it/jsmtv7nw25r31.jpg","link3402":"https://i.redd.it/juc3kydr62841.jpg","link3403":"https://i.redd.it/jufr05ftjpr31.jpg","link3404":"https://i.redd.it/jul7ubl6yxz31.jpg","link3405":"https://i.redd.it/jv8x74v2goc21.jpg","link3406":"https://i.redd.it/jvkjbe241nt21.jpg","link3407":"https://i.redd.it/jwx2rlki8sj21.jpg","link3408":"https://i.redd.it/jy4pbrcjui831.jpg","link3409":"https://i.redd.it/jyhatr1uee831.jpg","link3410":"https://i.redd.it/jyk2wi2gapu11.jpg","link3411":"https://i.redd.it/jyz10ygj87h31.jpg","link3412":"https://i.redd.it/jzfp5k2bpy541.jpg","link3413":"https://i.redd.it/jzs1be62s8531.jpg","link3414":"https://i.redd.it/jzuoi5zjzz331.jpg","link3415":"https://i.redd.it/k00nbwh7pxr21.jpg","link3416":"https://i.redd.it/k1cxlbc3qd441.jpg","link3417":"https://i.redd.it/k1p270ybvu141.jpg","link3418":"https://i.redd.it/k1us3gtstrd21.jpg","link3419":"https://i.redd.it/k28ujfx7tf231.jpg","link3420":"https://i.redd.it/k3378epsitl21.jpg","link3421":"https://i.redd.it/k5huwea3fnh31.jpg","link3422":"https://i.redd.it/k5xyvolj2fr31.jpg","link3423":"https://i.redd.it/k6anbkhuf2j21.jpg","link3424":"https://i.redd.it/k6h5ojej24e31.jpg","link3425":"https://i.redd.it/k6s2t8z0tsi31.jpg","link3426":"https://i.redd.it/k70wcc326m031.jpg","link3427":"https://i.redd.it/k7dj9sym9f141.jpg","link3428":"https://i.redd.it/k7e3adry03041.jpg","link3429":"https://i.redd.it/k8587clo5in21.jpg","link3430":"https://i.redd.it/k8ralq1m4zv31.jpg","link3431":"https://i.redd.it/k9fbnlofywn31.jpg","link3432":"https://i.redd.it/k9mc51h33u631.jpg","link3433":"https://i.redd.it/k9moatqg7jr21.jpg","link3434":"https://i.redd.it/kb3hbofaaej31.jpg","link3435":"https://i.redd.it/kblsuv00jin21.jpg","link3436":"https://i.redd.it/kcgmtqad66041.jpg","link3437":"https://i.redd.it/kdknivv203k21.jpg","link3438":"https://i.redd.it/kemey9v5wr531.jpg","link3439":"https://i.redd.it/keyrjyfw45x11.jpg","link3440":"https://i.redd.it/kfodynst2eq31.jpg","link3441":"https://i.redd.it/kfv4jg4ngx141.jpg","link3442":"https://i.redd.it/kg46fsq2ozm21.jpg","link3443":"https://i.redd.it/kg5xvwsb1s611.jpg","link3444":"https://i.redd.it/kgh98qstqpr31.jpg","link3445":"https://i.redd.it/kgjoe751l8j31.jpg","link3446":"https://i.redd.it/kh49tehduf041.jpg","link3447":"https://i.redd.it/kh55zb3o12c11.jpg","link3448":"https://i.redd.it/khjzhnjkplg31.jpg","link3449":"https://i.redd.it/kht6vdb9ijt21.jpg","link3450":"https://i.redd.it/ki6gkkgh7rq31.jpg","link3451":"https://i.redd.it/kifvm0irtlh31.jpg","link3452":"https://i.redd.it/kjrkwkhxijd31.jpg","link3453":"https://i.redd.it/kjxbor72ye131.jpg","link3454":"https://i.redd.it/kjzx3bej0qt21.jpg","link3455":"https://i.redd.it/kkocjaqbnm931.jpg","link3456":"https://i.redd.it/kl7y6ip5yad31.jpg","link3457":"https://i.redd.it/klahl0e04js21.jpg","link3458":"https://i.redd.it/km0lgy6zk3m31.jpg","link3459":"https://i.redd.it/kmtjy25e8at11.jpg","link3460":"https://i.redd.it/kn8p8od6mfy21.jpg","link3461":"https://i.redd.it/knbq97tefix21.jpg","link3462":"https://i.redd.it/kni5thvz4gz31.jpg","link3463":"https://i.redd.it/knqvrd04af441.jpg","link3464":"https://i.redd.it/knzfoy0qd0231.jpg","link3465":"https://i.redd.it/ko3uogiqrjl31.jpg","link3466":"https://i.redd.it/kocf4hoh3z841.jpg","link3467":"https://i.redd.it/kpopeq5zzwe11.jpg","link3468":"https://i.redd.it/kptknkfsd9p21.jpg","link3469":"https://i.redd.it/kq9aiuhajvs21.jpg","link3470":"https://i.redd.it/kqu59y2erzl21.jpg","link3471":"https://i.redd.it/kr8s2jgb5az31.jpg","link3472":"https://i.redd.it/krkt887y73l31.jpg","link3473":"https://i.redd.it/ksssvfrsrue31.jpg","link3474":"https://i.redd.it/kt0m2zfu8gk31.jpg","link3475":"https://i.redd.it/ku4kf5prtm341.jpg","link3476":"https://i.redd.it/kvisf7wrfo821.jpg","link3477":"https://i.redd.it/kw2bke2z9mq21.jpg","link3478":"https://i.redd.it/kw4la042dat21.jpg","link3479":"https://i.redd.it/kw5rieuoji841.jpg","link3480":"https://i.redd.it/kwom7xcgnlm21.jpg","link3481":"https://i.redd.it/kx1zhe7mrfz21.jpg","link3482":"https://i.redd.it/kxbkfawiqlw31.jpg","link3483":"https://i.redd.it/kxiyd6ql18n31.jpg","link3484":"https://i.redd.it/kxnlfo4p18r31.jpg","link3485":"https://i.redd.it/kxuw8wmqnak21.jpg","link3486":"https://i.redd.it/kyskriy2stf11.jpg","link3487":"https://i.redd.it/kze9c4lo54b31.jpg","link3488":"https://i.redd.it/l007e7txrlu21.jpg","link3489":"https://i.redd.it/l0b02lhnb3631.jpg","link3490":"https://i.redd.it/l0mrjabyq9r21.jpg","link3491":"https://i.redd.it/l12mqdlls9541.jpg","link3492":"https://i.redd.it/l1ik4o49mub21.jpg","link3493":"https://i.redd.it/l24wosjwbwt21.jpg","link3494":"https://i.redd.it/l2jtmusdxsc11.jpg","link3495":"https://i.redd.it/l2ns5us3fx831.jpg","link3496":"https://i.redd.it/l3fce7p9jtr21.jpg","link3497":"https://i.redd.it/l3ya7tejo4821.jpg","link3498":"https://i.redd.it/l68k8ht588c31.jpg","link3499":"https://i.redd.it/l6l2nob0ok531.jpg","link3500":"https://i.redd.it/l6tx9fptu2c31.jpg","link3501":"https://i.redd.it/l7s2o1btrmn31.jpg","link3502":"https://i.redd.it/l86lece7k3j01.jpg","link3503":"https://i.redd.it/l8hb7roduom21.jpg","link3504":"https://i.redd.it/l9fvfqmikrf21.jpg","link3505":"https://i.redd.it/l9phyc8n0tq21.jpg","link3506":"https://i.redd.it/laspsp7mkdl31.jpg","link3507":"https://i.redd.it/lbou83oag8531.jpg","link3508":"https://i.redd.it/lc7ty9dn7fg21.jpg","link3509":"https://i.redd.it/lc9bbaww7s541.jpg","link3510":"https://i.redd.it/lcojsjxz3gk31.jpg","link3511":"https://i.redd.it/ld3uatfxcgh31.jpg","link3512":"https://i.redd.it/ld4aa9ly83831.jpg","link3513":"https://i.redd.it/ldcm37e9yp331.jpg","link3514":"https://i.redd.it/ldgajdodyge21.jpg","link3515":"https://i.redd.it/lfjfz0k7hhh31.jpg","link3516":"https://i.redd.it/lfto81plsd721.jpg","link3517":"https://i.redd.it/lgn5ct7mmr731.jpg","link3518":"https://i.redd.it/lgnmee7rvop21.jpg","link3519":"https://i.redd.it/lh4i8pfzkfz11.jpg","link3520":"https://i.redd.it/lhv0fxc8g3a21.jpg","link3521":"https://i.redd.it/liz3jz62h3t21.jpg","link3522":"https://i.redd.it/ljnxfomk3pm21.jpg","link3523":"https://i.redd.it/ljuhwlgplbd31.jpg","link3524":"https://i.redd.it/lk9082u6ei111.jpg","link3525":"https://i.redd.it/lkcilz3ple841.jpg","link3526":"https://i.redd.it/lkhav0bc15931.jpg","link3527":"https://i.redd.it/lm2y0pvb6uq21.jpg","link3528":"https://i.redd.it/lm4df52d4q831.jpg","link3529":"https://i.redd.it/lp0v5rpyb4y11.jpg","link3530":"https://i.redd.it/lpceb5opa2241.jpg","link3531":"https://i.redd.it/lqflb16hzz841.jpg","link3532":"https://i.redd.it/lqnqx4q5nlh31.jpg","link3533":"https://i.redd.it/lr2x0sr31c341.jpg","link3534":"https://i.redd.it/ls45v0vrsu531.jpg","link3535":"https://i.redd.it/lsy5f65baau21.jpg","link3536":"https://i.redd.it/lti8ig6vt7631.jpg","link3537":"https://i.redd.it/ltn5awn249j31.jpg","link3538":"https://i.redd.it/ltz0wk7kl1a11.jpg","link3539":"https://i.redd.it/lu0xuozgojr31.jpg","link3540":"https://i.redd.it/lusmgt7ffhg21.jpg","link3541":"https://i.redd.it/lvpkggpdipz31.jpg","link3542":"https://i.redd.it/lvqdecblfly21.jpg","link3543":"https://i.redd.it/lvsyycqtq8k31.jpg","link3544":"https://i.redd.it/lvt8nmfcwuf11.jpg","link3545":"https://i.redd.it/lysn09r3k3j31.jpg","link3546":"https://i.redd.it/lyulbqc9o1w21.jpg","link3547":"https://i.redd.it/lz2rjgea8so31.jpg","link3548":"https://i.redd.it/lzhih9619ul31.jpg","link3549":"https://i.redd.it/m05ei49gvis31.jpg","link3550":"https://i.redd.it/m1bv7p7y0wz31.jpg","link3551":"https://i.redd.it/m2dls8ljoo431.jpg","link3552":"https://i.redd.it/m3hywjtikkb31.jpg","link3553":"https://i.redd.it/m3zqnv8y05g31.jpg","link3554":"https://i.redd.it/m44sbkavj3u21.jpg","link3555":"https://i.redd.it/m495tfh240q31.jpg","link3556":"https://i.redd.it/m4un2iqz7je31.jpg","link3557":"https://i.redd.it/m5s1f2i33jt21.jpg","link3558":"https://i.redd.it/m5v0wjsp9er21.jpg","link3559":"https://i.redd.it/m6ma8qkggsd31.jpg","link3560":"https://i.redd.it/m79onntucmt31.jpg","link3561":"https://i.redd.it/m7qfd8uxl1141.jpg","link3562":"https://i.redd.it/m8hsxjknjt641.jpg","link3563":"https://i.redd.it/m8pyc9tv5x931.jpg","link3564":"https://i.redd.it/m954ae835xq21.jpg","link3565":"https://i.redd.it/mam2ykjj8w731.jpg","link3566":"https://i.redd.it/mayj22c3cii31.jpg","link3567":"https://i.redd.it/mazco4qzbgq21.jpg","link3568":"https://i.redd.it/mba30l12phq31.jpg","link3569":"https://i.redd.it/mbkanyuk4i821.jpg","link3570":"https://i.redd.it/mc2pb01o38441.jpg","link3571":"https://i.redd.it/mcakbaa9al441.jpg","link3572":"https://i.redd.it/md9rixov4pf11.jpg","link3573":"https://i.redd.it/mdcwloxlgd741.jpg","link3574":"https://i.redd.it/mecgv98lwpq31.jpg","link3575":"https://i.redd.it/mf2sisuc4gt21.jpg","link3576":"https://i.redd.it/mgxljtp7cn431.jpg","link3577":"https://i.redd.it/mhjhpu716o621.jpg","link3578":"https://i.redd.it/mhnfo2banir31.jpg","link3579":"https://i.redd.it/mhypb7tf0rl31.jpg","link3580":"https://i.redd.it/mi3j2p07ra131.jpg","link3581":"https://i.redd.it/mi3wbg6v2lx21.jpg","link3582":"https://i.redd.it/mi8mvkg6yvm31.jpg","link3583":"https://i.redd.it/mipbonu9b9921.jpg","link3584":"https://i.redd.it/mjk502mshpq01.jpg","link3585":"https://i.redd.it/mjlcqukxtiw21.jpg","link3586":"https://i.redd.it/mjpv3yf182c11.jpg","link3587":"https://i.redd.it/mk27go6c65141.jpg","link3588":"https://i.redd.it/mk5tf8f75pf11.jpg","link3589":"https://i.redd.it/mllrdszds2j31.jpg","link3590":"https://i.redd.it/mlo2e56b1jf31.jpg","link3591":"https://i.redd.it/mn2e6ht9u5z11.jpg","link3592":"https://i.redd.it/mn6dw5mhbnz21.jpg","link3593":"https://i.redd.it/mn9m903a72c11.jpg","link3594":"https://i.redd.it/mnye8jvxr6631.jpg","link3595":"https://i.redd.it/mo4a4goal5031.jpg","link3596":"https://i.redd.it/moaoq56n34j31.jpg","link3597":"https://i.redd.it/mp82exkeckw21.jpg","link3598":"https://i.redd.it/mpbgeg7t7d231.jpg","link3599":"https://i.redd.it/mpqo35jz5jq31.jpg","link3600":"https://i.redd.it/mr0ggugkrn621.jpg","link3601":"https://i.redd.it/mrc0y3akvdi21.jpg","link3602":"https://i.redd.it/msbweyrwppq21.jpg","link3603":"https://i.redd.it/msc3808k72c11.jpg","link3604":"https://i.redd.it/mtevycxt2go31.jpg","link3605":"https://i.redd.it/mtma0ot34iz31.jpg","link3606":"https://i.redd.it/mtqkqdnozor21.jpg","link3607":"https://i.redd.it/mvar9ppuuvu21.jpg","link3608":"https://i.redd.it/mvsofey12sv21.jpg","link3609":"https://i.redd.it/mw4v5impm7k21.jpg","link3610":"https://i.redd.it/mwac8vfskv631.jpg","link3611":"https://i.redd.it/mwmvjec37of31.jpg","link3612":"https://i.redd.it/mxlv5rvp9fm31.jpg","link3613":"https://i.redd.it/mz2tyv8g59m21.jpg","link3614":"https://i.redd.it/mzpe0lmb87431.jpg","link3615":"https://i.redd.it/mzya108u0b031.jpg","link3616":"https://i.redd.it/n058tecsm9c31.jpg","link3617":"https://i.redd.it/n0j6twiqevw21.jpg","link3618":"https://i.redd.it/n0zfyowqk1b11.jpg","link3619":"https://i.redd.it/n1zci5bsa0i31.jpg","link3620":"https://i.redd.it/n29s1rvi2l741.jpg","link3621":"https://i.redd.it/n2nq0gx9m4k31.jpg","link3622":"https://i.redd.it/n2rowrfubjo11.jpg","link3623":"https://i.redd.it/n352btx39r621.jpg","link3624":"https://i.redd.it/n3coe1ko37231.jpg","link3625":"https://i.redd.it/n3kxmbs485731.jpg","link3626":"https://i.redd.it/n3u043pgsrq31.jpg","link3627":"https://i.redd.it/n4nn4qdzihn21.jpg","link3628":"https://i.redd.it/n4vbc2tkmob21.jpg","link3629":"https://i.redd.it/n50t4li2mco21.jpg","link3630":"https://i.redd.it/n7mzaenh95341.jpg","link3631":"https://i.redd.it/n82dj8elgk421.jpg","link3632":"https://i.redd.it/n8vd6p3chrq21.jpg","link3633":"https://i.redd.it/n9kc27e0nmw21.jpg","link3634":"https://i.redd.it/nanqn4gaiyp31.jpg","link3635":"https://i.redd.it/nb109dtvyie31.jpg","link3636":"https://i.redd.it/nb8lxtujxq931.jpg","link3637":"https://i.redd.it/neug6p6q57v21.jpg","link3638":"https://i.redd.it/newccoxyn5521.jpg","link3639":"https://i.redd.it/nfboq7yjiq331.jpg","link3640":"https://i.redd.it/nfti5vp939131.jpg","link3641":"https://i.redd.it/ngvpju3hzk731.jpg","link3642":"https://i.redd.it/njmscneeldu21.jpg","link3643":"https://i.redd.it/nkhav5gtgwt21.jpg","link3644":"https://i.redd.it/nkhmfau2zq341.jpg","link3645":"https://i.redd.it/nkj54qbrr1p21.jpg","link3646":"https://i.redd.it/nlffvdh1jih21.jpg","link3647":"https://i.redd.it/nli12wnuvj921.jpg","link3648":"https://i.redd.it/nlm6q7mzly601.jpg","link3649":"https://i.redd.it/nmj8axiyxkc21.jpg","link3650":"https://i.redd.it/nms8ytyod5a31.jpg","link3651":"https://i.redd.it/nq77nqgwy2241.jpg","link3652":"https://i.redd.it/nqig9ke0ow841.jpg","link3653":"https://i.redd.it/nrk89iux80641.jpg","link3654":"https://i.redd.it/nrqbo407y1m31.jpg","link3655":"https://i.redd.it/nsbyunkiqr831.jpg","link3656":"https://i.redd.it/nt4e76py19741.jpg","link3657":"https://i.redd.it/ntevnmxicbg21.jpg","link3658":"https://i.redd.it/nu9vywj30mw21.jpg","link3659":"https://i.redd.it/nut88ovup3n01.jpg","link3660":"https://i.redd.it/nuuzivi7k3841.jpg","link3661":"https://i.redd.it/nv0njyplkq631.jpg","link3662":"https://i.redd.it/nv9ho6x93oc31.jpg","link3663":"https://i.redd.it/nverf1lw77j31.jpg","link3664":"https://i.redd.it/nwcdrzssdg231.jpg","link3665":"https://i.redd.it/nwzgtw1fdes31.jpg","link3666":"https://i.redd.it/nxkhnuwk4d041.jpg","link3667":"https://i.redd.it/nxqbgx2umwq21.jpg","link3668":"https://i.redd.it/nxzy6oqrgc241.jpg","link3669":"https://i.redd.it/nytbbsntwdn21.jpg","link3670":"https://i.redd.it/o01ap1ld5kb31.jpg","link3671":"https://i.redd.it/o0cfyl9ij7j31.jpg","link3672":"https://i.redd.it/o0h8mxanvw841.jpg","link3673":"https://i.redd.it/o16th8wcavo31.jpg","link3674":"https://i.redd.it/o17cae5g5bb11.jpg","link3675":"https://i.redd.it/o1eytcprkmb21.jpg","link3676":"https://i.redd.it/o1hm3q57imc31.jpg","link3677":"https://i.redd.it/o1il35ww09t21.jpg","link3678":"https://i.redd.it/o1lhab28ktw21.jpg","link3679":"https://i.redd.it/o20izecrv4131.jpg","link3680":"https://i.redd.it/o23itzb3s2w31.jpg","link3681":"https://i.redd.it/o2dzbxqfdvi31.jpg","link3682":"https://i.redd.it/o2m3q3iq0kf31.jpg","link3683":"https://i.redd.it/o36pmrjz2yl31.jpg","link3684":"https://i.redd.it/o3c9c6k3z2441.jpg","link3685":"https://i.redd.it/o3s1f2aju3741.jpg","link3686":"https://i.redd.it/o3xcbkszbdw31.jpg","link3687":"https://i.redd.it/o4y9mdfaqh041.jpg","link3688":"https://i.redd.it/o6ay8j31lh821.jpg","link3689":"https://i.redd.it/o7ojo1mdvyc11.jpg","link3690":"https://i.redd.it/o87wyk0egjz31.jpg","link3691":"https://i.redd.it/o8sue95xs7h21.jpg","link3692":"https://i.redd.it/o9x2bn7y8ux21.jpg","link3693":"https://i.redd.it/oaaxxx8f4kr31.jpg","link3694":"https://i.redd.it/oafjqb1kf1i31.jpg","link3695":"https://i.redd.it/oalkbth78pz31.jpg","link3696":"https://i.redd.it/oavaxx8b6k431.jpg","link3697":"https://i.redd.it/obhknuz0rbo21.jpg","link3698":"https://i.redd.it/obp097qej3u21.jpg","link3699":"https://i.redd.it/ocbmw9mjz0d11.jpg","link3700":"https://i.redd.it/ocqxrac8fiu21.jpg","link3701":"https://i.redd.it/odbc776340j21.jpg","link3702":"https://i.redd.it/odu0tlovwlc31.jpg","link3703":"https://i.redd.it/oe7hmen9o9431.jpg","link3704":"https://i.redd.it/oeof70cibi111.jpg","link3705":"https://i.redd.it/oerknxg95c031.jpg","link3706":"https://i.redd.it/of1brmypwyk21.jpg","link3707":"https://i.redd.it/of600e10amg31.jpg","link3708":"https://i.redd.it/oggl2fzfvoj21.jpg","link3709":"https://i.redd.it/ogqlki7seiu21.jpg","link3710":"https://i.redd.it/ohashq2363b31.jpg","link3711":"https://i.redd.it/oj3hubz62b541.jpg","link3712":"https://i.redd.it/oj8k6gl6di111.jpg","link3713":"https://i.redd.it/oj9319sd47t21.jpg","link3714":"https://i.redd.it/ojus7bqrp8031.jpg","link3715":"https://i.redd.it/ojycnudvisp31.jpg","link3716":"https://i.redd.it/ok1afsujzq241.jpg","link3717":"https://i.redd.it/ol5493vp7p011.jpg","link3718":"https://i.redd.it/olxsvt3646s21.jpg","link3719":"https://i.redd.it/onbuxl7f86o21.jpg","link3720":"https://i.redd.it/onwmkb78uh841.jpg","link3721":"https://i.redd.it/onz9zy0ci8e21.jpg","link3722":"https://i.redd.it/oowvl9zm9x831.jpg","link3723":"https://i.redd.it/op2ttj26gfu21.jpg","link3724":"https://i.redd.it/ope3wtn75vj21.jpg","link3725":"https://i.redd.it/opg0ljtwr1241.jpg","link3726":"https://i.redd.it/oppxxagmai111.jpg","link3727":"https://i.redd.it/optovdwhnro21.jpg","link3728":"https://i.redd.it/or3982ejx5741.jpg","link3729":"https://i.redd.it/ornk8hoaj3d11.jpg","link3730":"https://i.redd.it/orqd6w2t2rm21.jpg","link3731":"https://i.redd.it/orrxf7xs2vf31.jpg","link3732":"https://i.redd.it/oss1i3gg8dt31.jpg","link3733":"https://i.redd.it/osvzybpq1xb31.jpg","link3734":"https://i.redd.it/ot1e4gb52he11.jpg","link3735":"https://i.redd.it/otaohvlyzvb31.jpg","link3736":"https://i.redd.it/otj3xf73mra31.jpg","link3737":"https://i.redd.it/otrnheypvqg21.jpg","link3738":"https://i.redd.it/ou251oarwtw21.jpg","link3739":"https://i.redd.it/ou33ox0hr0i21.jpg","link3740":"https://i.redd.it/ou9a1qrekbn21.jpg","link3741":"https://i.redd.it/ougbu5u6rtg21.jpg","link3742":"https://i.redd.it/ounc1ou6wht21.jpg","link3743":"https://i.redd.it/ouw8hshnz2i31.jpg","link3744":"https://i.redd.it/ov305vq3gpa31.jpg","link3745":"https://i.redd.it/ovv63hov9m031.jpg","link3746":"https://i.redd.it/owb9tgx7lqj21.jpg","link3747":"https://i.redd.it/owff1zq1gje31.jpg","link3748":"https://i.redd.it/oxdc0u5gs4z31.jpg","link3749":"https://i.redd.it/oxqc7hv9wws31.jpg","link3750":"https://i.redd.it/oy6px6gk69y31.jpg","link3751":"https://i.redd.it/oybi98ajr2f11.jpg","link3752":"https://i.redd.it/oylvsznun3f11.jpg","link3753":"https://i.redd.it/oynapy2ytgi31.jpg","link3754":"https://i.redd.it/ozdi5wv3qgw31.jpg","link3755":"https://i.redd.it/ozeg7msiz2h31.jpg","link3756":"https://i.redd.it/p0ktxjafjey21.jpg","link3757":"https://i.redd.it/p0zk3is13l911.jpg","link3758":"https://i.redd.it/p16m8ffga5n21.jpg","link3759":"https://i.redd.it/p1d5amlzzql31.jpg","link3760":"https://i.redd.it/p3gavdxojgz31.jpg","link3761":"https://i.redd.it/p42uf99bu4o31.jpg","link3762":"https://i.redd.it/p5pmeh3v0ch21.jpg","link3763":"https://i.redd.it/p5wgrtlghr841.jpg","link3764":"https://i.redd.it/p6cg4mxwubx21.jpg","link3765":"https://i.redd.it/p6my6ryg6jn31.jpg","link3766":"https://i.redd.it/p6q70rtc5o931.jpg","link3767":"https://i.redd.it/p6x9xvyyptm11.jpg","link3768":"https://i.redd.it/p86rdgbksen11.jpg","link3769":"https://i.redd.it/p8ajd41n4o841.jpg","link3770":"https://i.redd.it/p8hq79xtqv921.jpg","link3771":"https://i.redd.it/p8kahr8xa8241.jpg","link3772":"https://i.redd.it/p8w04yyftks31.jpg","link3773":"https://i.redd.it/p9jpprhgjrs31.jpg","link3774":"https://i.redd.it/p9w0r8e1tyk31.jpg","link3775":"https://i.redd.it/paderoni5d621.jpg","link3776":"https://i.redd.it/pb0vario3ci31.jpg","link3777":"https://i.redd.it/pbbzejz7u3p31.jpg","link3778":"https://i.redd.it/pbjr8tfyai841.jpg","link3779":"https://i.redd.it/pc2tknms9cd31.jpg","link3780":"https://i.redd.it/pchtqnyd9at31.jpg","link3781":"https://i.redd.it/pdrnwvz4n9y21.jpg","link3782":"https://i.redd.it/pf39kmnqk9j31.jpg","link3783":"https://i.redd.it/pf82sjv6a1k31.jpg","link3784":"https://i.redd.it/pfho216j04r21.jpg","link3785":"https://i.redd.it/pg7zo0fb62c11.jpg","link3786":"https://i.redd.it/pg81519fk0s31.jpg","link3787":"https://i.redd.it/pgbh0r5emp731.jpg","link3788":"https://i.redd.it/pgnvvh02xci31.jpg","link3789":"https://i.redd.it/pgsj9j3dnha31.jpg","link3790":"https://i.redd.it/pgt0n62vmay21.jpg","link3791":"https://i.redd.it/phacpypbhb631.jpg","link3792":"https://i.redd.it/phl7p7awnrk21.jpg","link3793":"https://i.redd.it/pi245jit6p921.jpg","link3794":"https://i.redd.it/pi6eyxsh7aw21.jpg","link3795":"https://i.redd.it/pjb48r3i3m921.jpg","link3796":"https://i.redd.it/pkgn5l911xe11.jpg","link3797":"https://i.redd.it/pkmocuwfx4141.jpg","link3798":"https://i.redd.it/pkn6glww2x741.jpg","link3799":"https://i.redd.it/pky5hkubd4i31.jpg","link3800":"https://i.redd.it/pkymsy36bo741.jpg","link3801":"https://i.redd.it/plvzfaa6md331.jpg","link3802":"https://i.redd.it/pm7pqei5ef621.jpg","link3803":"https://i.redd.it/pm9r6hj898641.jpg","link3804":"https://i.redd.it/pmb7ted3bmm31.jpg","link3805":"https://i.redd.it/pmlydlfbet731.jpg","link3806":"https://i.redd.it/pn1zdm8uonh21.jpg","link3807":"https://i.redd.it/pn61f4cpy3v21.jpg","link3808":"https://i.redd.it/pn9ll0prlbj21.jpg","link3809":"https://i.redd.it/pnrm0x3mbet21.jpg","link3810":"https://i.redd.it/pp22xkhoic931.jpg","link3811":"https://i.redd.it/ppmlriwe29241.jpg","link3812":"https://i.redd.it/ppyjvlr4ikw21.jpg","link3813":"https://i.redd.it/pqp3ee61a1b21.jpg","link3814":"https://i.redd.it/pqr9cf4v1rn31.jpg","link3815":"https://i.redd.it/pqrnjb2almp11.jpg","link3816":"https://i.redd.it/pr70tnf21u841.jpg","link3817":"https://i.redd.it/pra2vc64n4t31.jpg","link3818":"https://i.redd.it/prav54px7iu21.jpg","link3819":"https://i.redd.it/prbwonf8lnt11.jpg","link3820":"https://i.redd.it/prkylfv54fe11.jpg","link3821":"https://i.redd.it/psr1oshukyhz.jpg","link3822":"https://i.redd.it/pu44zy8hhns21.jpg","link3823":"https://i.redd.it/pu5p44vnoox31.jpg","link3824":"https://i.redd.it/puevg27dnkk21.jpg","link3825":"https://i.redd.it/pvfscbkfn2331.jpg","link3826":"https://i.redd.it/pw9hw8zfsz641.jpg","link3827":"https://i.redd.it/px9u2s7kex241.jpg","link3828":"https://i.redd.it/pzan4rkvhk041.jpg","link3829":"https://i.redd.it/pzuvb3u8p0141.jpg","link3830":"https://i.redd.it/pzzcar3j1hx31.jpg","link3831":"https://i.redd.it/q0cjq4baqoo21.jpg","link3832":"https://i.redd.it/q16wy3j75gl31.jpg","link3833":"https://i.redd.it/q17mzb7pll231.jpg","link3834":"https://i.redd.it/q1d7yegjm4r31.jpg","link3835":"https://i.redd.it/q27kshmr6be11.jpg","link3836":"https://i.redd.it/q2bwn726k4331.jpg","link3837":"https://i.redd.it/q2ub4i2x00p31.jpg","link3838":"https://i.redd.it/q2z9nvn4bi531.jpg","link3839":"https://i.redd.it/q3lc89e2m9821.jpg","link3840":"https://i.redd.it/q44i77y8yjw21.jpg","link3841":"https://i.redd.it/q4bdc0tkw9841.jpg","link3842":"https://i.redd.it/q4twqeh228841.jpg","link3843":"https://i.redd.it/q50qtppopy831.jpg","link3844":"https://i.redd.it/q52rve4skmp31.jpg","link3845":"https://i.redd.it/q5d0s1snv4p31.jpg","link3846":"https://i.redd.it/q68ij5wvbvc31.jpg","link3847":"https://i.redd.it/q6kxtzwt46821.jpg","link3848":"https://i.redd.it/q6v6c0xqiws31.jpg","link3849":"https://i.redd.it/q70vc4c84py21.jpg","link3850":"https://i.redd.it/q8hgnl0wox031.jpg","link3851":"https://i.redd.it/q90twyfvxiw21.jpg","link3852":"https://i.redd.it/q90xbtyak4m31.jpg","link3853":"https://i.redd.it/q98jdfxjknk31.jpg","link3854":"https://i.redd.it/qa3ca43argr21.jpg","link3855":"https://i.redd.it/qablywx7hpu21.jpg","link3856":"https://i.redd.it/qafbkst0nyv31.jpg","link3857":"https://i.redd.it/qave5lduc2r31.jpg","link3858":"https://i.redd.it/qb6xsv9l3f341.jpg","link3859":"https://i.redd.it/qc23ixti8yl21.jpg","link3860":"https://i.redd.it/qdthy7tvlgt31.jpg","link3861":"https://i.redd.it/qfcxu5gv5y441.jpg","link3862":"https://i.redd.it/qfq10kyyqhn31.jpg","link3863":"https://i.redd.it/qi2sia0a2im31.jpg","link3864":"https://i.redd.it/qi9s26lpqmy21.jpg","link3865":"https://i.redd.it/qir3nnyltew31.jpg","link3866":"https://i.redd.it/qjsyaq4e8sj21.jpg","link3867":"https://i.redd.it/ql1n7snyivl31.jpg","link3868":"https://i.redd.it/qlxylfyqig241.jpg","link3869":"https://i.redd.it/qm4z7x6anf341.jpg","link3870":"https://i.redd.it/qmv5rljmil031.jpg","link3871":"https://i.redd.it/qncwn4cv4dv31.jpg","link3872":"https://i.redd.it/qnjx2obe1v531.jpg","link3873":"https://i.redd.it/qpjfngodhzu21.jpg","link3874":"https://i.redd.it/qplsl37oojg31.jpg","link3875":"https://i.redd.it/qq2qq3hg61131.jpg","link3876":"https://i.redd.it/qrvz3l5ww5231.jpg","link3877":"https://i.redd.it/qrw3xmitmo641.jpg","link3878":"https://i.redd.it/qs6i9z6y5bg21.jpg","link3879":"https://i.redd.it/qsaq9zysqy341.jpg","link3880":"https://i.redd.it/qsoozsaeq3141.jpg","link3881":"https://i.redd.it/qt45fokt9gm31.jpg","link3882":"https://i.redd.it/qt6x8smknxq31.jpg","link3883":"https://i.redd.it/qvnv0piuey901.jpg","link3884":"https://i.redd.it/qvo56xaj4v321.jpg","link3885":"https://i.redd.it/qvqwze89p9t21.jpg","link3886":"https://i.redd.it/qvxhimsrvrx31.jpg","link3887":"https://i.redd.it/qwc04jdpgyr31.jpg","link3888":"https://i.redd.it/qxablddj1kf31.jpg","link3889":"https://i.redd.it/qxfg4p3q6vv31.jpg","link3890":"https://i.redd.it/qxkrb525cr031.jpg","link3891":"https://i.redd.it/qxstp5h084l31.jpg","link3892":"https://i.redd.it/qyw2i8jogxh31.jpg","link3893":"https://i.redd.it/qzc55ycuiat21.jpg","link3894":"https://i.redd.it/qzq7g0830gt21.jpg","link3895":"https://i.redd.it/qztv3mybcir31.jpg","link3896":"https://i.redd.it/r04mlencs7621.jpg","link3897":"https://i.redd.it/r1f6h9ftnqd31.jpg","link3898":"https://i.redd.it/r1ugu8abft131.jpg","link3899":"https://i.redd.it/r354yshi52a31.jpg","link3900":"https://i.redd.it/r3pfpql2gnh31.jpg","link3901":"https://i.redd.it/r4ios8n65kh31.jpg","link3902":"https://i.redd.it/r636e7fun8r21.jpg","link3903":"https://i.redd.it/r6a4n2rptd131.jpg","link3904":"https://i.redd.it/r6jwg2t2iv741.jpg","link3905":"https://i.redd.it/r6tciropri841.jpg","link3906":"https://i.redd.it/r6zsgomjoer31.jpg","link3907":"https://i.redd.it/r77zuik27ni31.jpg","link3908":"https://i.redd.it/r7jy8wq5vuw31.jpg","link3909":"https://i.redd.it/r7xlppgnb0541.jpg","link3910":"https://i.redd.it/r81z6v7vuir21.jpg","link3911":"https://i.redd.it/r8560vhecay31.jpg","link3912":"https://i.redd.it/r86978g75p701.jpg","link3913":"https://i.redd.it/ra3qk4nrs9141.jpg","link3914":"https://i.redd.it/ra43c60jjqy31.jpg","link3915":"https://i.redd.it/ra6l7hwaajr31.jpg","link3916":"https://i.redd.it/rayaaajxs6q21.jpg","link3917":"https://i.redd.it/rb06h0kwy1131.jpg","link3918":"https://i.redd.it/rb3rzf3n8hk21.jpg","link3919":"https://i.redd.it/rctp4yh2g5f21.jpg","link3920":"https://i.redd.it/rde3cfy282e31.jpg","link3921":"https://i.redd.it/rdmpq1zlexa31.jpg","link3922":"https://i.redd.it/rfb4x0euw4721.jpg","link3923":"https://i.redd.it/rfy68j9bobr31.jpg","link3924":"https://i.redd.it/rg1a66jz78931.jpg","link3925":"https://i.redd.it/rgmt0a0git841.jpg","link3926":"https://i.redd.it/rgwn9m55cee31.jpg","link3927":"https://i.redd.it/rhh5cz00be931.jpg","link3928":"https://i.redd.it/rhh5kqii5qw21.jpg","link3929":"https://i.redd.it/rhl731c5jml21.jpg","link3930":"https://i.redd.it/rhpjnrn019l31.jpg","link3931":"https://i.redd.it/ri4y9btqhed31.jpg","link3932":"https://i.redd.it/rib8wqzf1us31.jpg","link3933":"https://i.redd.it/riip6lu2sl721.jpg","link3934":"https://i.redd.it/rip34mdfkn341.jpg","link3935":"https://i.redd.it/rjnb22aha5o11.jpg","link3936":"https://i.redd.it/rjtjixagxrm21.jpg","link3937":"https://i.redd.it/rk8hks6wmwn21.jpg","link3938":"https://i.redd.it/rkbiqu7p91y21.jpg","link3939":"https://i.redd.it/rklxr5n38xp21.jpg","link3940":"https://i.redd.it/rkvklataik931.jpg","link3941":"https://i.redd.it/rl7hcsahfre31.jpg","link3942":"https://i.redd.it/rlqclhelu8o21.jpg","link3943":"https://i.redd.it/rlxaqr361ou31.jpg","link3944":"https://i.redd.it/rng9itr47iq31.jpg","link3945":"https://i.redd.it/rnkkwii01cv21.jpg","link3946":"https://i.redd.it/ro5b1lbxmf031.jpg","link3947":"https://i.redd.it/romilgq592q21.jpg","link3948":"https://i.redd.it/rorpb9q7wa031.jpg","link3949":"https://i.redd.it/rpvf9vpi5by31.jpg","link3950":"https://i.redd.it/rqozykynrw721.jpg","link3951":"https://i.redd.it/rquu3ijqofu11.jpg","link3952":"https://i.redd.it/rqy1tqk4kb541.jpg","link3953":"https://i.redd.it/rrjfkquvds031.jpg","link3954":"https://i.redd.it/rrrd9pqkh8c31.jpg","link3955":"https://i.redd.it/rsuqwtty9g841.jpg","link3956":"https://i.redd.it/rudlvwgt8w641.jpg","link3957":"https://i.redd.it/ruxbaxygnpa21.jpg","link3958":"https://i.redd.it/rv9dmkz9tjd21.jpg","link3959":"https://i.redd.it/rvsdw4u95e921.jpg","link3960":"https://i.redd.it/rvynmr7yoyo21.jpg","link3961":"https://i.redd.it/rwatyptb79y21.jpg","link3962":"https://i.redd.it/rwky2jps21k31.jpg","link3963":"https://i.redd.it/rx8yb4rsio741.jpg","link3964":"https://i.redd.it/ryo97oog2r921.jpg","link3965":"https://i.redd.it/ryobq5zikyd31.jpg","link3966":"https://i.redd.it/rzkcg1c74n231.jpg","link3967":"https://i.redd.it/s0a0gwzeuss21.jpg","link3968":"https://i.redd.it/s13dz915e1l21.jpg","link3969":"https://i.redd.it/s14ywhszznr21.jpg","link3970":"https://i.redd.it/s18knanobm631.jpg","link3971":"https://i.redd.it/s1hc038o2ct31.jpg","link3972":"https://i.redd.it/s1piie1dy2f31.jpg","link3973":"https://i.redd.it/s24uw9v8rr721.jpg","link3974":"https://i.redd.it/s2eq7hl64xi21.jpg","link3975":"https://i.redd.it/s2imvgs9ij041.jpg","link3976":"https://i.redd.it/s2qkd7dwn9341.jpg","link3977":"https://i.redd.it/s3cfdr7ds5s31.jpg","link3978":"https://i.redd.it/s3e54qkd0c631.jpg","link3979":"https://i.redd.it/s3gymain3s741.jpg","link3980":"https://i.redd.it/s45b7r1tny541.jpg","link3981":"https://i.redd.it/s52avomroxi21.jpg","link3982":"https://i.redd.it/s69waca9e4p31.jpg","link3983":"https://i.redd.it/s7fhgelk3d641.jpg","link3984":"https://i.redd.it/s7mike77kwx31.jpg","link3985":"https://i.redd.it/s9dle2ztnou21.jpg","link3986":"https://i.redd.it/s9wznce1js331.jpg","link3987":"https://i.redd.it/sa39eon1lvw31.jpg","link3988":"https://i.redd.it/sb06uoyphc121.jpg","link3989":"https://i.redd.it/sbx86uhmthf31.jpg","link3990":"https://i.redd.it/sc0l3u4541821.jpg","link3991":"https://i.redd.it/sc6r4d9yb1y21.jpg","link3992":"https://i.redd.it/sc8ncnn1cau21.jpg","link3993":"https://i.redd.it/sca04bss33i21.jpg","link3994":"https://i.redd.it/scs3vsgu0t021.jpg","link3995":"https://i.redd.it/sd4o6jk81t931.jpg","link3996":"https://i.redd.it/sek5ljk8nmi21.jpg","link3997":"https://i.redd.it/seq4gn062q231.jpg","link3998":"https://i.redd.it/sgvblpuuao031.jpg","link3999":"https://i.redd.it/shqy0b56h7w11.jpg","link4000":"https://i.redd.it/shtcspvr6fg21.jpg","link4001":"https://i.redd.it/sj4eganafqo31.jpg","link4002":"https://i.redd.it/sj6wmkpjo8631.jpg","link4003":"https://i.redd.it/sjdb5my1t3j21.jpg","link4004":"https://i.redd.it/sjhhxmti3c531.jpg","link4005":"https://i.redd.it/sjtt9wpberg21.jpg","link4006":"https://i.redd.it/slsffxwnwc621.jpg","link4007":"https://i.redd.it/sltt2rptu1p31.jpg","link4008":"https://i.redd.it/smgrib11bo521.jpg","link4009":"https://i.redd.it/smvzd1nj8d341.jpg","link4010":"https://i.redd.it/sotredz9zsw31.jpg","link4011":"https://i.redd.it/spc5n4thjpw21.jpg","link4012":"https://i.redd.it/spjuq8g4kxa21.jpg","link4013":"https://i.redd.it/spkdjeyi1k521.jpg","link4014":"https://i.redd.it/sqyt2u15tev21.jpg","link4015":"https://i.redd.it/sr848iavdu031.jpg","link4016":"https://i.redd.it/ss379mci5o621.jpg","link4017":"https://i.redd.it/ssm8r5hs0wf31.jpg","link4018":"https://i.redd.it/ste2ftg83n041.jpg","link4019":"https://i.redd.it/sti20fbd1do31.jpg","link4020":"https://i.redd.it/stw5rq48zee31.jpg","link4021":"https://i.redd.it/su7g3d2po0i31.jpg","link4022":"https://i.redd.it/sv4vc9pxd5f31.jpg","link4023":"https://i.redd.it/svd47g8qfkd31.jpg","link4024":"https://i.redd.it/sve3kgbav1l21.jpg","link4025":"https://i.redd.it/swbxb878o3521.jpg","link4026":"https://i.redd.it/swrwyfz03ly21.jpg","link4027":"https://i.redd.it/sx1e6r7or7v21.jpg","link4028":"https://i.redd.it/sxehcz2tm6i21.jpg","link4029":"https://i.redd.it/sxlmumuzk1r31.jpg","link4030":"https://i.redd.it/sxq1n7zhirm31.jpg","link4031":"https://i.redd.it/sxvd82857c841.jpg","link4032":"https://i.redd.it/sy3wzv4ehth31.jpg","link4033":"https://i.redd.it/sz18j3kq2ly31.jpg","link4034":"https://i.redd.it/szpxq6b2wu841.jpg","link4035":"https://i.redd.it/t09n8jrxdsc31.jpg","link4036":"https://i.redd.it/t0h5izdjx7l31.jpg","link4037":"https://i.redd.it/t129nfi8qwc31.jpg","link4038":"https://i.redd.it/t19kuya7tey31.jpg","link4039":"https://i.redd.it/t2z6wybjf2041.jpg","link4040":"https://i.redd.it/t2zh19ve6mj31.jpg","link4041":"https://i.redd.it/t328q0c1lj631.jpg","link4042":"https://i.redd.it/t374guo8gw631.jpg","link4043":"https://i.redd.it/t3davdggoos21.jpg","link4044":"https://i.redd.it/t455gfola1331.jpg","link4045":"https://i.redd.it/t4bb8pkl29z31.jpg","link4046":"https://i.redd.it/t53eelb43lz21.jpg","link4047":"https://i.redd.it/t5d93nog37x21.jpg","link4048":"https://i.redd.it/t5w2fsz7cp931.jpg","link4049":"https://i.redd.it/t68jy54ip9f31.jpg","link4050":"https://i.redd.it/t70guy5v60n31.jpg","link4051":"https://i.redd.it/t76zkv43h3s21.jpg","link4052":"https://i.redd.it/t7ftsjv0cz741.jpg","link4053":"https://i.redd.it/t8zy1hw1mip31.jpg","link4054":"https://i.redd.it/t9a38yg5sb441.jpg","link4055":"https://i.redd.it/t9gtueuuxdf11.jpg","link4056":"https://i.redd.it/t9pr08avm5821.jpg","link4057":"https://i.redd.it/tabsy4xlikt01.jpg","link4058":"https://i.redd.it/tah38vstyoe11.jpg","link4059":"https://i.redd.it/tboiu7z6js641.jpg","link4060":"https://i.redd.it/tbrfklhy6o641.jpg","link4061":"https://i.redd.it/tc4hwr3xttx21.jpg","link4062":"https://i.redd.it/tcax9i80j5h21.jpg","link4063":"https://i.redd.it/tcmnfmvbrsb21.jpg","link4064":"https://i.redd.it/tcy5g2wko0o31.jpg","link4065":"https://i.redd.it/td49m829xkd31.jpg","link4066":"https://i.redd.it/td9ymmgxc7f31.jpg","link4067":"https://i.redd.it/tdb4tstlfqj31.jpg","link4068":"https://i.redd.it/tddshqvk8r731.jpg","link4069":"https://i.redd.it/tdlxz0ewcpv21.jpg","link4070":"https://i.redd.it/tdyouky13au21.jpg","link4071":"https://i.redd.it/te2h8n3z36y31.jpg","link4072":"https://i.redd.it/terjg3bj57v21.jpg","link4073":"https://i.redd.it/texerhhovoe31.jpg","link4074":"https://i.redd.it/tfbqynrlmk241.jpg","link4075":"https://i.redd.it/tfd0s62wjbu11.jpg","link4076":"https://i.redd.it/th9ohvhoujz31.jpg","link4077":"https://i.redd.it/thrihrd84c831.jpg","link4078":"https://i.redd.it/tiuh3cl3q5q31.jpg","link4079":"https://i.redd.it/tj7yogug96721.jpg","link4080":"https://i.redd.it/tjc26l0lsa031.jpg","link4081":"https://i.redd.it/tjhivcjotaq31.jpg","link4082":"https://i.redd.it/tktbv40tsdw31.jpg","link4083":"https://i.redd.it/tm4b2y87aee31.jpg","link4084":"https://i.redd.it/tmldv26n72c11.jpg","link4085":"https://i.redd.it/tn1okokcur541.jpg","link4086":"https://i.redd.it/tnae71wo2t721.jpg","link4087":"https://i.redd.it/tnh24hvdny601.jpg","link4088":"https://i.redd.it/to3lt1jt6ww21.jpg","link4089":"https://i.redd.it/to6etl2l6bk31.jpg","link4090":"https://i.redd.it/tpbp075w0gz21.jpg","link4091":"https://i.redd.it/tpby7m5kico21.jpg","link4092":"https://i.redd.it/tpuem1ewdmp21.jpg","link4093":"https://i.redd.it/tpyp1s6typy31.jpg","link4094":"https://i.redd.it/tq10l0pyu3931.jpg","link4095":"https://i.redd.it/tq2ezdu9u9d31.jpg","link4096":"https://i.redd.it/tq5arulnmlc11.jpg","link4097":"https://i.redd.it/tq5q94de0un31.jpg","link4098":"https://i.redd.it/tqjdbwlbfwx21.jpg","link4099":"https://i.redd.it/tqw3a7b3pkk21.jpg","link4100":"https://i.redd.it/tripvze8psy21.jpg","link4101":"https://i.redd.it/trq4cw1ktqe11.jpg","link4102":"https://i.redd.it/trtz43mvmvu21.jpg","link4103":"https://i.redd.it/tt0pljcxvdi21.jpg","link4104":"https://i.redd.it/tta0aoteaql21.jpg","link4105":"https://i.redd.it/tu5747l0tkc31.jpg","link4106":"https://i.redd.it/tu6a4rb89b041.jpg","link4107":"https://i.redd.it/tuhdb4vnwej21.jpg","link4108":"https://i.redd.it/tux6x3iv36821.jpg","link4109":"https://i.redd.it/tvgh1ajdm1n21.jpg","link4110":"https://i.redd.it/tvmlyhg32fm21.jpg","link4111":"https://i.redd.it/tx3qaurd2au31.jpg","link4112":"https://i.redd.it/txnmph4z2x741.jpg","link4113":"https://i.redd.it/txs7bbp5i5y21.jpg","link4114":"https://i.redd.it/ty5vo2kla1q21.jpg","link4115":"https://i.redd.it/tyfyp6kjawo21.jpg","link4116":"https://i.redd.it/tyjvvcevz7c21.jpg","link4117":"https://i.redd.it/u0bk7jbungn21.jpg","link4118":"https://i.redd.it/u20c00n5t5q21.jpg","link4119":"https://i.redd.it/u23dglgw4cg21.jpg","link4120":"https://i.redd.it/u23lwep2sli31.jpg","link4121":"https://i.redd.it/u2v0jyqz8h741.jpg","link4122":"https://i.redd.it/u3888soual621.jpg","link4123":"https://i.redd.it/u3qko6aoayl21.jpg","link4124":"https://i.redd.it/u3w7rkkswl931.jpg","link4125":"https://i.redd.it/u47ax3dkfz631.jpg","link4126":"https://i.redd.it/u49qz1am89h21.jpg","link4127":"https://i.redd.it/u4ap94521kf31.jpg","link4128":"https://i.redd.it/u4pqsp6g35241.jpg","link4129":"https://i.redd.it/u4x87cedv4j21.jpg","link4130":"https://i.redd.it/u4zsovy922o11.jpg","link4131":"https://i.redd.it/u5cfub6mxdp31.jpg","link4132":"https://i.redd.it/u5eo167w5dl21.jpg","link4133":"https://i.redd.it/u5ieja2q5jxy.jpg","link4134":"https://i.redd.it/u5te0d84tgl31.jpg","link4135":"https://i.redd.it/u6k8fmo8jd131.jpg","link4136":"https://i.redd.it/u7n98akm5t341.jpg","link4137":"https://i.redd.it/u7z98ngf5hc31.jpg","link4138":"https://i.redd.it/u7znqzyhqkv31.jpg","link4139":"https://i.redd.it/u8wkwpzdw7h31.jpg","link4140":"https://i.redd.it/u8y3upqtv3t31.jpg","link4141":"https://i.redd.it/u95kk3a0nnj31.jpg","link4142":"https://i.redd.it/u986oshb6wx21.jpg","link4143":"https://i.redd.it/u99lii0tf8t21.jpg","link4144":"https://i.redd.it/u9ad3tvofkm31.jpg","link4145":"https://i.redd.it/ub0iem3tjts31.jpg","link4146":"https://i.redd.it/ub0rc0tk2bl31.jpg","link4147":"https://i.redd.it/ubz54jyyu5t31.jpg","link4148":"https://i.redd.it/ucbsfwv7umv21.jpg","link4149":"https://i.redd.it/udexp7817wz11.jpg","link4150":"https://i.redd.it/udsh4ba41kf31.jpg","link4151":"https://i.redd.it/udtja9scvvd11.jpg","link4152":"https://i.redd.it/uf2xyyo8rcn31.jpg","link4153":"https://i.redd.it/ufmsmq5rpki31.jpg","link4154":"https://i.redd.it/uggiey00zwq21.jpg","link4155":"https://i.redd.it/uh69j664lol31.jpg","link4156":"https://i.redd.it/uhr00y1qp1d31.jpg","link4157":"https://i.redd.it/uiaye4bmiav21.jpg","link4158":"https://i.redd.it/ujowvvur94o31.jpg","link4159":"https://i.redd.it/ukgh6awvrwe31.jpg","link4160":"https://i.redd.it/uld6q9ithgp31.jpg","link4161":"https://i.redd.it/uldb3nvv8kk11.jpg","link4162":"https://i.redd.it/ule094woodq21.jpg","link4163":"https://i.redd.it/ulg4xh0tfsq11.jpg","link4164":"https://i.redd.it/ulw373br59441.jpg","link4165":"https://i.redd.it/umfxc2k9gb931.jpg","link4166":"https://i.redd.it/umg1yliqfgs21.jpg","link4167":"https://i.redd.it/umwqe757pf421.jpg","link4168":"https://i.redd.it/umysoaz8try21.jpg","link4169":"https://i.redd.it/unfn1faaaj431.jpg","link4170":"https://i.redd.it/unoungpddyj31.jpg","link4171":"https://i.redd.it/unylvn8av6841.jpg","link4172":"https://i.redd.it/upc1hc4b74f21.jpg","link4173":"https://i.redd.it/upr1h5yel9p31.jpg","link4174":"https://i.redd.it/upxdwrpsq8721.jpg","link4175":"https://i.redd.it/uqbh7shrz5131.jpg","link4176":"https://i.redd.it/uqovk4djw7t31.jpg","link4177":"https://i.redd.it/uqp8wnprzpb11.jpg","link4178":"https://i.redd.it/urali7d36ya31.jpg","link4179":"https://i.redd.it/urhnhq57rui31.jpg","link4180":"https://i.redd.it/uspabyktdp041.jpg","link4181":"https://i.redd.it/usuo4v43eaq31.jpg","link4182":"https://i.redd.it/uuc77y050a741.jpg","link4183":"https://i.redd.it/uuq1y41vrq141.jpg","link4184":"https://i.redd.it/uv3e0n8c6im21.jpg","link4185":"https://i.redd.it/uv3jn3i431821.jpg","link4186":"https://i.redd.it/uv6aaccg1xe11.jpg","link4187":"https://i.redd.it/uvxy3bg9lb021.jpg","link4188":"https://i.redd.it/uwcjwz55f7s21.jpg","link4189":"https://i.redd.it/uyf9yrw9wy431.jpg","link4190":"https://i.redd.it/uyknaosq1cc31.jpg","link4191":"https://i.redd.it/uyrbhg26inb31.jpg","link4192":"https://i.redd.it/uyuri8tdkln21.jpg","link4193":"https://i.redd.it/uyxxa88838k31.jpg","link4194":"https://i.redd.it/uzrv2pmz50t21.jpg","link4195":"https://i.redd.it/v0cgycidc0341.jpg","link4196":"https://i.redd.it/v0hdwxkpatt31.jpg","link4197":"https://i.redd.it/v0lnp21yxnm11.jpg","link4198":"https://i.redd.it/v0r1np3vbhu21.jpg","link4199":"https://i.redd.it/v0wflfieq1z31.jpg","link4200":"https://i.redd.it/v1177cgaokx31.jpg","link4201":"https://i.redd.it/v2xkxdxbiml21.jpg","link4202":"https://i.redd.it/v3vxx1h0fiu21.jpg","link4203":"https://i.redd.it/v4b16seeuuk31.jpg","link4204":"https://i.redd.it/v4dos7z616y31.jpg","link4205":"https://i.redd.it/v5dnueggjko31.jpg","link4206":"https://i.redd.it/v692jg199ux21.jpg","link4207":"https://i.redd.it/v6iq60azkt241.jpg","link4208":"https://i.redd.it/v6nd8kuqjdr31.jpg","link4209":"https://i.redd.it/v6rfrzaykmh31.jpg","link4210":"https://i.redd.it/v82kumscf2g31.jpg","link4211":"https://i.redd.it/v8eyll5etjv31.jpg","link4212":"https://i.redd.it/v8p1jqebmi621.jpg","link4213":"https://i.redd.it/v8wfkvrxq7e31.jpg","link4214":"https://i.redd.it/v93vn5a5sgw31.jpg","link4215":"https://i.redd.it/va05amglqn141.jpg","link4216":"https://i.redd.it/vatrahhjvm141.jpg","link4217":"https://i.redd.it/vauumap9mrx31.jpg","link4218":"https://i.redd.it/vb33gnjglnm31.jpg","link4219":"https://i.redd.it/vb5yy28ypl531.jpg","link4220":"https://i.redd.it/vbcqftlgpxm21.jpg","link4221":"https://i.redd.it/vbx2nshhh7w31.jpg","link4222":"https://i.redd.it/vc4ongw1z2o21.jpg","link4223":"https://i.redd.it/vd3puqck0mq31.jpg","link4224":"https://i.redd.it/vdrqdpqbk6y31.jpg","link4225":"https://i.redd.it/ve1xbbrqdt831.jpg","link4226":"https://i.redd.it/ve6osetbh6a21.jpg","link4227":"https://i.redd.it/vf0utq8dy2o21.jpg","link4228":"https://i.redd.it/vf46q6yrd3e11.jpg","link4229":"https://i.redd.it/vfid87hltut31.jpg","link4230":"https://i.redd.it/vfl7g2b3di111.jpg","link4231":"https://i.redd.it/vfqqor7apq441.jpg","link4232":"https://i.redd.it/vg76ellko2w31.jpg","link4233":"https://i.redd.it/vga4rgkpsze11.jpg","link4234":"https://i.redd.it/vgp73388vmm21.jpg","link4235":"https://i.redd.it/vh032uuyd8r21.jpg","link4236":"https://i.redd.it/vhovcj77fdw21.jpg","link4237":"https://i.redd.it/vhvef8may6041.jpg","link4238":"https://i.redd.it/vieb9eciyes21.jpg","link4239":"https://i.redd.it/viyoz8jmxsv21.jpg","link4240":"https://i.redd.it/vjjs489z4xg31.jpg","link4241":"https://i.redd.it/vkc38l408qd11.jpg","link4242":"https://i.redd.it/vkjkqcrn71341.jpg","link4243":"https://i.redd.it/vmfwca2qr6921.jpg","link4244":"https://i.redd.it/vnf5336ko5g21.jpg","link4245":"https://i.redd.it/vnmkra3wmyi21.jpg","link4246":"https://i.redd.it/vnq0ui49li441.jpg","link4247":"https://i.redd.it/vnv5x461xi341.jpg","link4248":"https://i.redd.it/vnwbcivl4ij11.jpg","link4249":"https://i.redd.it/vo9hgmhcbj621.jpg","link4250":"https://i.redd.it/vpgnzvbd0cf31.jpg","link4251":"https://i.redd.it/vpiaq4ylpq421.jpg","link4252":"https://i.redd.it/vq3dyroyvk531.jpg","link4253":"https://i.redd.it/vqbie9dwbkg31.jpg","link4254":"https://i.redd.it/vr79qbv17sl31.jpg","link4255":"https://i.redd.it/vr8ol62kc5a31.jpg","link4256":"https://i.redd.it/vra6yknvfxw31.jpg","link4257":"https://i.redd.it/vswotay5x3731.jpg","link4258":"https://i.redd.it/vt0z34qnu8m21.jpg","link4259":"https://i.redd.it/vt4mmfeud7v21.jpg","link4260":"https://i.redd.it/vtot8p6km6o21.jpg","link4261":"https://i.redd.it/vts6uwr1z2u21.jpg","link4262":"https://i.redd.it/vu6twskjvh931.jpg","link4263":"https://i.redd.it/vuusqqhk1i741.jpg","link4264":"https://i.redd.it/vvli9rdnnec11.jpg","link4265":"https://i.redd.it/vwh4sj61bbr31.jpg","link4266":"https://i.redd.it/vx27rsmyxy531.jpg","link4267":"https://i.redd.it/vxknaelsfsn21.jpg","link4268":"https://i.redd.it/vya1z18idi111.jpg","link4269":"https://i.redd.it/vyrwm4e06fc21.jpg","link4270":"https://i.redd.it/vz9v7llfaau21.jpg","link4271":"https://i.redd.it/vzwa3cqt4he31.jpg","link4272":"https://i.redd.it/w0ekj3cy9tt11.jpg","link4273":"https://i.redd.it/w17qv3xorw741.jpg","link4274":"https://i.redd.it/w1aiiy3ewqw21.jpg","link4275":"https://i.redd.it/w1ebpiuik8721.jpg","link4276":"https://i.redd.it/w30n7i90yoa31.jpg","link4277":"https://i.redd.it/w33cunylxtv21.jpg","link4278":"https://i.redd.it/w3j3k5r2bez31.jpg","link4279":"https://i.redd.it/w4hpjij789a21.jpg","link4280":"https://i.redd.it/w591olqs7m241.jpg","link4281":"https://i.redd.it/w60yqb3exzf31.jpg","link4282":"https://i.redd.it/w6c17bbpow331.jpg","link4283":"https://i.redd.it/w6x33k3dav131.jpg","link4284":"https://i.redd.it/w700exevte441.jpg","link4285":"https://i.redd.it/w85p4psb6vx31.jpg","link4286":"https://i.redd.it/w87xmmusdi111.jpg","link4287":"https://i.redd.it/w8b022roe3u31.jpg","link4288":"https://i.redd.it/w9vcyle404441.jpg","link4289":"https://i.redd.it/wbt4czku23n31.jpg","link4290":"https://i.redd.it/wc2490seimo31.jpg","link4291":"https://i.redd.it/wcjx6d2v3pz31.jpg","link4292":"https://i.redd.it/wd3sthls3sd11.jpg","link4293":"https://i.redd.it/wd652hqly8r21.jpg","link4294":"https://i.redd.it/wda6pnnm3fs21.jpg","link4295":"https://i.redd.it/weeflsu4unq11.jpg","link4296":"https://i.redd.it/wewbk1i53y231.jpg","link4297":"https://i.redd.it/wfnp0lhr1zd21.jpg","link4298":"https://i.redd.it/wfon0ygvctj31.jpg","link4299":"https://i.redd.it/wfuoih1wd1y31.jpg","link4300":"https://i.redd.it/wfv0rub006421.jpg","link4301":"https://i.redd.it/wh4vuuwsvh631.jpg","link4302":"https://i.redd.it/wh9zs0yzw0831.jpg","link4303":"https://i.redd.it/whgn6iucp2f21.jpg","link4304":"https://i.redd.it/wioboufz73w31.jpg","link4305":"https://i.redd.it/wj79t7rw6v041.jpg","link4306":"https://i.redd.it/wjkvuqt6x8s11.jpg","link4307":"https://i.redd.it/wjmldjo0n5f31.jpg","link4308":"https://i.redd.it/wk6geg4ajmz11.jpg","link4309":"https://i.redd.it/wki7o8wyejk21.jpg","link4310":"https://i.redd.it/wlmebzcjpr621.jpg","link4311":"https://i.redd.it/wlshrg8acrk21.jpg","link4312":"https://i.redd.it/wmcblmzc96241.jpg","link4313":"https://i.redd.it/wmfjsrisq2m11.jpg","link4314":"https://i.redd.it/wmqf9m9qp3331.jpg","link4315":"https://i.redd.it/wmy4tnsas5531.jpg","link4316":"https://i.redd.it/wn1apqmzq3h31.jpg","link4317":"https://i.redd.it/wnks4rtzj3531.jpg","link4318":"https://i.redd.it/wnpt75t7s1e31.jpg","link4319":"https://i.redd.it/wntsahrcfgq21.jpg","link4320":"https://i.redd.it/woaarcjy5s141.jpg","link4321":"https://i.redd.it/wod2sdqti3u21.jpg","link4322":"https://i.redd.it/wowg9ad92hu21.jpg","link4323":"https://i.redd.it/wp5onewqdx331.jpg","link4324":"https://i.redd.it/wp804up9bqn31.jpg","link4325":"https://i.redd.it/wprh6pvukfj21.jpg","link4326":"https://i.redd.it/wpspjks008541.jpg","link4327":"https://i.redd.it/wq1ums27oym21.jpg","link4328":"https://i.redd.it/wqnbsq411zj31.jpg","link4329":"https://i.redd.it/wrht3v2zfd731.jpg","link4330":"https://i.redd.it/wrk3yvhwfr331.jpg","link4331":"https://i.redd.it/wrkbgcvmpkd11.jpg","link4332":"https://i.redd.it/wrzpa40q44j11.jpg","link4333":"https://i.redd.it/wsy535du1si21.jpg","link4334":"https://i.redd.it/wtpdkhjc3bs31.jpg","link4335":"https://i.redd.it/wtrvtmbn5na21.jpg","link4336":"https://i.redd.it/wurf12mobuy31.jpg","link4337":"https://i.redd.it/wv9g5ap5kbm21.jpg","link4338":"https://i.redd.it/ww1rzm0kbm021.jpg","link4339":"https://i.redd.it/wxo8ivjgcoe31.jpg","link4340":"https://i.redd.it/wybg3oid5wx21.jpg","link4341":"https://i.redd.it/wz2mbmzt20441.jpg","link4342":"https://i.redd.it/wziqjnc4fhw31.jpg","link4343":"https://i.redd.it/wzntkqtut3841.jpg","link4344":"https://i.redd.it/wzu2zvjha3i31.jpg","link4345":"https://i.redd.it/x06g367ixpc31.jpg","link4346":"https://i.redd.it/x11h8msdul131.jpg","link4347":"https://i.redd.it/x1j0qr3pdi111.jpg","link4348":"https://i.redd.it/x29oyfxsvxf21.jpg","link4349":"https://i.redd.it/x37azlpojqh31.jpg","link4350":"https://i.redd.it/x3qqwqjo1rf31.jpg","link4351":"https://i.redd.it/x4hdb5z3tqh21.jpg","link4352":"https://i.redd.it/x4i8dtguclb31.jpg","link4353":"https://i.redd.it/x4wq21ok0wc31.jpg","link4354":"https://i.redd.it/x581mceaf7a21.jpg","link4355":"https://i.redd.it/x5bf2dvw13t31.jpg","link4356":"https://i.redd.it/x5sg4u5te7441.jpg","link4357":"https://i.redd.it/x5sjo18k7vb31.jpg","link4358":"https://i.redd.it/x62e5jl9xq241.jpg","link4359":"https://i.redd.it/x76ria7ucng21.jpg","link4360":"https://i.redd.it/x79uz7b4z9n31.jpg","link4361":"https://i.redd.it/x7jjx7nojc931.jpg","link4362":"https://i.redd.it/x7t5njfyisw21.jpg","link4363":"https://i.redd.it/x9zfoxt2h6731.jpg","link4364":"https://i.redd.it/xa2siuluxub31.jpg","link4365":"https://i.redd.it/xa531vs07cr31.jpg","link4366":"https://i.redd.it/xan32bxt2sd11.jpg","link4367":"https://i.redd.it/xb8c5pdykc931.jpg","link4368":"https://i.redd.it/xcc7x461t4k31.jpg","link4369":"https://i.redd.it/xd5ueczu2w421.jpg","link4370":"https://i.redd.it/xd9pi1to3qv21.jpg","link4371":"https://i.redd.it/xdoyp47l1mb21.jpg","link4372":"https://i.redd.it/xdrcnle3jml31.jpg","link4373":"https://i.redd.it/xe4sbg661bx31.jpg","link4374":"https://i.redd.it/xeutdvcqbl641.jpg","link4375":"https://i.redd.it/xfe1p107dtm21.jpg","link4376":"https://i.redd.it/xflsqfqnwb231.jpg","link4377":"https://i.redd.it/xftkqubon3t31.jpg","link4378":"https://i.redd.it/xh3jgn3zrt341.jpg","link4379":"https://i.redd.it/xho9uizs6u541.jpg","link4380":"https://i.redd.it/xiulvq8vdrt31.jpg","link4381":"https://i.redd.it/xkv8gm8ef8g31.jpg","link4382":"https://i.redd.it/xl8uontq96k21.jpg","link4383":"https://i.redd.it/xlae6vf4pqc11.jpg","link4384":"https://i.redd.it/xlae82uvsr631.jpg","link4385":"https://i.redd.it/xm68hi8n1mt31.jpg","link4386":"https://i.redd.it/xmvrturrj5h21.jpg","link4387":"https://i.redd.it/xn3fkhpbc0721.jpg","link4388":"https://i.redd.it/xo31zjukufm21.jpg","link4389":"https://i.redd.it/xonw6eiz6zg31.jpg","link4390":"https://i.redd.it/xoobuvwldzs31.jpg","link4391":"https://i.redd.it/xp3lxx7yphg31.jpg","link4392":"https://i.redd.it/xpc06vlfg1721.jpg","link4393":"https://i.redd.it/xqh30mji9z031.jpg","link4394":"https://i.redd.it/xqpv30dtmf041.jpg","link4395":"https://i.redd.it/xqyv47930od31.jpg","link4396":"https://i.redd.it/xr2r73h5wsz21.jpg","link4397":"https://i.redd.it/xr94rhlbyfo01.jpg","link4398":"https://i.redd.it/xrgjtl9j16k21.jpg","link4399":"https://i.redd.it/xscd194vp5s21.jpg","link4400":"https://i.redd.it/xsctza5zulu21.jpg","link4401":"https://i.redd.it/xsd87e4h5ox31.jpg","link4402":"https://i.redd.it/xsltwccx34n21.jpg","link4403":"https://i.redd.it/xt47wx2ctd541.jpg","link4404":"https://i.redd.it/xt55glmcfsl31.jpg","link4405":"https://i.redd.it/xuo913xgynq31.jpg","link4406":"https://i.redd.it/xv8ramvmy3o21.jpg","link4407":"https://i.redd.it/xv8u1vca3sd11.jpg","link4408":"https://i.redd.it/xvrb6y0vo0n21.jpg","link4409":"https://i.redd.it/xvz8arvusyt31.jpg","link4410":"https://i.redd.it/xwc596cqhre21.jpg","link4411":"https://i.redd.it/xx021ktiydz21.jpg","link4412":"https://i.redd.it/xxlp80a513731.jpg","link4413":"https://i.redd.it/xy2k756vlm441.jpg","link4414":"https://i.redd.it/xydnjf0zodc31.jpg","link4415":"https://i.redd.it/xz2omlgm7n241.jpg","link4416":"https://i.redd.it/y082yn6fcew21.jpg","link4417":"https://i.redd.it/y0iuimdu52c11.jpg","link4418":"https://i.redd.it/y196hqx6gbe11.jpg","link4419":"https://i.redd.it/y1fg2595q2h21.jpg","link4420":"https://i.redd.it/y1xiqzbbfu141.jpg","link4421":"https://i.redd.it/y21ei0qazr041.jpg","link4422":"https://i.redd.it/y2nbypl5s1541.jpg","link4423":"https://i.redd.it/y2yuy7ramll31.jpg","link4424":"https://i.redd.it/y3d5n24ihs021.jpg","link4425":"https://i.redd.it/y4a72a30q2u21.jpg","link4426":"https://i.redd.it/y5141t4l23u31.jpg","link4427":"https://i.redd.it/y6au2zg7mi621.jpg","link4428":"https://i.redd.it/y6gt0pmxl6441.jpg","link4429":"https://i.redd.it/y6jq6qcbjs631.jpg","link4430":"https://i.redd.it/y74i3870qq931.jpg","link4431":"https://i.redd.it/y7xq7c6r69m31.jpg","link4432":"https://i.redd.it/y7yqchcvvqf31.jpg","link4433":"https://i.redd.it/y85h9kov8ps21.jpg","link4434":"https://i.redd.it/y8wtt2b82kt21.jpg","link4435":"https://i.redd.it/y957qh5nt8131.jpg","link4436":"https://i.redd.it/y9g87m8fi1s21.jpg","link4437":"https://i.redd.it/yaraqwsmavb31.jpg","link4438":"https://i.redd.it/yaz9odvsnvt21.jpg","link4439":"https://i.redd.it/yb1dmgbkb2821.jpg","link4440":"https://i.redd.it/yb3c62hpecp21.jpg","link4441":"https://i.redd.it/yb3eut7yzpb11.jpg","link4442":"https://i.redd.it/yc0d6cozois31.jpg","link4443":"https://i.redd.it/yc9yq3avujt31.jpg","link4444":"https://i.redd.it/ycgl2pmcpd231.jpg","link4445":"https://i.redd.it/yd13ez7nips21.jpg","link4446":"https://i.redd.it/yd6uqrvxbi111.jpg","link4447":"https://i.redd.it/ydrnkembpkd11.jpg","link4448":"https://i.redd.it/ye4k9akeckl31.jpg","link4449":"https://i.redd.it/yedvq18f5pm21.jpg","link4450":"https://i.redd.it/yef7xi1l1mz21.jpg","link4451":"https://i.redd.it/yfc0sv5l2x331.jpg","link4452":"https://i.redd.it/yffw9vogy3v21.jpg","link4453":"https://i.redd.it/yj0afj346is31.jpg","link4454":"https://i.redd.it/yj38n6he6r721.jpg","link4455":"https://i.redd.it/yju002m9ooq21.jpg","link4456":"https://i.redd.it/yk1lopbw06b31.jpg","link4457":"https://i.redd.it/yk4kwggwweb31.jpg","link4458":"https://i.redd.it/ykygot10qpf31.jpg","link4459":"https://i.redd.it/yl21yjw4ymq31.jpg","link4460":"https://i.redd.it/ylrdwgkmsll31.jpg","link4461":"https://i.redd.it/ylz7d331jbo21.jpg","link4462":"https://i.redd.it/ymadrqsy86c21.jpg","link4463":"https://i.redd.it/ymiblx5mm2821.jpg","link4464":"https://i.redd.it/ymjx9hsdsmi21.jpg","link4465":"https://i.redd.it/ymkul5687av31.jpg","link4466":"https://i.redd.it/yml39qveojo31.jpg","link4467":"https://i.redd.it/ynf0dmgyo9t21.jpg","link4468":"https://i.redd.it/ynjltty66p031.jpg","link4469":"https://i.redd.it/yo8wt1rh98y21.jpg","link4470":"https://i.redd.it/yotbjf1bxlk31.jpg","link4471":"https://i.redd.it/yp3eycn515931.jpg","link4472":"https://i.redd.it/yq99xxhvxdp31.jpg","link4473":"https://i.redd.it/yqss5zik9m341.jpg","link4474":"https://i.redd.it/yqtj2pmmea731.jpg","link4475":"https://i.redd.it/yr7sfrc9xba01.jpg","link4476":"https://i.redd.it/yraentpdfz431.jpg","link4477":"https://i.redd.it/yrfea3qiji731.jpg","link4478":"https://i.redd.it/yrwpglzmr8c21.jpg","link4479":"https://i.redd.it/yrxjsil8fi721.jpg","link4480":"https://i.redd.it/yt210vpkv8841.jpg","link4481":"https://i.redd.it/ytmixsf40th31.jpg","link4482":"https://i.redd.it/ytnlaesjwlp31.jpg","link4483":"https://i.redd.it/yu5ko1k3raj31.jpg","link4484":"https://i.redd.it/yu9wommwub541.jpg","link4485":"https://i.redd.it/yv15zklye1q21.jpg","link4486":"https://i.redd.it/yv9h6i9pwnx31.jpg","link4487":"https://i.redd.it/yvicurb73qo31.jpg","link4488":"https://i.redd.it/yvpp526g19v21.jpg","link4489":"https://i.redd.it/yvu3eawzqu431.jpg","link4490":"https://i.redd.it/ywddl3da5d411.jpg","link4491":"https://i.redd.it/ywwa3fd8mt041.jpg","link4492":"https://i.redd.it/yx2ueojjvfy21.jpg","link4493":"https://i.redd.it/z0qnes12kzs21.jpg","link4494":"https://i.redd.it/z0yky0mdkkm21.jpg","link4495":"https://i.redd.it/z1ok8phd6r141.jpg","link4496":"https://i.redd.it/z1r3tl871kf31.jpg","link4497":"https://i.redd.it/z2tvjdqvehy21.jpg","link4498":"https://i.redd.it/z337970w0kf31.jpg","link4499":"https://i.redd.it/z3h19zjnar631.jpg","link4500":"https://i.redd.it/z3i0n63svbf31.jpg","link4501":"https://i.redd.it/z3nj3a5dh0141.jpg","link4502":"https://i.redd.it/z3p1hcuhk1q31.jpg","link4503":"https://i.redd.it/z5cxzzreqmg21.jpg","link4504":"https://i.redd.it/z60o1c85kno21.jpg","link4505":"https://i.redd.it/z7agopgs4zi21.jpg","link4506":"https://i.redd.it/z8ecoznrai111.jpg","link4507":"https://i.redd.it/z8h24g5cgxc31.jpg","link4508":"https://i.redd.it/z90hqyqulje21.jpg","link4509":"https://i.redd.it/z9b767rxci111.jpg","link4510":"https://i.redd.it/zaobhbovn5g21.jpg","link4511":"https://i.redd.it/zczcxqdw09i31.jpg","link4512":"https://i.redd.it/zd1uy86wfar21.jpg","link4513":"https://i.redd.it/zdt9nvf66k841.jpg","link4514":"https://i.redd.it/zdu4nye47a331.jpg","link4515":"https://i.redd.it/ze22pcy2pw721.jpg","link4516":"https://i.redd.it/zenj788l27a21.jpg","link4517":"https://i.redd.it/zg1xb94k7w841.jpg","link4518":"https://i.redd.it/zgapi6h7l7421.jpg","link4519":"https://i.redd.it/zgrukq71plw21.jpg","link4520":"https://i.redd.it/zh91t8fw87u21.jpg","link4521":"https://i.redd.it/zhec9yqq80t31.jpg","link4522":"https://i.redd.it/zi6klbn7fme31.jpg","link4523":"https://i.redd.it/zinhk3mmkcp31.jpg","link4524":"https://i.redd.it/zja0k4310gq21.jpg","link4525":"https://i.redd.it/zjbd3hzs59x31.jpg","link4526":"https://i.redd.it/zjtahuyfqg541.jpg","link4527":"https://i.redd.it/zk3m4suipw721.jpg","link4528":"https://i.redd.it/zkmhmu83jqk21.jpg","link4529":"https://i.redd.it/zkmzyty1uc641.jpg","link4530":"https://i.redd.it/zknn67v36f341.jpg","link4531":"https://i.redd.it/zkqhjtnh5oz11.jpg","link4532":"https://i.redd.it/zkts8wgyx9141.jpg","link4533":"https://i.redd.it/zkzype9a7fl21.jpg","link4534":"https://i.redd.it/zm0zp7tjou531.jpg","link4535":"https://i.redd.it/zmfec6hmr5r31.jpg","link4536":"https://i.redd.it/zmjnwv5gtqf11.jpg","link4537":"https://i.redd.it/zmueli501s841.jpg","link4538":"https://i.redd.it/zn1wfnwad6841.jpg","link4539":"https://i.redd.it/zn8q8oee4aw31.jpg","link4540":"https://i.redd.it/znlpr1rxd7w21.jpg","link4541":"https://i.redd.it/zogc6lct6se11.jpg","link4542":"https://i.redd.it/zorz942f6nq21.jpg","link4543":"https://i.redd.it/zoz7dtagq5e31.jpg","link4544":"https://i.redd.it/zp0c2w7udyx31.jpg","link4545":"https://i.redd.it/zp5v0nqrb3541.jpg","link4546":"https://i.redd.it/zpfppsva7q911.jpg","link4547":"https://i.redd.it/zpo7yzvam7631.jpg","link4548":"https://i.redd.it/zq95tl34zxr31.jpg","link4549":"https://i.redd.it/zqjx44rq3bv31.jpg","link4550":"https://i.redd.it/zqx0f1lyru721.jpg","link4551":"https://i.redd.it/zqzz1an592n31.jpg","link4552":"https://i.redd.it/zr1ftnqhs8r21.jpg","link4553":"https://i.redd.it/zrfngnfowv041.jpg","link4554":"https://i.redd.it/zrnfv46zywm21.jpg","link4555":"https://i.redd.it/zrnqi1qhuot31.jpg","link4556":"https://i.redd.it/zrpa8u8ng6l31.jpg","link4557":"https://i.redd.it/zryyxx2kqmc11.jpg","link4558":"https://i.redd.it/zscgi9cahnb31.jpg","link4559":"https://i.redd.it/zt1ws349vsf11.jpg","link4560":"https://i.redd.it/zta2pxmk3sd11.jpg","link4561":"https://i.redd.it/ztip7xkmpb431.jpg","link4562":"https://i.redd.it/ztle45lbz4e21.jpg","link4563":"https://i.redd.it/zud8e4jforb31.jpg","link4564":"https://i.redd.it/zuttnivboj841.jpg","link4565":"https://i.redd.it/zuyk1zxwecq31.jpg","link4566":"https://i.redd.it/zw4if3obwyc31.jpg","link4567":"https://i.redd.it/zw6qwfb5iek31.jpg","link4568":"https://i.redd.it/zx59ix9wxld21.jpg","link4569":"https://i.redd.it/zykqf3ziang31.jpg","link4570":"https://i.redd.it/zywjni0fmpd31.jpg","link4571":"https://i.redd.it/zz41zvk1ehp21.jpg","link4572":"https://i.redd.it/zzj27iv6u6g31.jpg","link4573":"https://i.redd.it/zznwr0t73xh31.jpg","link4574":"https://i1.yuki.la/5/20/1a186df2ef0aee888e49eeedf27a57b0fea7a9d212c7cc6bb44afb61a35ba205.jpg","link4575":"https://i2.yuki.la/9/0c/5f4a4d8b7a5c9d668c2da20b14de86c965246cbe890938fe2a0e177b850270c9.jpg","link4576":"https://img.rule34.xxx//images/1979/b84be533024a3d1dcc6b01c0cb7358c9.jpeg?2686173","link4577":"https://img00.deviantart.net/844a/i/2018/109/7/e/commission__big_gamble_by_blunt_katana-dc99nvj.jpg","link4578":"https://img2.gelbooru.com/images/86/82/8682f2ae300f8550d1c07ad23dccf036.jpg","link4579":"https://imgur.com/06PpBxt.jpg","link4580":"https://imgur.com/BO2RpdS.jpg","link4581":"https://imgur.com/GIwSyN2.jpg","link4582":"https://imgur.com/HFslZZR.jpeg","link4583":"https://imgur.com/HlcZF5I.jpg","link4584":"https://imgur.com/c9GYmUy.jpeg","link4585":"https://imgur.com/hijqSWd.jpg","link4586":"https://imgur.com/p21o5M5.jpg","link4587":"https://imgur.com/sDSYpZt.jpg","link4588":"https://konachan.com/jpeg/aec5a86b6f9453bb9bbb94d3d8a17a7a/Konachan.com%20-%20265625%20blush%20bra%20breast_grab%20breasts%20catgirl%20game_cg%20long_hair%20male%20nipples%20panties%20panty_pull%20purple_eyes%20sex%20shirt_lift%20skyfish%20tail%20thighhighs%20underwear.jpg","link4589":"https://orig00.deviantart.net/5866/f/2018/164/f/2/gerudo_link_25___live_for_the_applause_by_heartgear-dbkxv3a.jpg","link4590":"https://pbs.twimg.com/media/D30F-FdUYAEgSvR.jpg","link4591":"https://pbs.twimg.com/media/Dr2duP9WoAABxye.jpg","link4592":"https://pbs.twimg.com/media/DrqXmZRWoAAT60w.jpg","link4593":"https://pbs.twimg.com/media/DuP2owaUwAE_Fs0.jpg","link4594":"https://pbs.twimg.com/media/DukF12jXcAEB1Hp.jpg","link4595":"https://pbs.twimg.com/media/DvCIByMU8AARrT_.jpg","link4596":"https://pictures.hentai-foundry.com/m/mavezar/576675/mavezar-576675-Ogre_Scout.jpg","link4597":"https://pictures.hentai-foundry.com/m/monkeyfluff/589791/monkeyfluff-589791-Male_to_female_draenei.jpg","link4598":"https://pictures.hentai-foundry.com/n/Nyuunzi/632847/Nyuunzi-632847-Big_Titty_Goth_Draenei_GF_Female.jpg","link4599":"https://puu.sh/Ew9yQ/d96c3445d6.jpg","link4600":"https://scontent-ort2-2.xx.fbcdn.net/v/t1.0-9/fr/cp0/e15/q65/35531947_2031086003806773_7873165560308039680_n.jpg?_nc_cat=0&efg=eyJpIjoidCJ9&oh=5e3f76d55329eb77687d944f4ae5c897&oe=5BAC7B41","link4601":"https://us.rule34.xxx//images/3007/23f302e78f7eeebc6146dafb16b6a5bd.jpeg?3371269","link4602":"https://us.rule34.xxx/images/2797/f1b6240ad216cba6604c1e709bc054f8.jpeg","link4603":"https://www.imgur.com/4JSkzTv.jpg","link4604":"https://www.imgur.com/4pc3epd.jpg","link4605":"https://www.imgur.com/JoNkh7K.jpg","link4606":"https://www.imgur.com/W8eCY8H.jpg","link4607":"https://www.imgur.com/Xrh4hm6.jpg","link4608":"https://www.imgur.com/jJeYXt5.jpg","link4609":"https://www.imgur.com/kTrcZyy.jpg","link4610":"https://www.imgur.com/myjnE3q.jpg","link4611":"https://www.imgur.com/vZLzUnu.jpg"} \ No newline at end of file diff --git a/commands/alt detector/aaction.js b/commands/alt detector/aaction.js new file mode 100644 index 00000000..e271cb20 --- /dev/null +++ b/commands/alt detector/aaction.js @@ -0,0 +1,56 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "aaction", + aliases: [], + usage: "", + category: "Alt Detector", + examples: ["aaction kick"], + description: "Pick the action fired towards the alt.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + let choices = ["none", "kick", "ban"] + if(!args[0]) return message.channel.send(new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} ${language.aactionNotValidChoice.replace("{allChoices}", choices.join(", "))}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + if(!choices.includes(args[0].toLowerCase())) return message.channel.send(new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} ${language.aactionNotValidChoice.replace("{allChoices}", choices.join(", ") )}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + await alt.findOne({ guildID: message.guild.id }, async (err, db) => { + if(!db) { + let newGuild = new alt({ + guildID: message.guild.id, + altDays: 7, + altModlog: '', + allowedAlts: [], + altAction: args[0].toLowerCase(), + altToggle: false, + notifier: false, + }) + + await newGuild.save() + .catch(err => { console.log( err ) }) + return message.channel.send(new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.success} ${language.aactionSuccess.replace("{action}", args[0])}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } + await db.updateOne({ + altAction: args[0].toLowerCase() + }) + + return message.channel.send(new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.success} ${language.aactionSuccess.replace("{action}", args[0])}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + }) + } +} \ No newline at end of file diff --git a/commands/alt detector/abypass.js b/commands/alt detector/abypass.js new file mode 100644 index 00000000..d95d4b79 --- /dev/null +++ b/commands/alt detector/abypass.js @@ -0,0 +1,75 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "abypass", + aliases: [], + usage: "", + category: "Alt Detector", + examples: ["abypass 402490971041824768"], + description: "Whitelist alt accounts of your choice.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + const client = message.client + + + await client.users.fetch(args[0]) + .then(u => { + + alt.findOne({ + guildID: message.guild.id + }, async (err, db) => { + + + + if(!db) { + let newGuild = new alt({ + guildID: message.guild.id, + altDays: 7, + altModlog: '', + allowedAlts: [args[0]], + altAction: 'none', + altToggle: false, + notifier: false, + }) + + await newGuild.save() + .catch(err => { console.log( err ) }) + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.abypassSuccess.replace("{userID}", args[0]))) + + } + + let oldAllowedAlts = db.allowedAlts //[] + if(guildDB.isPremium === "false") { + if(oldAllowedAlts.length === 10) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.abypassNotPremium10)) + } + if(guildDB.isPremium === "true") { + if(oldAllowedAlts.length === 50) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.abypassNotPremium10.replace("10", "50"))) + } + oldAllowedAlts.push(u.id) + + await db.updateOne({ + allowedAlts: oldAllowedAlts + }) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.abypassSuccess.replace("{userID}", args[0]))) + }) + }) + .catch(err => { + message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.abypassNotValidUser)) + }) + } +} \ No newline at end of file diff --git a/commands/alt detector/adisallow.js b/commands/alt detector/adisallow.js new file mode 100644 index 00000000..320972ce --- /dev/null +++ b/commands/alt detector/adisallow.js @@ -0,0 +1,69 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "adisallow", + aliases: [], + usage: "", + category: "Alt Detector", + examples: ["adisallow 402490971041824768"], + description: "Remove an alt account off the whitelist.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + const client = message.client + + + await alt.findOne({ guildID: message.guild.id }, async(err, db) => { + if(!db) { + let newGuild = new alt({ + guildID: message.guild.id, + altDays: 7 , + altModlog: '', + allowedAlts: [], + altAction: 'none', + altToggle: false, + notifier: false, + }) + + await newGuild.save() + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.adisallowNotInArray)) + } + if(!args[0]) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.adisallowNotInArray)) + + if(!db.allowedAlts.includes(args[0])) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.adisallowNotInArray)) + + let arr = db.allowedAlts + let newArr = removeA(arr, args[0]) + + await db.updateOne({ + allowedAlts: newArr + }) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.adisallowSucess)) + +function removeA(arr) { + var what, a = arguments, L = a.length, ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} + }) + } + +} \ No newline at end of file diff --git a/commands/alt detector/amodlog.js b/commands/alt detector/amodlog.js new file mode 100644 index 00000000..6fe6acd9 --- /dev/null +++ b/commands/alt detector/amodlog.js @@ -0,0 +1,57 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "amodlog", + aliases: [], + usage: "", + category: "Alt Detector", + examples: ["amodlog logchannel"], + description: "Set the channel in which logs will be sent.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + + + let channel = message.mentions.channels.first() || message.guild.channels.cache.find(ch => ch.name === args[0]) || message.guild.channels.cache.get(args[0]) + if(!channel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.amodlogNotValidChannel)) + + await alt.findOne({ guildID: message.guild.id }, async (err, db) => { + if(!db) { + let newGuild = new alt({ + guildID: message.guild.id, + altDays: 7, + altModlog: channel.id, + allowedAlts: [], + altAction: 'none', + altToggle: false, + notifier: false, + }) + + await newGuild.save() + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.amodlogSuccess.replace("{modLog}", "#" + channel.name))) + } + + await db.updateOne({ + altModlog: channel.id + }) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.amodlogSuccess.replace("{modLog}", "#" + channel.name))) + + }) + } +} \ No newline at end of file diff --git a/commands/alt detector/asetdays.js b/commands/alt detector/asetdays.js new file mode 100644 index 00000000..4e76d61f --- /dev/null +++ b/commands/alt detector/asetdays.js @@ -0,0 +1,65 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "asetdays", + aliases: ["asd"], + category: "Alt Detector", + usage: "", + description: "Set the amount of days of the alt age.", + examples: ["asetdays 7"], + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + const client = message.client + + + let days = args[0] + if(!days) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.setdaysInvalidArg)) + if(isNaN(days)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.setdaysInvalidArg)) + + let day = Number(days) + + if(day > 100) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} Please do not exceed the length of 100 days.`)); + + + await alt.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) { + let newGuild = new alt({ + guildID: message.guild.id, + altDays: days, + altModlog: '', + allowedAlts: [], + altAction: 'none', + altToggle: false, + notifier: false, + }) + + await newGuild.save() + .catch(err => { console.log( err ) }) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.setdaysSuccess)) + + } + + await db.updateOne({ + altDays: day, + }) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.setdaysSuccess)) + }) + } +} \ No newline at end of file diff --git a/commands/alt detector/atoggle.js b/commands/alt detector/atoggle.js new file mode 100644 index 00000000..601dc2f6 --- /dev/null +++ b/commands/alt detector/atoggle.js @@ -0,0 +1,63 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "atoggle", + aliases: [], + usage: "", + category: "Alt Detector", + examples: ["atoggle true"], + description: "Disable or Enable the altdetector Module.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + const client = message.client + + + let choices = ["true", "false"] + if(!args[0] || !choices.includes(args[0].toLowerCase())) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.aactionNotValidChoice.replace("{allChoices}", choices.join(", ")))) + + await alt.findOne({ guildID: message.guild.id }, async (err, db) => { + if(!db){ + let newGuild = new alt({ + guildID: message.guild.id, + altDays: 7 /*86400000*/, + altModlog: '', + allowedAlts: [], + altAction: 'none', + altToggle: args[0].toLowerCase(), + notifier: false, + }) + + await newGuild.save() + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.atoggleSuccess.replace("{choice}", args[0]))) + } + + await db.updateOne({ + altToggle: args[0].toLowerCase() + }) + + let choice + if(args[0].toLowerCase() === "true"){ + choice = "on" + } + else if(args[0].toLowerCase() === "false") { + choice = "off" + } + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.atoggleSuccess.replace("{toggle}", choice))) + + }) + } +} \ No newline at end of file diff --git a/commands/alt detector/identifyalts.js b/commands/alt detector/identifyalts.js new file mode 100644 index 00000000..f0d0b64a --- /dev/null +++ b/commands/alt detector/identifyalts.js @@ -0,0 +1,89 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); +const moment = require('moment') +const ReactionMenu = require('../../data/ReactionMenu.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "findalts", + aliases: ["identifyalt", "findalt", "identifyalts"], + usage: "", + category: "Alt Detector", + examples: ["identifyalts 30"], + description: "Find all alts in the guild with the provided account age (days)", + cooldown: 10, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + const client = message.client + + + + let days = args[0] + if(!days) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | Please provide a valid Days Duration`)) + + if(isNaN(days)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | Please provide a valid Days Duration`)) + + let day = Number(days) + + if(day > 100) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | You may only find alts of an account age of **100 days** or below`)) + + let array = [] + + message.guild.members.cache.forEach(async(user)=>{ + + let math = day * 86400000 + + let x = Date.now() - user.user.createdAt; + let created = Math.floor(x / 86400000); + + if(day > created) { + + array.push(`${user} (${user.user.tag} | ${user.id})\nCreated At: **${user.user.createdAt}**`) + } + + }) + + const interval = 10; + + + const embed = new discord.MessageEmbed() + .setTitle(`Alt Detector - Account age < ${days} Days`) + .setDescription(array.join("\n\n") || "No alts found") + .setColor(message.client.color.green) + +if (array.length <= interval) { + + const range = (array.length == 1) ? '[1]' : `[1 - ${array.length}]`; + message.channel.send(embed + .setTitle(`Alt Detector - Account age < ${days} Days`) + .setDescription(array.join('\n\n')) + ); + + } else { + + embed + .setTitle(`Alt Detector - Account age < ${days} Days`) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ); + + new ReactionMenu(message.client, message.channel, message.member, embed, array, interval); + } + + + + } + + +} + + diff --git a/commands/alt detector/youngest.js b/commands/alt detector/youngest.js new file mode 100644 index 00000000..71b44b3b --- /dev/null +++ b/commands/alt detector/youngest.js @@ -0,0 +1,89 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const alt = require("../../models/altdetector.js"); +const moment = require('moment') +const ms = require("ms") +const ReactionMenu = require('../../data/ReactionMenu.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "youngest", + aliases: ["young"], + usage: "", + category: "Alt Detector", + examples: ["youngest 30"], + description: "Find all youngest alts with the provided join date (days)", + cooldown: 10, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + const client = message.client + + + + let days = args[0] + if(!days) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | Please provide a valid Days Duration`)) + + if(isNaN(days)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | Please provide a valid Days Duration`)) + + let day = Number(days) + + if(day > 100) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${message.client.emoji.fail} | You may only find alts of an account age of **100 days** or below`)) + + let array = [] + + message.guild.members.cache.forEach(async(user)=>{ + + let math = day * 86400000 + + let x = Date.now() - user.joinedAt; + let created = Math.floor(x / 86400000); + + if(day > created) { + + array.push(`${user} (${user.user.tag} | ${user.id})\nJoined At: **${user.joinedAt}**`) + } + + }) + + const interval = 10; + + + const embed = new discord.MessageEmbed() + .setTitle(`Alt Detector - Join age < ${days} Days`) + .setDescription(array.join("\n\n") || "No alts found") + .setColor(message.client.color.green) + +if (array.length <= interval) { + + const range = (array.length == 1) ? '[1]' : `[1 - ${array.length}]`; + message.channel.send(embed + .setTitle(`Alt Detector - Join age < ${days} Days`) + .setDescription(array.join('\n\n')) + ); + + } else { + + embed + .setTitle(`Alt Detector - Join age < ${days} Days`) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ); + + new ReactionMenu(message.client, message.channel, message.member, embed, array, interval); + } + + + + } + + +} + + diff --git a/commands/applications/addquestions.js b/commands/applications/addquestions.js new file mode 100644 index 00000000..e874221d --- /dev/null +++ b/commands/applications/addquestions.js @@ -0,0 +1,75 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "addquestion", + aliases: ["addquestions", "applicationquestions", "appquestions"], + usage: "", + category: "Applications", + examples: ["addquestion Question1 | Question2"], + description: "Add questions to the list and when you apply they will be there", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + let questions = args.slice(0).join(" ") + + + let maxQuestions = 10 + if(guildDB.isPremium === true) { + maxQuestions = 25 + } + if(!questions) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addquestionMissingArg)) + let split = questions.split("|") + + await app.findOne({ + guildID: message.guild.id + }, async (err, db) => { + + + let arr = [] + + if(!db) { + let actualArr = arr.concat(split) + console.log(actualArr) + if(actualArr.length > maxQuestions) { + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addquestionMoreThanLength.replace("{amountLength}", maxQuestions))) + } + let newAppDB = new app({ + guildID: message.guild.id, + questions: actualArr, + appToggle: false, + appLogs: ' ' + }) + await newAppDB.save().catch((err) => {console.log(err)}) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.addquestionSuccess)) + } + + let ar = await db.questions + let actualArr = ar.concat(split) + + if(actualArr.length > maxQuestions) { + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addquestionMoreThanLength.replace("{amountLength}", maxQuestions))) + } + await db.updateOne({ + questions: actualArr + }) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.addquestionSuccess)) +}) + + } +} \ No newline at end of file diff --git a/commands/applications/apply.js b/commands/applications/apply.js new file mode 100644 index 00000000..8eaff92f --- /dev/null +++ b/commands/applications/apply.js @@ -0,0 +1,65 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "apply", + aliases: [], + usage: "", + category: "Applications", + examples: ["apply"], + description: "Apply in the current servers, or answer a few questions", + cooldown: 5, + + }) + } + + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + const closed = new discord.MessageEmbed() + .setDescription(`${message.client.emoji.fail} | The current does not have any form to apply to`) + .setColor(message.client.color.red) + + const closed2 = new discord.MessageEmbed() + .setDescription(`${message.client.emoji.fail} | I could not find the guild's apply Log channel. Please make sure to let an admin know.`) + .setColor(message.client.color.red) + + + let db = await app.findOne({ + guildID: message.guild.id + }) + + if(!db) { + let newAppDB = new app({ + guildID: message.guild.id, + questions: [], + appToggle: false, + appLogs: null + }) + await newAppDB.save().catch((err) => {console.log(err)}) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(closed)) + } + + + if(db.questions.length === 0 || db.questions.length < 1) return message.channel.send(closed) ; + const channel = await message.guild.channels.cache.get(db.appLogs); + if(!channel) return message.channel.send(closed); + await message.author.send(new discord.MessageEmbed().setColor(message.client.color.green).setFooter('Powered by Pogy.xyz').setDescription(`${message.client.emoji.success} | You can apply to the form in **${message.guild.name}** [by clicking here](https://pogy.xyz/apply/${message.guild.id})`)) + .then(message.channel.send(`Form sent by DMs - ${message.author}`)) + .catch(()=>{ + return message.channel.send(` ${message.client.emoji.fail} Couldn't send you the form, your dms are closed - ${message.author}`) + }) + + + + } + } diff --git a/commands/applications/applyLog.js b/commands/applications/applyLog.js new file mode 100644 index 00000000..61280234 --- /dev/null +++ b/commands/applications/applyLog.js @@ -0,0 +1,72 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); +const MessageEmbed = require("discord.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "applylog", + aliases: ["applychannel", "applylogs"], + usage: "enable #channel | disable", + category: "Applications", + examples: ["apply"], + description: "Set's the guild's apply Logs", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + + }) + } + + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + if (args.length < 1) { + return message.channel.send( new discord.MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} | Correct usage **enable #channel** | disable`)); + } + + if (args.includes('disable')) { + await app.findOne({ + guildID: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + appLogs: null + }) + .catch(err => console.error(err)); + + return message.channel.send( new discord.MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} | Disabled the form Module!`)); + }); + return; + } + + const channel = await message.mentions.channels.first(); + + if (!channel) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} Please provide a valid Channel`)); + + await app.findOne({ + guildID: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + appLogs: channel.id + }) + .catch(err => console.error(err)); + + return message.channel.send( new discord.MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} Set the application log channel to ${channel}`)); + }); + + } + } diff --git a/commands/applications/approve.js b/commands/applications/approve.js new file mode 100644 index 00000000..615f3dec --- /dev/null +++ b/commands/applications/approve.js @@ -0,0 +1,101 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const App = require("../../models/application/application.js"); +const MessageEmbed = require("discord.js"); +const Paste = require("../../models/transcript.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "approveapp", + aliases: ["approveapplication", "approveapplication", "approveform"], + usage: " ", + category: "Applications", + examples: ["approve @peter OERKSOAE"], + description: "Approve an application in the guild.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + botPermission: ['MANAGE_ROLES'] + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + if(guildDB.isPremium === "false"){ + +message.channel.send(new discord.MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${message.client.emoji.fail} Slow down here, the current command is only for premium guilds.\n\n[Check Premium Here](https://pogy.xyz/premium)`)) + + return; + } + let app = await App.findOne({ + guildID: message.guild.id + }); + + if(!app){ +app = new App({ + guildID: message.guild.id + }); + + await app.save() + app = await App.findOne({ + guildID: message.guild.id + }); + } + let member = message.mentions.members.first(); + + if(!member) { + + try { + + member = await message.guild.members.fetch(args[0]) + + } catch { + +return message.channel.send(`${client.emoji.fail} Provide me with a valid member in the guild`) + + } + + + + } + + if(!member) return message.channel.send(`${client.emoji.fail} Provide me with a valid member in the guild`) + + const id = args[1] + const paste = await Paste.findOne({ + type: "form", + by: member.id, + _id: args[1] + }) + + if(!paste) return message.channel.send(`${client.emoji.fail} Could not find this application.`) + + + let reason = args.slice(2).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +if(paste.status === "approved") return message.channel.send(`${client.emoji.fail} | This application was already approved`) +if(paste.status === "declined") return message.channel.send(`${client.emoji.fail} | This application was already declined`) + +paste.status = "approved", +await paste.save().catch(()=>{}); + +const add_role = message.guild.roles.cache.get(app.add_role) +if(add_role){ + await member.roles.add(add_role).catch(()=>{}) +} +message.channel.send(new discord.MessageEmbed().setColor(message.client.color.green).setTitle(`Application Approved!`).setDescription(`${client.emoji.success} I have sucessfully approved this Application.\n\n**Application ID:** ${id}\n**Approved by:** ${message.author.tag}\n**Reason:** ${reason}`)) +if(app.dm === true){ +member.send(new discord.MessageEmbed().setColor(message.client.color.green).setTitle(`Form Approved!`).setDescription(`${client.emoji.success} Hey ${member.user.tag}, your form was Approved!\n\n**Application ID:** ${id}\n**Approved by:** ${message.author.tag}\n**Reason:** ${reason}`)).catch(()=>{ + message.channel.send(`Never Mind... I was able to approve the Application but couldn't dm ${member.user.tag} since their DMs are closed.'`) + +}) +} + + } +} \ No newline at end of file diff --git a/commands/applications/decline.js b/commands/applications/decline.js new file mode 100644 index 00000000..c3ce5e74 --- /dev/null +++ b/commands/applications/decline.js @@ -0,0 +1,103 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const App = require("../../models/application/application.js"); +const Paste = require("../../models/transcript.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "declineapp", + aliases: ["declineapplication", "declineappliction", "declineform"], + usage: " ", + category: "Applications", + examples: ["decline @peter OERKSOAE underage"], + description: "Decline an application in the guild.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + botPermission: ['MANAGE_ROLES'] + }) + } + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + if(guildDB.isPremium === "false"){ + +message.channel.send(new discord.MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${message.client.emoji.fail} Slow down here, the current command is only for premium guilds.\n\n[Check Premium Here](https://pogy.xyz/premium)`)) + + return; + } + let member = message.mentions.members.first(); + + if(!member) { + + try { + + member = await message.guild.members.fetch(args[0]) + + } catch { + +return message.channel.send(`${client.emoji.fail} Provide me with a valid member in the guild`) + + } + + + + } + + let app = await App.findOne({ + guildID: message.guild.id + }); + + if(!app){ +app = new App({ + guildID: message.guild.id + }); + + await app.save() + app = await App.findOne({ + guildID: message.guild.id + }); + } + + if(!member) return message.channel.send(`${client.emoji.fail} Provide me with a valid member in the guild`) + + const id = args[1] + const paste = await Paste.findOne({ + type: "form", + by: member.id, + _id: args[1] + }) + + if(!paste) return message.channel.send(`${client.emoji.fail} Could not find this application.`) + + + let reason = args.slice(2).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +if(paste.status === "approved") return message.channel.send(`${client.emoji.fail} | This application was already approved`) +if(paste.status === "declined") return message.channel.send(`${client.emoji.fail} | This application was already declined`) + +paste.status = "declined", +await paste.save().catch(()=>{}); + +const rem_role = message.guild.roles.cache.get(app.remove_role) +if(rem_role){ + await member.roles.remove(rem_role).catch(()=>{}) +} +message.channel.send(new discord.MessageEmbed().setColor(message.client.color.green).setTitle(`Application Declined!`).setDescription(`${client.emoji.success} I have sucessfully declined this application.\n\n**Application ID:** ${id}\n**Declined by:** ${message.author.tag}\n**Reason:** ${reason}`)) + +if(app.dm === true){ +member.send(new discord.MessageEmbed().setColor(message.client.color.red).setTitle(`Application Declined`).setDescription(`${client.emoji.fail} Hey ${member.user.tag}, your application was Declined.\n\n**Application ID:** ${id}\n**Declined by:** ${message.author.tag}\n**Reason:** ${reason}`)).catch(()=>{ + message.channel.send(`Never Mind... I was able to decline the application but couldn't dm ${member.user.tag} since their DMs are closed.'`) + +}) +} + + + } +} \ No newline at end of file diff --git a/commands/applications/questions.js b/commands/applications/questions.js new file mode 100644 index 00000000..0cdcc176 --- /dev/null +++ b/commands/applications/questions.js @@ -0,0 +1,50 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "questions", + aliases: ["question"], + category: "Applications", + examples: ["question"], + description: "Displays all the form questions in the server", + cooldown: 5, + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + await app.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) { + let newAppDB = new app({ + guildID: message.guild.id, + questions: [], + appToggle: false, + appLogs: ' ' + }) + + await newAppDB.save().catch((err) => {console.log(err)}) + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.questionNoQuest)) //No questions + } + + if(db.questions.length === 0 || db.questions.length < 1) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.questionNoQuest)) //No questions + + let text = "" + let arrLength = db.questions.length + let arr = db.questions + for(let i = 0; i < arrLength; i++) { + text += `\`${Number([i]) + 1}\` - ${arr[i]}\n` + } + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).addField("**" + language.questionTitle + "**", text)) + }) + } +} \ No newline at end of file diff --git a/commands/applications/remquestions.js b/commands/applications/remquestions.js new file mode 100644 index 00000000..d7b949ea --- /dev/null +++ b/commands/applications/remquestions.js @@ -0,0 +1,58 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "remquestion", + aliases: ["remquestions", "remquest", "remquests"], + usage: "", + category: "Applications", + examples: ["remquestion 1"], + description: "Removes a question off the list.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + let number = args[0] + if(!number || isNaN(number) || number === "0") return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.remquestion)) + + await app.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) { + let newAppDB = new app({ + guildID: message.guild.id, + questions: [], + appToggle: false, + appLogs: ' ' + }) + await newAppDB.save().catch((err) => {console.log(err)}) + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.remquestion)) + } + + let questions = db.questions + let num = Number(number) - 1 + + if(!questions[num]) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.remquestion)) + + questions.splice(num, 1) + + await db.updateOne({ + questions: questions + }) + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.remquestionSuccess)) + }) + } +} \ No newline at end of file diff --git a/commands/applications/review.js b/commands/applications/review.js new file mode 100644 index 00000000..4b63a404 --- /dev/null +++ b/commands/applications/review.js @@ -0,0 +1,85 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); +const Paste = require("../../models/transcript.js"); +const ReactionMenu = require('../../data/ReactionMenu.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "review", + aliases: ["reviewapps", "reviewapplication", "reviewapplications"], + usage: "", + category: "Applications", + + description: "Approve an application in the guild.", + cooldown: 5, + userPermission: ['MANAGE_GUILD'], + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + const conditional = { + type: "form", + status: null +} +const results = await Paste.find(conditional) +const array = [] +if (results && results.length) { + for (const result of results) { + + try { + const member = await message.guild.members.fetch(result.by) + + array.push(`Application #${result._id} | Submitter: ${member.user.tag}`) + } catch { + + } + + + } + +} + const interval = 15; + + + const embed = new discord.MessageEmbed() + .setTitle(`Applications - Review`) + .setDescription(`\`\`\`\n${array.join("\n\n")}\`\`\`` || "No Pending Applications Found") + .setColor(message.client.color.green) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ) + +if (array.length <= interval) { + + const range = (array.length == 1) ? '[1]' : `[1 - ${array.length}]`; + message.channel.send(embed + .setTitle(`Applications - Review ${range}`) + .setDescription(`\`\`\`\n${array.join("\n\n")}\`\`\``|| "No Pending Applications Found") + .setColor(message.client.color.green) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ) + ) + + + } else { + + embed + .setTitle(`Applications - Review`) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ); + + new ReactionMenu(message.client, message.channel, message.member, embed, array, interval); + } + + } +} \ No newline at end of file diff --git a/commands/config/afk.js b/commands/config/afk.js new file mode 100644 index 00000000..bc16ac49 --- /dev/null +++ b/commands/config/afk.js @@ -0,0 +1,66 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const afk = require('../../models/afk.js'); +const talkedRecently = new Set(); +const discord = require("discord.js"); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'afk', + aliases: [], + description: 'Set an AFK message!', + category: 'Config', + usage: [ '' ], + examples: [ 'afk Have to go!'], + cooldown: 20, + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const oldNickname = message.member.nickname || message.author.username; + const nickname = `[AFK] ${oldNickname}`; + const userr = message.mentions.users.first(); + if (userr) return message.channel.send(`${language.afk1}`) + let everyoneping = (args.indexOf("@everyone") > -1); + if (everyoneping === true) return message.channel.send(`${language.afk2}`) + if(args.length > 100){ + message.channel.send(`${language.afk3}`) + } + const content = args.join(" ") || 'AFK'; + + const afklist = await afk.findOne({ userID: message.author.id}); + + + + + await message.member.setNickname(nickname).catch(() => {}) + + if (!afklist) { + const newafk = new afk({ + userID: message.author.id, + serverID: message.guild.id, + reason: content, + oldNickname: oldNickname, + time: new Date() + }); + + const embed = new discord.MessageEmbed() + .setDescription(`${language.afk5} ${content}`) + .setColor(message.guild.me.displayHexColor) + .setAuthor(message.author.tag, message.author.displayAvatarURL({ dynamic : true })) + message.channel.send(embed) + newafk.save().catch((err) => console.error(err)); + } + } + + +}; \ No newline at end of file diff --git a/commands/config/anti-invites.js b/commands/config/anti-invites.js new file mode 100644 index 00000000..cd8c463e --- /dev/null +++ b/commands/config/anti-invites.js @@ -0,0 +1,81 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'anti-invites', + aliases: [ 'anti-invite', 'antiinvite', 'antiinvites' ], + description: 'Block Invites from the current server!', + category: 'Config', + usage: [ '' ], + examples: [ 'anti-invites enable', 'anti-invites disable' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + if (args.length < 1) { + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.antiinvites1}`)); + } + + if (!message.content.includes('enable') && !message.content.includes('disable')) { + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.antiinvites1}`)); + } + + if (args.includes('disable')) { + if(guildDB.antiInvites === true) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.moduleDisabled}`)); + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + antiInvites: false + }) + .catch(err => console.error(err)); + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.antiinvites3}`)); + }); + return; + } + + if (args.includes('enable')) { + + if(guildDB.antiInvites === true) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.moduleEnabled}`)); + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + antiInvites: true + }) + .catch(err => console.error(err)); + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.antiinvites4}`)); + }); + return; + } + } +}; \ No newline at end of file diff --git a/commands/config/anti-links.js b/commands/config/anti-links.js new file mode 100644 index 00000000..a83021bc --- /dev/null +++ b/commands/config/anti-links.js @@ -0,0 +1,82 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'anti-links', + aliases: [ 'anti-link', 'antilink', 'antilink' ], + description: 'Sets anti-invite if the message contains a link', + category: 'Config', + usage: [ '' ], + examples: [ 'anti-links enable', 'anti-links disable' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + if (args.length < 1) { + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.antiinvites1}`)); + } + + if (!message.content.includes('enable') && !message.content.includes('disable')) { + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.antiinvites1}`)); + } + + if (args.includes('disable')) { + + if(guildDB.antiLinks === false) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.moduleDisabled}`)); + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + antiLinks: false + }) + .catch(err => console.error(err)); + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.antilinks3}`)); + }); + return; + } + + if (args.includes('enable')) { + if(guildDB.antiLinks === true) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.moduleEnabled}`)); + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.updateOne({ + antiLinks: true + }) + .catch(err => console.error(err)); + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.antilinks4}`)); + }); + return; + } + } +}; \ No newline at end of file diff --git a/commands/config/autoresponse.js b/commands/config/autoresponse.js new file mode 100644 index 00000000..545bb306 --- /dev/null +++ b/commands/config/autoresponse.js @@ -0,0 +1,87 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const autoResponse = require('../../database/schemas/autoResponse.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'autoresponse', + description: 'Create a auto Response which gets triggered without prefix!', + category: 'Config', + userPermission: ['MANAGE_MESSAGES'], + aliases: [ 'ar', 'aresponse'], + usage: [ ' ' ], + examples: [ 'autoresponse pog Poggers!' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`) + const namee = args[0]; + + if (!namee) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}autoResponse \`\n\n${language.example} \`${prefix}autoResponse ping pong\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + let name = namee.toLowerCase() + const content = args.slice(1).join(' '); + if (!content) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}autoResponse \`\n\n${language.example} \`${prefix}autoResponse ping pong\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + if (namee.length > 30) return message.channel.send(`${message.client.emoji.fail} ${language.cc1}`); + if (content.length > 2000) return message.channel.send(`${message.client.emoji.fail} ${language.cc2}`); + + +if(guildDB.isPremium === "false"){ + const conditional = { + guildId: message.guild.id +} +const results = await autoResponse.find(conditional) + +if(results.length >= 10){ +message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${message.client.emoji.fail} Auto Response Limit Reached **(10)**\n\n[Upgrade Premium Here for unlimited commands](https://pogy.xyz/premium)`)) + + return; +} +} + + + + autoResponse.findOne({ + guildId: message.guild.id, + name + }, async(err, data) => { + if (!data) { + autoResponse.create({ guildId: message.guild.id, name, content }); + message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`**${language.cc3}** ${name}\n\nDelete the following auto response using \`${prefix}deleteresponse \``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)) + } + else { + return message.channel.send(`${message.client.emoji.fail} ${language.cc4}`) + } + }) + + } +}; \ No newline at end of file diff --git a/commands/config/autoresponselist.js b/commands/config/autoresponselist.js new file mode 100644 index 00000000..779be98a --- /dev/null +++ b/commands/config/autoresponselist.js @@ -0,0 +1,50 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const autoResponse = require('../../database/schemas/autoResponse.js'); +const Guild = require('../../database/schemas/Guild'); +const { prototype } = require('../../structures/Command'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'autoresponses', + description: 'Gives a list of auto Responses in a guild', + category: 'Config', + aliases: [ 'ars', 'autoresponselist'], + cooldown: 5, + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + await autoResponse.find({ + guildId: message.guild.id, + }, (err, data) => { + if (!data && !data.name) return message.channel.send(`${message.client.emoji.fail} ${language.cc5}`); + let array =[] + data.map((d, i) => array.push(d.name)); + + let embed = new MessageEmbed() + .setColor('PURPLE') + .setTitle(`${language.cc6}`) + .setDescription(array.join(" - ")) + .setFooter(message.guild.name) + + if (!Array.isArray(array) || !array.length) { + embed.setDescription(`${language.cc5}`) +} else { +embed.setDescription(array.join(" - ")) +} + + message.channel.send(embed) + }); + + } +}; \ No newline at end of file diff --git a/commands/config/config.js b/commands/config/config.js new file mode 100644 index 00000000..ec11e6aa --- /dev/null +++ b/commands/config/config.js @@ -0,0 +1,46 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'settings', + aliases: [ 'cfg'], + description: 'Show\'s the current settings for this guild', + category: 'Config', + guildOnly: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + const settings = await Guild.findOne({ + guildId: message.guild.id, + }); + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + await message.channel.send(new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setTitle(`${language.serversettings1}`) + .addField(`Main Settings`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id})`, true) + .addField(`Welcome & Leave`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/welcome)`, true) + .addField(`Logging`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/logging)`, true) + .addField(`Autorole`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/autorole)`, true) + .addField(`Alt Detector`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/altdetector)`, true) + .addField(`Tickets`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/tickets)`, true) + .addField(`Suggestions`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/Suggestions)`, true) + .addField(`Server Reports`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/reports)`, true) + .addField(`Automod`, `[\`Click here\`](https://pogy.xyz/dashboard/${message.guild.id}/automod)`, true) + + .setFooter(`${message.guild.name}`) + + + ) + + } +}; \ No newline at end of file diff --git a/commands/config/customcommand.js b/commands/config/customcommand.js new file mode 100644 index 00000000..7648863c --- /dev/null +++ b/commands/config/customcommand.js @@ -0,0 +1,86 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const customCommand = require('../../database/schemas/customCommand.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'createcommand', + description: 'Create a custom command', + category: 'Config', + userPermission: ['MANAGE_MESSAGES'], + aliases: [ 'cc', 'customcommand'], + usage: [ ' ' ], + examples: [ 'createcommand pog Poggers!' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`) + const namee = args[0]; + + if (!namee) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}customcommand \`\n\n${language.example} \`${prefix}customcommand ping pong\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + let name = namee.toLowerCase() + const content = args.slice(1).join(' '); + if (!content) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}customcommand \`\n\n${language.example} \`${prefix}customcommand ping pong\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + if (namee.length > 30) return message.channel.send(`${message.client.emoji.fail} ${language.cc1}`); + if (content.length > 2000) return message.channel.send(`${message.client.emoji.fail} ${language.cc2}`); + + if (this.client.commands.get(namee) || this.client.aliases.get(namee)) return message.channel.send(`That command is already an existing bot command!`); + +if(guildDB.isPremium === "false"){ + const conditional = { + guildId: message.guild.id +} +const results = await customCommand.find(conditional) + +if(results.length >= 10){ +message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${message.client.emoji.fail} custom Command Limit Reached **(10)**\n\n[Upgrade Premium Here for unlimited commands](https://pogy.xyz/premium)`)) + + return; +} +} + + customCommand.findOne({ + guildId: message.guild.id, + name + }, async(err, data) => { + if (!data) { + customCommand.create({ guildId: message.guild.id, name, content }); + message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`**${language.cc3}** ${name}\n\nDelete the following command using \`${prefix}deletecommand \``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)) + } + else { + return message.channel.send(`${message.client.emoji.fail} ${language.cc4}`) + } + }) + + } +}; \ No newline at end of file diff --git a/commands/config/customcommandlist.js b/commands/config/customcommandlist.js new file mode 100644 index 00000000..9c8508ec --- /dev/null +++ b/commands/config/customcommandlist.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const customCommand = require('../../database/schemas/customCommand.js'); +const Guild = require('../../database/schemas/Guild'); +const { prototype } = require('../../structures/Command'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'customcommands', + description: 'Gives a list of custom commands', + category: 'Config', + aliases: [ 'ccs'], + cooldown: 5, + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + await customCommand.find({ + guildId: message.guild.id, + }, (err, data) => { + if (!data && !data.name) return message.channel.send(`${message.client.emoji.fail} ${language.cc5}`); + let array =[] + data.map((d, i) => array.push(d.name)); + + + let embed = new MessageEmbed() + .setColor('PURPLE') + .setTitle(`${language.cc6}`) + + .setFooter(message.guild.name) + +if (!Array.isArray(array) || !array.length) { + embed.setDescription(`${language.cc5}`) +} else { +embed.setDescription(array.join(" - ")) +} + message.channel.send(embed) + + }); + + } +}; \ No newline at end of file diff --git a/commands/config/deletecommand.js b/commands/config/deletecommand.js new file mode 100644 index 00000000..cd6f9fc9 --- /dev/null +++ b/commands/config/deletecommand.js @@ -0,0 +1,61 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const customCommand = require('../../database/schemas/customCommand.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'deletecommand', + description: 'Deletes a custom command', + category: 'Config', + userPermission: 'MANAGE_MESSAGES', + aliases: [ 'delcommand', 'removecommand'], + usage: [ '' ], + examples: [ 'deletecommand Pog' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const name = args[0].toLowerCase(); + + if (!name) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}deletecommand \`\n\n${language.example} \`${prefix}deletecommand pog\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + if (name.length > 30) return message.channel.send(`${message.client.emoji.fail} ${language.cc1}`); + + + customCommand.findOne({ + guildId: message.guild.id, + name + }, async(err, data) => { + + if (data) { + data.delete({ guildId: message.guild.id, name }) + message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${message.client.emoji.success} Delete Command`) + .setDescription(`${language.deletecmd1} **${name}**`) + .setTimestamp() + .setFooter('https://pogy.xyz')) + } + else { + message.channel.send(`${message.client.emoji.fail} ${language.deletecmd2}`) + } + }) + } +}; \ No newline at end of file diff --git a/commands/config/deleteresponse.js b/commands/config/deleteresponse.js new file mode 100644 index 00000000..41a8390b --- /dev/null +++ b/commands/config/deleteresponse.js @@ -0,0 +1,60 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const autoResponse = require('../../database/schemas/autoResponse.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'deleteresponse', + description: 'Deletes an auto Response', + category: 'Config', + userPermission: 'MANAGE_MESSAGES', + aliases: [ 'deleteautoresponse', 'delresponse', 'deleteautoresponse'], + usage: [ '' ], + examples: [ 'deleteresponse Pog' ], + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const name = args[0].toLowerCase(); + + if (!name) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.properusage} \`${prefix}deleteresponse \`\n\n${language.example} \`${prefix}deleteresponse pog\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + if (name.length > 30) return message.channel.send(`${message.client.emoji.fail} ${language.cc1}`); + + + autoResponse.findOne({ + guildId: message.guild.id, + name + }, async(err, data) => { + if (data) { + data.delete({ guildId: message.guild.id, name }) + message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${message.client.emoji.success} Delete Auto Response`) + .setDescription(`${language.deletecmd1} **${name}**`) + .setTimestamp() + .setFooter('https://pogy.xyz')) + } + else { + message.channel.send(`${message.client.emoji.fail} ${language.deletecmd2}`) + } + }) + } +}; \ No newline at end of file diff --git a/commands/config/prefix.js b/commands/config/prefix.js new file mode 100644 index 00000000..822a73f9 --- /dev/null +++ b/commands/config/prefix.js @@ -0,0 +1,43 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'setprefix', + description: 'Sets the prefix for this server', + category: 'Config', + usage: [ '' ], + examples: [ 'setprefix !'], + cooldown: 3, + guildOnly: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + const settings = await Guild.findOne({ + guildId: message.guild.id, + }, (err, guild) => { + if (err) console.log(err) + }); + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + + + if(!args[0]) return message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription(`${message.client.emoji.fail} ${language.setPrefixMissingArgument}`)) + + if(args[0].length > 5) return message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription(`${message.client.emoji.fail} ${language.setPrefixLongLength}`)) + + message.channel.send(new discord.MessageEmbed().setColor(message.client.color.green).setDescription(`${message.client.emoji.success} ${language.setPrefixChange.replace("{prefix}", args[0])}`)) + await settings.updateOne({ + prefix: args[0] + }); + } + } \ No newline at end of file diff --git a/commands/config/setlanguage.js b/commands/config/setlanguage.js new file mode 100644 index 00000000..a6303adb --- /dev/null +++ b/commands/config/setlanguage.js @@ -0,0 +1,43 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'setlanguage', + aliases: [ 'setlang', 'lang' ], + description: 'Set a guild language', + category: 'Config', + guildOnly: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + let languages = ["english", "french", "spanish"] + + if(!args[0]) return message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription(`${message.client.emoji.fail} | ${language.setLangMissingArgument}`)) + + + let setLangInvalidOption = language.setLangInvalidOption.replace("{languages}", languages.join(", ")) + if(!languages.includes(args[0].toLowerCase())) return message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription(`${message.client.emoji.fail} | ${setLangInvalidOption}`)) + + let setLangChange = language.setLangChange.replace("{language}", args[0].toLowerCase()) + message.channel.send(new discord.MessageEmbed().setColor(message.client.color.green).setDescription(`${message.client.emoji.success} | ${setLangChange}`)) + + await guildDB.updateOne({ + language: args[0].toLowerCase() + }); + } + } \ No newline at end of file diff --git a/commands/config/suggestions.js b/commands/config/suggestions.js new file mode 100644 index 00000000..292a176f --- /dev/null +++ b/commands/config/suggestions.js @@ -0,0 +1,190 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'suggestion', + description: 'Enable or disable and approve or decline suggestions', + category: 'Config', + usage: [ ' / suggestion approve/decline ' ], + examples: [ 'suggestion enable #suggestions', 'suggestion disable', 'suggestion approve/decline 793797217239' ], + cooldown: 3, + userPermission: ['MANAGE_MESSAGES'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix +let fail = message.client.emoji.fail + let properUsage = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${language.suggesting7.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter('https://pogy.xyz') + + if (args.length < 1) { + return message.channel.send(properUsage); + } + + + if (args.includes('disable')) { + + if(guildDB.suggestion.suggestionChannelID === null) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.suggesting8}`) + .setFooter('https://pogy.xyz')); + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.suggestion.suggestionChannelID = null + await guild.save().catch(()=>{}) + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.suggesting9}`) + .setFooter('https://pogy.xyz')); + }); + return; + } else if (args.includes('enable')) { + + + const channel = await message.mentions.channels.first(); + + if (!channel) return message.channel.send(properUsage) + if(guildDB.suggestion.suggestionChannelID === channel.id) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${fail} ${channel} ${language.suggesting10}`) + .setFooter('https://pogy.xyz')); + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.suggestion.suggestionChannelID = channel.id + await guild.save().catch(()=>{}) + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.suggesting11} ${channel}`)); + }); + } else if (args.includes('approve') || args.includes('accept')){ + +if(guildDB.suggestion.decline == "false"){ + return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} Staff can't approve or decline Suggestions in this guild.`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); +} +if(!guildDB.suggestion.suggestionChannelID || !guildDB.suggestion.suggestionChannelID === null) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting1}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let suggestion = guildDB.suggestion.suggestionChannelID +let channel = message.guild.channels.cache.get(suggestion) +if(!channel) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting2}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(!args[1]) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting12}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + try { + +var suggestionMsg = await channel.messages.fetch(args[1]) + +} catch(e) { + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting13}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + return; +} + +let description = suggestionMsg.embeds[0].description; + + if(suggestionMsg.embeds[0].title !== `${language.suggesting3}`) { + + if(suggestionMsg.embeds[0].title === `${language.suggesting14}`){ + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting15}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } else { + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting16}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } + + return; + + } + var acceptReason = args.splice(2).join(' '); + if(!acceptReason) acceptReason = `${language.noReasonProvided}`; + if(args.join(' ').length > 600) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting17}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + const editedEmbed = new MessageEmbed() + .setColor('#2bff80') + .setTitle(`${language.suggesting14}`) + .setDescription(`${description}\n\n**${language.suggesting18}**\n__**${language.reason}**__ ${acceptReason}\n__**${language.suggesting19}**__ ${message.author}`) + suggestionMsg.edit(editedEmbed); + suggestionMsg.reactions.removeAll(); + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.success} ${language.suggesting20} ${channel}\n\n__**${language.reason}**__ ${acceptReason}`).setFooter('https://pogy.xyz').setTimestamp().setColor('GREEN')).then(k => { + message.delete().catch(() => {}) + setTimeout(() => { + k.delete().catch(() => {}) + }, 10000); + }) + + + + } else if (args.includes('decline')) { + +if(guildDB.suggestion.decline == "false"){ + return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} Staff can't approve or decline Suggestions in this guild.`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); +} +if(!guildDB.suggestion.suggestionChannelID || !guildDB.suggestion.suggestionChannelID === null) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting1}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let suggestion = guildDB.suggestion.suggestionChannelID +let channel = message.guild.channels.cache.get(suggestion) +if(!channel) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting2}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + +if(!args[1]) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting12}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + try { + +var suggestionMsg = await channel.messages.fetch(args[1]) + +} catch(e) { + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting13}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + return; +} +let description = suggestionMsg.embeds[0].description; + if(suggestionMsg.embeds[0].title !== `${language.suggesting3}`) { + + if(suggestionMsg.embeds[0].title === `${language.suggesting14}`){ + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting15}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } else { + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting16}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } + + return; + + } + var acceptReason = args.splice(2).join(' '); + if(!acceptReason) acceptReason = `${language.noReasonProvided}`; + + if(args.join(' ').length > 600) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting17}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + const editedEmbed = new MessageEmbed() + .setColor(message.client.color.red) + .setTitle(`${language.suggesting21}`) + .setDescription(`${description}\n\n**${language.suggesting22}**\n__**${language.reason}**__ ${acceptReason}\n__**${language.suggesting23}**__ ${message.author}`) + suggestionMsg.edit(editedEmbed); + suggestionMsg.reactions.removeAll(); + message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.success} ${language.suggesting24} ${channel}\n\n__**${language.reason}**__ ${acceptReason}`).setFooter('https://pogy.xyz').setTimestamp().setColor('GREEN')).then(k => { + message.delete().catch(() => {}) + setTimeout(() => { + k.delete().catch(() => {}) + }, 10000); + }) + + } else if(args[0]) { + message.channel.send(properUsage) + } else { + message.channel.send(properUsage) + + } + } +}; \ No newline at end of file diff --git a/commands/config/tempvc.js b/commands/config/tempvc.js new file mode 100644 index 00000000..dc6f7565 --- /dev/null +++ b/commands/config/tempvc.js @@ -0,0 +1,303 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const Vc = require('../../database/schemas/tempvc'); +const { MessageEmbed } = require('discord.js'); +const { oneLine, stripIndent } = require('common-tags'); +const moment = require('moment'); +const mongoose = require("mongoose"); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'tempvc', + description: 'Enable / disable tempvc', + category: 'Utility', + usage: [ ''], + examples: [ 'tempvc enable', 'tempvc disable'], + cooldown: 10, + userPermission: ['MANAGE_GUILD'], + botPermission: ['SEND_MESSAGES', 'EMBED_LINKS', 'MOVE_MEMBERS', 'MANAGE_CHANNELS', 'VIEW_CHANNEL'], + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const vcDB = await Vc.findOne({ + guildId: message.guild.id + }, + (err, guild) => { + if (err) console.error(err); + if (!guild) { + const newGuild = new Vc({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + channelID: null, + categoryID: null + }); + + newGuild + .save() + .catch(err => console.error(err)); + + return + + } + } + ); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix; +let fail = message.client.emoji.fail; +let success = message.client.emoji.success +let client = message.client + + + + let properUsage = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${language.tempvc1.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter('https://pogy.xyz') + + if (args.length < 1) { + return message.channel.send(properUsage); + } + + + if (args.includes('disable') || args.includes('off') ) { + if(!message.member.hasPermission("MANAGE_CHANNELS")) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} ${language.missingUser} `) + .setDescription(`${language.tempvc2}`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + if(!vcDB.channelID || !vcDB.categoryID || !vcDB.guildId ||!vcDB.channelID === null) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.tempvc3}`) + .setFooter('https://pogy.xyz')); + await Vc.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + + let voiceID = guild.channelID + let categoryID = guild.categoryID + + let voice = message.client.channels.cache.get(voiceID) + if(voice) voice.delete().catch(()=>{}) + + let category = message.client.channels.cache.get(categoryID) + if(category) category.delete().catch(()=>{}) + + if(!guild){ + Vc.create({ + guildId: message.guild.id, + channelID: null, + categoryID: null + }) + + return; + } else { + guild.updateOne({ + channelID: null, + categoryID: null + }).catch(err => console.error(err)); + } + + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.tempvc4}`) + .setFooter('https://pogy.xyz')); + }); + return; + } else if (args.includes('enable') || args.includes('on') ) { + if(!message.member.hasPermission("MANAGE_CHANNELS")) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} ${language.missingUser} `) + .setDescription(`${language.tempvc2}`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + +try { + + const embed = new MessageEmbed() + .setAuthor(`${language.tempvc5}`, `https://www.creeda.co.in/Images/loader.gif`) + .setDescription(`\`${language.tempvc6}\``) + .setColor(message.guild.me.displayHexColor); + const msg = await message.channel.send(embed); + + + + let category = message.guild.channels.cache.find(c => c.name.toLowerCase() == "join to create" && c.type == "category"); + setTimeout(async() => { + if(!category) { + await embed + .setDescription(`**${language.tempvc7}**`) + .setFooter(`Pogy v2.0`) + .setTimestamp(); + msg.edit(embed) + message.guild.channels.create(`Join to Create`, {type: 'category', permissionOverwrites: [ + { + id: message.guild.id, + allow: ['VIEW_CHANNEL'], + }, + { + id: message.author.id, + allow: ['VIEW_CHANNEL'], + }, +]}) +return; + } else { + embed + .setDescription(`**${language.tempvc8}**\n\nID: ${category.id}`) + .setFooter(`Pogy v2.0`) + .setTimestamp(); +msg.edit(embed); + + } +}, 2000) + +let voice = message.guild.channels.cache.find(c => c.name.toLowerCase() == "join to create" && c.type == "voice"); + + +setTimeout(async() => { +if(!voice) { + +await embed +.setDescription(`**${language.tempvc9}**`) +.setFooter(`Pogy v2.0`) +.setTimestamp(); +msg.edit(embed); ++ message.guild.channels.create('Join to create', {type: 'voice', permissionOverwrites: [ + { + id: message.guild.id, + deny: ['VIEW_CHANNEL'], + }, + { + id: message.author.id, + allow: ['VIEW_CHANNEL'], + }, + ]}).then((s)=>{ + if(!category) return + s.setParent(category.id).catch(()=>{}) + }) + +return; +} else { + embed + .setDescription(`**${language.tempvc10}**\n\nID: ${voice.id}`) + .setFooter(`Pogy v2.0`) + .setTimestamp(); +msg.edit(embed) + +}; +}, 2000) + +setTimeout(async() => { + +if(!voice || !category ) { + embed + .setAuthor(`Setup Fail`) + .setDescription(`${language.tempvc11.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter(`Pogy v2.0`) + .setTimestamp(); + msg.edit(embed); + await Vc.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + if(!guild){ + Vc.create({ + guildId: message.guild.id, + channelID: null, + categoryID: null + }) + + return; + } else { + guild.updateOne({ + channelID: null, + categoryID: null + }).catch(err => console.error(err)); + } + + + }) + +return; +} else { + let channelVoice = message.client.channels.cache.get(voice.id) + let channelInv = await channelVoice.createInvite({ + maxAge: 0, + maxUses: 0 +}).catch(()=>{}) + voice.setParent(category.id); + embed + .setAuthor(`${language.tempvc12}`, `${message.client.domain}/logo.png` , `${channelInv}` ) + .setDescription(`**${language.tempvc13}** ${category.name}\n**${language.tempvc13} ID:** ${category.id}\n\n**${language.tempvc14}** ${voice.name}\n**${language.tempvc14} ID:** ${voice.id}\n\n${language.tempvc15} \`${prefix}tempvc off\` `) + .setFooter(`Pogy v2.0`) + .setTimestamp(); + msg.edit(embed); + if(channelInv && channelVoice) message.channel.send(`${channelInv}`) + await Vc.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + if(!guild){ + Vc.create({ + guildId: message.guild.id, + channelID: voice.id, + categoryID: category.id + }) + + return; + } else { + guild.updateOne({ + channelID: voice.id, + categoryID: category.id + }).catch(err => console.error(err)); + } + + }) + } + }, 2000) +} catch { + + message.channel.send(new MessageEmbed().setDescription(`${language.tempvc16}`).setColor(`RED`)); + await Vc.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + + if(!guild){ + Vc.create({ + guildId: message.guild.id, + channelID: null, + categoryID: null + }) + + return; + } else { + + guild.updateOne({ + channelID: null, + categoryID: null + }).catch(err => console.error(err)); + } + + }) + } + + + } else if(args[0]) { + message.channel.send(properUsage) + } else { + message.channel.send(properUsage) + + } + } +}; \ No newline at end of file diff --git a/commands/config/togglecategory.js b/commands/config/togglecategory.js new file mode 100644 index 00000000..72d3e3f6 --- /dev/null +++ b/commands/config/togglecategory.js @@ -0,0 +1,108 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'togglecategory', + description: 'Disable or enable a category in the guild', + category: 'Config', + examples: [ 'togglecategory currency'], + cooldown: 3, + guildOnly: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + const settings = await Guild.findOne({ + guildId: message.guild.id, + }, (err, guild) => { + if (err) console.log(err) + }); + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + const success = message.client.emoji.success; + const fail = message.client.emoji.fail; + + if(!args[0]) return message.channel.send(`What category do i disable?`); + + if (args.length === 0 || args[0].toLowerCase() === 'Owner') + return message.channel.send('Please, provide a valid category!') + + + const type = args.slice(0).join(" ").toString().toLowerCase(); + let description; + + if(type === "config") return message.channel.send(`${fail} You may not disable the Configuration Category.`) + + const typesMain = message.client.utils.removeDuplicates(message.client.commands.filter(cmd => cmd.category !== 'Owner').map(cmd => cmd.category)); + + const types = typesMain.map(item => item.toLowerCase()); + + const commands = message.client.commands.array().filter(c => c.category.toLowerCase() === type); + + let disabledCommands = guildDB.disabledCommands + if (typeof(disabledCommands) === 'string') disabledCommands = disabledCommands.split(' ') + + if (types.includes(type)) { + + if (commands.every(c => disabledCommands.includes(c.name || c))) { + for (const cmd of commands) { + if (disabledCommands.includes(cmd.name || cmd)) + removeA(disabledCommands, cmd.name || cmd) + } + description = `All \`${type}\` commands have been successfully **enabled**. ${success}`; + + + } else { + + for (const cmd of commands) { + if (!disabledCommands.includes(cmd.name || cmd)) { + guildDB.disabledCommands.push(cmd.name || cmd); + } + } + description = `All ${type} commands have been successfully **disabled**. ${fail}`; + } + await guildDB.save().catch(()=>{}) + const disabledd = disabledCommands.map(c => `\`${c}\``).join(' ') || '`None`'; + + const embed = new discord.MessageEmbed() + .setAuthor(message.author.tag, message.guild.iconURL({ dynamic: true })) + .setDescription(description) + .addField('Disabled Commands', disabledd, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor(message.client.color.green); + message.channel.send(embed).catch(()=>{ + const errorEmbed = new discord.MessageEmbed() + .setAuthor(message.author.tag, message.guild.iconURL({ dynamic: true })) + .setDescription(description) + .addField('Disabled Commands', `[Too Large to Display]`, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor(message.client.color.green); + message.channel.send(errorEmbed).catch(()=>{}) + }) + + + } else return message.channel.send(`Please, provide a valid category\n\n**Available Categories:**\n${typesMain.join(" - ")}`) + + } + } + function removeA(arr) { + var what, a = arguments, L = a.length, ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} \ No newline at end of file diff --git a/commands/config/togglecommand.js b/commands/config/togglecommand.js new file mode 100644 index 00000000..b3c215f9 --- /dev/null +++ b/commands/config/togglecommand.js @@ -0,0 +1,90 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'togglecommand', + description: 'Disable or enable commands in the guild', + category: 'Config', + examples: [ 'togglecommand rob'], + cooldown: 3, + guildOnly: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + const settings = await Guild.findOne({ + guildId: message.guild.id, + }, (err, guild) => { + if (err) console.log(err) + }); + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + const success = message.client.emoji.success; + const fail = message.client.emoji.fail; + + if(!args[0]) return message.channel.send(`What command do i disable?`); + + const command = this.client.commands.get(args[0]) || this.client.aliases.get(args[0]) + + if (!command || (command && command.category == 'Owner')) + return message.channel.send('Provide a valid command!') + + if(command && command.category === "Config") return message.channel.send(`${fail} You may not disable Configuration Commands.`) + + let disabled = guildDB.disabledCommands + if (typeof(disabled) === 'string') disabled = disabled.split(' '); + + let description; + + if (!disabled.includes(command.name || command)) { + guildDB.disabledCommands.push(command.name || command); + description = `The \`${command.name || command}\` command has been successfully **disabled**. ${fail}`; + + } else { + removeA(disabled, command.name || command) + description = `The \`${command.name || command}\` command has been successfully **enabled**. ${success}`; + } + await guildDB.save().catch(()=>{}) + + const disabledCommands = disabled.map(c => `\`${c}\``).join(' ') || '`None`'; + + const embed = new discord.MessageEmbed() + .setAuthor(message.author.tag, message.guild.iconURL({ dynamic: true })) + .setDescription(description) + .addField('Disabled Commands', disabledCommands, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor(message.client.color.green); + message.channel.send(embed).catch(()=>{ + const errorEmbed = new discord.MessageEmbed() + .setAuthor(message.author.tag, message.guild.iconURL({ dynamic: true })) + .setDescription(description) + .addField('Disabled Commands', `[Too Large to Display]`, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor(message.client.color.green); + message.channel.send(errorEmbed).catch(()=>{}) + }) + + + } + } + function removeA(arr) { + var what, a = arguments, L = a.length, ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} \ No newline at end of file diff --git a/commands/economy/balance.js b/commands/economy/balance.js new file mode 100644 index 00000000..0932d5a5 --- /dev/null +++ b/commands/economy/balance.js @@ -0,0 +1,52 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/items.js") +const items = require("../../data/economy/shopItems.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "balance", + aliases: ["bal"], + usage: "(user)", + disabled: true, + category: "Economy", + examples: ["balance W-Legit"], + description: "You can check your balance or someone else's balance", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + + let user = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member + + let amountOfMoney + + + await bal.findOne({ user: user.user.id }, async (err, db) => { + if(!db) { + new bal({ + user: user.id, + balance: 0 + }) + .save() + .catch(err => { return message.channel.send(`I have encountered an error -> ${err}`)}) + amountOfMoney = 0 + } else { + amountOfMoney = db.balance + } + + message.channel.send(successEmbed.setTitle(`${user.user.username}'s Balance`).setDescription(`-> ${amountOfMoney} <:coin:822159088221814836>`) +) + }) + } +} \ No newline at end of file diff --git a/commands/economy/buy.js b/commands/economy/buy.js new file mode 100644 index 00000000..f8a9cb1f --- /dev/null +++ b/commands/economy/buy.js @@ -0,0 +1,77 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/items.js") +const items = require("../../data/economy/shopItems.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "buy", + aliases: ["purchase"], + usage: "", + category: "Economy", + disabled: true, + examples: ["buy "], + description: "You can buy items here such as hunting rifles and ammo", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + if(!args[0]) return message.channel.send(errorEmbed.setDescription("No args")) + let itemToBuy = args[0].toLowerCase() + + const validItem = !!items.find((val) => val.item.toLowerCase().includes(itemToBuy)) + if(!validItem) return message.channel.send(errorEmbed.setDescription("Not valid item")) + + const itemPrice = items.find((val) => val.item.toLowerCase().includes(itemToBuy)).price + const buyable = items.find((val) => val.item.toLowerCase().includes(itemToBuy)).buyable + + if(buyable === false) return message.channel.send(errorEmbed.setDescription("You cant buy this item")) + let params = { user: message.author.id } + + const userBalance = await bal.findOne(params) + if(!userBalance) { + new bal({ + user: message.author.id, + balance: 0 + }).save().catch(err => console.log(err)) + return message.channel.send(errorEmbed.setDescription("Not enough money1")) + } + if(userBalance < itemPrice) return message.channel.send(errorEmbed.setDescription("Not enough money1")) + + await inventory.findOne(params, async (err, data) => { + if(data) { + const hasItem = Object.keys(data.Inventory).includes(items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item) + if(!hasItem) { + data.Inventory[items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item] = 1 + } else { + return message.channel.send(errorEmbed.setDescription("You already own this item")) + //data.Inventory[items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item]++ + } + + await inventory.findOneAndUpdate(params, data) + await userBalance.updateOne({balance: userBalance.balance - itemPrice}) + message.channel.send(successEmbed.setDescription(`Bought ${items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item}`)) + } else { + new inventory({ + user: message.author.id, + Inventory: { + [items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item]: 1 + } + }).save() + .catch(err => console.log(err)) + await userBalance.updateOne({balance: userBalance.balance - itemPrice}) + message.channel.send(successEmbed.setDescription(`Bought ${items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item}`)) + } + }) + } +} \ No newline at end of file diff --git a/commands/economy/equip.js b/commands/economy/equip.js new file mode 100644 index 00000000..ef351cbb --- /dev/null +++ b/commands/economy/equip.js @@ -0,0 +1,76 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/items.js") +const items = require("../../data/economy/shopItems.js") +const equippedGun = require("../../models/economy/equipped.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "equip", + aliases: [], + usage: "", + disabled: true, + category: "Economy", + examples: ["equip "], + description: "You now will be able to equip items such as ammo and shotguns", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + if(!args[0]) return message.channel.send(errorEmbed.setDescription("No args")) + let itemToEquip = args[0].toLowerCase() + + let equippedItem = !!items.find((val) => val.item.toLowerCase().includes(itemToEquip)) + if(!equippedItem) return message.channel.send(errorEmbed.setDescription("Not valid item")) + let gunItem = items.find((val) => val.item.toLowerCase().includes(itemToEquip)) + + let inv = await inventory.findOne({ user: message.author.id }) + + let equipped = await equippedGun.findOne({ user: message.author.id }) + + if(!inv) { + new inventory({ + user: message.author.id, + Inventory: { + ["Default Shotgun"]: 1 + } + }).save().catch(err => { message.channel.send(errorEmbed.setDescription("I have encountered an error -> " + err))}) + return message.channel.send(errorEmbed.setDescription("No have this item")) + } + + if(inv) { + const hasItem = Object.keys(inv.Inventory).includes(items.find((val) => val.item.toLowerCase().includes(itemToEquip)).item) + if(!hasItem) { + return message.channel.send(errorEmbed.setDescription("No have this item")) + } + + if(hasItem) { + if(!equipped) { + new equippedGun({ + user: message.author.id, + itemEquipped: gunItem.item + }).save().catch(err => { message.channel.send(errorEmbed.setDescription("I have encountered an error -> " + err))}) + return message.channel.send(successEmbed.setDescription("Successfully equipped " + gunItem.item)) + } + if(equipped) { + await equipped.updateOne({ + itemEquipped: gunItem.item + }) + return message.channel.send(successEmbed.setDescription("Successfully equipped " + gunItem.item)) + + } + } + } + } +} \ No newline at end of file diff --git a/commands/economy/hunt.js b/commands/economy/hunt.js new file mode 100644 index 00000000..e4c443f2 --- /dev/null +++ b/commands/economy/hunt.js @@ -0,0 +1,33 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const rifle = require("../../models/economy/items.js") +const animals = require("../../models/economy/animals.js") +const items = require("../../data/economy/shopItems.js") +const equippedGun = require("../../models/economy/equipped.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "hunt", + aliases: [], + usage: "", + disabled: true, + category: "Economy", + examples: ["hunt"], + description: "Hunt for animals, the better rifle you have the better animals you can catch", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + } +} \ No newline at end of file diff --git a/commands/economy/inventory.js b/commands/economy/inventory.js new file mode 100644 index 00000000..616af2dc --- /dev/null +++ b/commands/economy/inventory.js @@ -0,0 +1,77 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/animals.js") +const items = require("../../data/economy/items.js") +const shop = require("../../data/economy/shopItems.js") +const equippedGun = require("../../models/economy/equipped.js") +//equipped +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "inventory", + aliases: [ "profile"], + usage: "", + disabled: true, + category: "Economy", + examples: ["inventory"], + description: "Check everything you have baught from the shop here", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + + + await inventory.findOne({ user: message.author.id }, async (err, data) => { + let inv; + let str; + if(!data) { + inv = "You do not own any animals" + } + if(data) { + inv = Object.keys(data.Inventory).map((key) => { + if(data.Inventory[key] === 0) { + str = "" + if(str.length === 0) { + str = "" + //str = `You do not have any **${key}**` + } + } else { + str = `**${key}** ─ ${data.Inventory[key]}` + } + + return str + }).join("\n") + } + + let equippe = await equippedGun.findOne({ user: message.author.id }) + let equip + + if(!equippe) { + equip = "Default Shotgun" + } else { + equip = equippe.itemEquipped + } + let i = shop.find((val) => val.item.toLowerCase().includes(equip.toLowerCase())) + if(!data || data.Inventory === null || data === null || data === undefined) { + inv = "You do not own any animals" + } + + if(inv.length === 1 || inv.length === 0) { + inv = "You do not own any animals" + } + + message.channel.send(successEmbed.setTitle("Your Profile").setDescription(`You have hunted **{TimeYouHunted}** times`).addField("**Inventory**", `${inv} `, true).addField("**Stats**", `You have found **{TotalAnimals}** animals\nGun Equipped: **${i.emoji} ─ ${i.item}**`, true)) + + }) + } +} \ No newline at end of file diff --git a/commands/economy/sell.js b/commands/economy/sell.js new file mode 100644 index 00000000..c15a6bc6 --- /dev/null +++ b/commands/economy/sell.js @@ -0,0 +1,68 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/items.js") +const items = require("../../data/economy/shopItems.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "sell", + aliases: [], + usage: "", + disabled: true, + category: "Economy", + examples: ["sell "], + description: "You can sell items here such as the animals you got for hunting", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + if(!args[0]) return message.channel.send(errorEmbed.setDescription("No args")) + let itemToBuy = args[0].toLowerCase() + + const validItem = !!items.find((val) => val.item.toLowerCase().includes(itemToBuy)) + if(!validItem) return message.channel.send(errorEmbed.setDescription("Not valid item")) + + const itemPrice = items.find((val) => val.item.toLowerCase().includes(itemToBuy)).sell + const sellable = items.find((val) => val.item.toLowerCase().includes(itemToBuy)).sellable + if(sellable === false) return message.channel.send(errorEmbed.setDescription("You cant sell this item")) + + let params = { user: message.author.id } + + const userBalance = await bal.findOne(params) + if(!userBalance) { + new bal({ + user: message.author.id, + balance: 0 + }).save().catch(err => console.log(err)) + return message.channel.send(errorEmbed.setDescription("Not have item")) + } + + await inventory.findOne(params, async (err, data) => { + if(data) { + const hasItem = Object.keys(data.Inventory).includes(itemToBuy) + if(!hasItem) { + message.channel.send(successEmbed.setDescription(`No have ${items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item}`)) + } else { + if(data.Inventory[items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item] === 0) return message.channel.send(errorEmbed.setDescription("You dont have this item")) + data.Inventory[items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item]-- + } + + await inventory.findOneAndUpdate(params, data) + await userBalance.updateOne({balance: Number(userBalance.balance) + Number(itemPrice)}) + message.channel.send(successEmbed.setDescription(`Sold ${items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item}`)) + } else { + message.channel.send(successEmbed.setDescription(`No have ${items.find((val) => val.item.toLowerCase().includes(itemToBuy)).item}`)) + } + }) + } +} \ No newline at end of file diff --git a/commands/economy/shop.js b/commands/economy/shop.js new file mode 100644 index 00000000..6764213e --- /dev/null +++ b/commands/economy/shop.js @@ -0,0 +1,123 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const app = require("../../models/application/application.js"); + +const bal = require("../../models/economy/balance.js") +const inventory = require("../../models/economy/items.js") +const gun = require("../../data/economy/shopItems.js") + + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "shop", + aliases: ["store"], + usage: "", + disabled: true, + category: "Economy", + examples: ["shop"], + description: "You can check everything that is for sale", + }) + } + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const errorEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.red).setFooter("https://pogy.xyz").setTimestamp() + const successEmbed = new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png'})).setColor(client.color.green).setFooter("https://pogy.xyz").setTimestamp() + + if(!args[0]) { + return message.channel.send(errorEmbed.setDescription("Select category: gun")) + } + + let itemToBuy = args.slice(0).join(" ").toLowerCase() + + let validCategory = !!gun.find((val) => val.category.includes(itemToBuy.toLowerCase())) + if(validCategory) { + let emoji; + let nothing; + await inventory.findOne({ user: message.author.id }, async(err, data) => { + if(gun.find((val) => val.item.toLowerCase().includes(itemToBuy.toLowerCase())).category.includes(itemToBuy)) { + const gunList = gun.map((val) => { + let value = gun.find((v) => v.item.toLowerCase().includes(val.item.toLowerCase())) + let str = `${emoji} | **${value.emoji} ${value.item}** ─ ${numberWithCommas(value.price)} <:coin:822159088221814836>\n${value.description}` + if(value.buyable === false) { + str = "" + } + if(!data) { + emoji = "<:wrong:822376943763980348>" + console.log("NO data ") + return str + } + + if(data) { + let emoji; + console.log(data.Inventory[value.item]) + if(data.Inventory[value.item] === undefined || !data.Inventory[value.item]) { + emoji = "<:wrong:822376943763980348>" + } + + if(data.Inventory[value.item] == '1' || data.Inventory[value.item] == Number(1)) { + emoji = "<:correct:822376950659022858>" + } + let str = `${emoji} | **${value.emoji} ${value.item}** ─ ${numberWithCommas(value.price)} <:coin:822159088221814836>\n${value.description}` + if(value.buyable === false) { + str = "" + } + console.log(data.Inventory) + return str + } + }).join("") + + return message.channel.send(successEmbed.setTitle("**Gun Shop**").setDescription(gunList)) + } + }) + return + } + + const validItem = !!gun.find((val) => val.item.toLowerCase().includes(itemToBuy.toLowerCase())) + if(!validItem) return message.channel.send(errorEmbed.setDescription("Not valid item")) + + if(gun.length === 0) return message.channel.send(errorEmbed.setDescription("Shop is empty")) + + if(validItem) { + const i = gun.find((val) => val.item.toLowerCase().includes(itemToBuy.toLowerCase())) + await inventory.findOne({ user: message.author.id }, async (err, data) => { + let amountOfItems + console.log(data.Inventory[i.item]) + if(!data) { + amountOfItems = "0" + } else { + amountOfItems = data.Inventory[i.item] + if(amountOfItems === undefined) amountOfItems = "0" + } + + let iItem = i.item + const iPrice = i.price + let iDescription = i.description.slice(0, -1) + let iSell = i.sell + let iBuyable = i.buyable + let iSellable = i.sellable + let iDamage = i.damage + let price + let sell + if(iBuyable === false) { + price = "**Not able to be purchased**" + } else { + price = numberWithCommas(iPrice) + " <:coin:822159088221814836>" + } + if(iSellable === false) { + sell = "**Not able to be sold**" + } else { + sell = numberWithCommas(iSell) + " <:coin:822159088221814836>" + } + message.channel.send(successEmbed.setTitle(i.emoji+" **"+iItem+"**"+" "+`(${amountOfItems})`).setDescription(iDescription + `\n\nPrice - ${price}\nSell - ${sell}\nDamage - ${iDamage}`)) + }) + } + function numberWithCommas(x) { + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + } +} \ No newline at end of file diff --git a/commands/fun/asciify.js b/commands/fun/asciify.js new file mode 100644 index 00000000..ce50f5ab --- /dev/null +++ b/commands/fun/asciify.js @@ -0,0 +1,33 @@ +const Command = require('../../structures/Command'); +const figlet = require('util').promisify(require('figlet')); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'asciify', + aliases: [ 'bigtext', 'banner' ], + description: 'Turns your text into an ASCII art.', + category: 'Fun', + usage: '', + cooldown: 3 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + if (args.length < 1) { + return message.channel.send(`${message.client.emoji.fail} ${language.changeErrorValid}`) + } + + return message.channel.send(await figlet(args), { code: true }).catch(() => { + message.channel.send(`${language.bigError}`) + }); + } + +}; \ No newline at end of file diff --git a/commands/fun/birdfact.js b/commands/fun/birdfact.js new file mode 100644 index 00000000..adb285df --- /dev/null +++ b/commands/fun/birdfact.js @@ -0,0 +1,30 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'birdfact', + aliases: [ 'birdfacts', 'bf' ], + description: 'Generate a random useless bird facts', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message) { + const data = await fetch("https://some-random-api.ml/facts/bird").then(res => res.json()).catch(()=>{}) + + if (!data) return message.channel.send(`The API is currently down, come back later!`) + + const { fact } = data + + message.channel.send( new MessageEmbed() + +.setColor(message.client.color.blue) +.setDescription(`${fact}`) + .setFooter("/some-random-api/bird") + ) + } +}; \ No newline at end of file diff --git a/commands/fun/catfact.js b/commands/fun/catfact.js new file mode 100644 index 00000000..4bbfe2b1 --- /dev/null +++ b/commands/fun/catfact.js @@ -0,0 +1,29 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'catfact', + aliases: [ 'catfacts', 'cf' ], + description: 'Generate a random useless cat facts', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message) { + + + const res = await fetch('https://catfact.ninja/fact').catch(() => {}); + const fact = (await res.json()).fact; + const embed = new MessageEmbed() + .setDescription(fact) + .setFooter(`/catfact.ninja/fact`) + .setTimestamp() + .setColor(message.client.color.blue); + message.channel.send(embed).catch(() => {}); + + } +}; \ No newline at end of file diff --git a/commands/fun/coinflip.js b/commands/fun/coinflip.js new file mode 100644 index 00000000..c2baf365 --- /dev/null +++ b/commands/fun/coinflip.js @@ -0,0 +1,43 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'coinflip', + description: 'Flip a coin', + category: 'Fun', + aliases: [ 'cointoss' ], + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const n = Math.floor(Math.random() * 2); + let result; + if (n === 1) result = 'heads'; + else result = 'tails'; + + const embed = new MessageEmbed() + .setDescription(`\`${language.flippingCoin}\``) + .setColor(message.guild.me.displayHexColor); + +const msg = await message.channel.send(embed); + + const embe2 = new MessageEmbed() + .setDescription(`${language.coiniflippedacoinfor} ${message.member}, ${language.coinitwas}** ${result}**`) + .setColor(client.color.blue); + msg.edit(embe2).catch(() => {}); + + + } +}; \ No newline at end of file diff --git a/commands/fun/dicksize.js b/commands/fun/dicksize.js new file mode 100644 index 00000000..a1518070 --- /dev/null +++ b/commands/fun/dicksize.js @@ -0,0 +1,29 @@ +const Command = require("../../structures/Command"); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "dicksize", + aliases: ["ds", "pp" ,"ppsize"], + description: "Shows you your PP size", + category: "Fun", + cooldown: 3 + }); + } + + async run(message) { + let user = message.mentions.users.first(); + if (!user) { + user = message.author; + } + const size = (user.id.slice(-3) % 20) + 1; + const sizee = size/2.54 + const random = (user.id.slice(-6) % 40) + 3; + await message.channel.send({ + embed: { + color: "BLURPLE", + description: `${sizee.toFixed(2)} inch\n8${"=".repeat(size)}D`, + }, + }); + } +}; diff --git a/commands/fun/dogfact.js b/commands/fun/dogfact.js new file mode 100644 index 00000000..d76b894d --- /dev/null +++ b/commands/fun/dogfact.js @@ -0,0 +1,29 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'dogfact', + aliases: ['df'], + description: 'Generate a random useless dog facts', + category: 'Fun', + cooldown: 3, + }); + } + + async run(message) { + + const res = await fetch('https://dog-api.kinduff.com/api/facts'); + const fact = (await res.json()).facts[0]; + + const embed = new MessageEmbed() + .setDescription(fact) + .setFooter(`/dog-api.kinduff/api/fact`) + .setTimestamp() + .setColor(message.client.color.blue); + message.channel.send(embed).catch(() => {}); + + } +}; \ No newline at end of file diff --git a/commands/fun/emojify.js b/commands/fun/emojify.js new file mode 100644 index 00000000..2173ba3a --- /dev/null +++ b/commands/fun/emojify.js @@ -0,0 +1,59 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const specialCodes = { + '0': ':zero:', + '1': ':one:', + '2': ':two:', + '3': ':three:', + '4': ':four:', + '5': ':five:', + '6': ':six:', + '7': ':seven:', + '8': ':eight:', + '9': ':nine:', + '#': ':hash:', + '*': ':asterisk:', + '?': ':grey_question:', + '!': ':grey_exclamation:', + ' ': ' ' +} + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'emojify', + description: 'Emojifies the given text.', + category: 'Fun', + examples: [ 'emojify POG! '], + cooldown: 3 + }); + } + + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let text = message.content.slice(message.content.indexOf(args[0]), message.content.length); + if (!args[0]) return message.channel.send(`${language.emojify}`) + const user = message.mentions.users.first(); + if (user) return message.channel.send(`${language.dontmention}`) + + const emojified = text.toString().toLowerCase().split('').map(letter => { + if (/[a-z]/g.test(letter)) { + return `:regional_indicator_${letter}: ` + } else if (specialCodes[letter]) { + return `${specialCodes[letter]} ` + } + return letter + }).join('').replace(/,/g, ' ') + message.channel.send(emojified).catch(() => { + + message.channel.send(`${language.emojifyError}`).catch(() => {}) + }) + } +}; \ No newline at end of file diff --git a/commands/fun/f.js b/commands/fun/f.js new file mode 100644 index 00000000..7513eb14 --- /dev/null +++ b/commands/fun/f.js @@ -0,0 +1,52 @@ +const discord = require("discord.js"); +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'f', + description: 'Pay your respect!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const target = message.mentions.users.first() + + + +if (!args[0]) { + message.delete().catch(() => {}); + const embed = new discord.MessageEmbed() + .setAuthor(`${message.author.username} has paid their respects.`, message.author.displayAvatarURL({ format: 'png' })) + .setColor('PURPLE') + .setFooter(`${language.f3}`); + message.channel.send({ embed }).then(m => m.react('🇫')).catch(() => {}); + + + } + else { + message.delete().catch(() => {}); + const embed = new discord.MessageEmbed() + .setAuthor('\u2000', message.author.displayAvatarURL({ format: 'png' })) + .setColor('PURPLE') + .setDescription(`${message.author} ${language.f2} ${target}`) + .setFooter(`${language.f3}`); + message.channel.send({ embed }).then(m => m.react('🇫')).catch(() => {}); + + } + + } +}; \ No newline at end of file diff --git a/commands/fun/gayrate.js b/commands/fun/gayrate.js new file mode 100644 index 00000000..24339f5f --- /dev/null +++ b/commands/fun/gayrate.js @@ -0,0 +1,54 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js"); +const fetch = require("node-fetch"); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'howgay', + aliases: [ 'gayrate' ], + description: 'See how gay you are', + category: 'Fun', + usage: '[user]', + examples: [ 'howgay @Slayer#3102' ], + cooldown: 3 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + function randomInteger(min, max) { + min = Math.ceil(min); + max = Math.floor(max) + return Math.floor(Math.random() * (max - min +1)) + min + } + const target = message.mentions.users.first() + const authorId = message.author.id + + let amount = randomInteger(1,100) + let text = message.mentions.members.first() + let embedd = new discord.MessageEmbed() + .setColor('GREEN') + .setTitle(`${language.simpmachinee}`) + .setDescription(`${language.simpyouare} **${amount}%** gay`) + + if (target === authorId){ + + message.channel.send(embedd)} + if(!target)return message.channel.send(embedd) + let targett = target.username + let embed = new discord.MessageEmbed() + .setColor('GREEN') + .setTitle(`${language.simpmachinee}`) + .setDescription(`${targett} ${language.simpIs} **${amount}%** gay`) + message.channel.send(embed) + + + } + +}; \ No newline at end of file diff --git a/commands/fun/hack.js b/commands/fun/hack.js new file mode 100644 index 00000000..a9d0c1c1 --- /dev/null +++ b/commands/fun/hack.js @@ -0,0 +1,103 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const darkrandom = require("random"); +const darkemail = require("random-email"); +const darkpassword = require("generate-password"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'hack', + description: 'Hack someone! (fake)', + category: 'Fun', + usage: '[user]', + examples: [ 'hack @Pogy' ], + cooldown: 3, + }); + } + + async run(message) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const impostorpassword = darkpassword.generate({ + length: 10, + numbers: true, + }); + + const user = message.mentions.users.first(); + if (!user) { + return message.channel.send(language.hack1); + } else { + if (user.bot) { + return message.channel.send(language.hackbot); + } + } + const member = message.guild.member(user); + const mostCommon = [`${language.hack2}`, `${language.hack3}`, `${language.hack3}`, `${language.hack4}`, `${language.hack5}`, `${language.hack6}`]; + const lastdm = [ + `${language.hack7}`, + `${language.hack8}`, + `${language.hack9}`, + `${language.hack10}`, + ]; + + + message.channel.send(`${language.hack11} "${member.user.username}" ${language.hack12}`) + .then(async (msg) => { + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack13}`).catch(() => {}); + }, 2000); + setTimeout(async function () { + await msg.edit( + `[▝] Email: \`${darkemail({ + domain: "gmail.com", + })}\`\nPassword: \`${impostorpassword}\`` + ).catch(() => {}); + }, 4000); + setTimeout(async function () { + await msg.edit( + `[▖] Last DM: "${lastdm[Math.floor(Math.random() * lastdm.length)]}"` + ).catch(() => {}); + }, 6000); + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack14}`).catch(() => {}); + }, 10000); + setTimeout(async function () { + await msg.edit( + `[▝] mostCommon = "${ + mostCommon[Math.floor(Math.random() * mostCommon.length)] + }"` + ).catch(() => {}); + }, 13000); + setTimeout(async function () { + await msg.edit(`[▗] Finding IP address...`).catch(() => {}); + }, 17000) + setTimeout(async function () { + await msg.edit( + `[▖] IP address: \`127.0.0.1:${darkrandom.int(100, 9999)}\`` + ).catch(() => {}); + }, 20000); + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack15}`).catch(() => {}); + }, 25000); + setTimeout(async function () { + await msg.edit(`[▝] ${language.hack16}`).catch(() => {}); + }, 27000); + setTimeout(async function () { + await msg.edit(`${language.hack17} ${member.user.username}`).catch(() => {}); + }, 32000); + setTimeout(async function () { + await message.channel.send( + `${language.hack18}` + ).catch(() => {}); + }, 34000); + }); + + }} \ No newline at end of file diff --git a/commands/fun/joke.js b/commands/fun/joke.js new file mode 100644 index 00000000..780637fa --- /dev/null +++ b/commands/fun/joke.js @@ -0,0 +1,28 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'joke', + description: 'Generate a random joke from jokeAPI', + category: 'Fun' + }); + } + + async run(message) { + const data = await fetch(`https://sv443.net/jokeapi/v2/joke/Programming,Miscellaneous?blacklistFlags=nsfw,religious,political,racist,sexist`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to JokeAPI.`) + + const { type, category, joke, setup, delivery } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${category} joke`, + description: `${type === 'twopart' ? `${setup}\n\n||${delivery}||` : joke}`, + } + }); + } +}; \ No newline at end of file diff --git a/commands/fun/kaomoji.js b/commands/fun/kaomoji.js new file mode 100644 index 00000000..002670f1 --- /dev/null +++ b/commands/fun/kaomoji.js @@ -0,0 +1,3460 @@ +const discord = require("discord.js"); +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + + +const rightThere = [ + "凸(`0´)凸", + "凸ಠ益ಠ)凸", + "凸(⊙▂⊙ )", + "┌П┐(►˛◄’!)", + "凸(-0-メ)", + "凸(`⌒´メ)凸", + "凸(`△´+)", + "( ︶︿︶)_╭∩╮", + "凸(`ι _´メ)", + "凸(>皿<)凸", + "凸(^▼ェ▼メ^)", + "t(=n=)", + "t(- n -)t", + "凸(¬‿¬)", + "┌∩┐(◣_◢)┌∩┐", + "┌∩┐(ಠ_ಠ)┌∩┐", + "╭∩╮(︶︿︶)╭∩╮", + "╭∩╮(-_-)╭∩╮", + "ᕕ༼ ͠ຈ Ĺ̯ ͠ຈ ༽┌∩┐", + "( ≧Д≦)", + "(; ̄Д ̄)", + "(;¬_¬)", + "(;¬_¬)", + "(。+・`ω・´)", + "。゜(`Д´)゜。", + "( ゚Д゚)<!!", + "(‡▼益▼)", + "(,,#゚Д゚)", + "(҂⌣̀_⌣́)", + "(;¬д¬)", + "(;≧皿≦)", + "(╬゚◥益◤゚)", + "(╬⓪益⓪)", + "[○・`Д´・○]", + "૮( ᵒ̌▱๋ᵒ̌ )ა", + "(⁎˃ᆺ˂)", + "(°᷄д°᷅)", + "((╬●∀●)", + "(╬ Ò ‸ Ó)", + "( >д<)", + "(*`益´*)", + "(☞◣д◢)☞", + "<(`^´)>", + "(;`O´)o", + "( ಠ皿ಠ )", + "(`Δ´)!", + "(*`Ω´*)", + "(╬ಠ益ಠ)", + "(╬゚◥益◤゚) ╬゚", + "(╬⓪益⓪)", + "(╬ಠ益ಠ)", + "(●o≧д≦)o", + "=͟͟͞͞( •̀д•́)))", + "(๑・`▱´・๑)", + "༼ つ ͠° ͟ ͟ʖ ͡° ༽つ", + "(ฺ◣д◢)ฺ", + "(#`皿´)", + "(`Д´)", + "(メ゚皿゚)", + "(o`゚皿゚)", + "( ╬◣ 益◢)", + "(╬ಠ益ಠ)", + "(♯▼皿▼)", + "( ╬◣ 益◢)y━・~", + "(○`O´○)", + "(; ・`д・´)", + "|。`>Д<|", + "(; ・`д・´)​", + "( •̀ω•́ )σ", + "o(-`д´- 。)", + "(´・益・`*)", + "(´Д`)", + "(¬д¬。)", + "(≧▼≦;)", + "(ᇂ∀ᇂ╬)", + "(ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)", + "(ू˃̣̣̣̣̣̣o˂̣̣̣̣̣̣ ू)⁼³₌₃", + "(▼へ▼メ)", + "「(#Φ益 Φo)∩", + "s(・`ヘ´・;)", + "s(・`ヘ´・;)ゞ", + "Σ(-`Д´-ノ;)ノ", + "Σ(▼□▼メ)", + "๛∙᷅῞ॄ∙᷄", + "(°ㅂ° ╬)", + "( ー̀εー́ )", + "(눈_눈)", + "(´◣д◢`+)", + "(ʘ言ʘ╬)", + "(Ò 皿 Ó ╬)", + "(-̀◞८̯◟-́)", + "( ͒˃⌂˂ ͒)", + "┌(▀Ĺ̯ ▀-͠ )┐", + "Σ(゚д´;ノ)ノ", + "(-̀◞▥◟-́)", + "☜(`o´)", + "(◎益◎;)", + "(@益@ .:;)", + "ꉂ `o´ )", + "ಠ_ರೃ", + "(*`へ´*)", + "-`д´-", + "(*≧m≦*)", + "(* ̄m ̄)", + "(>人<)", + "(¬_¬)", + "(#ಠQಠ#)", + "(¬、¬)", + "( ಠ ಠ )", + "(¬▂¬)", + "(⋋▂⋌)", + "(>_<)", + "(>д<)", + "(≧σ≦)", + "(◣_◢)", + "(ಠ⌣ಠ)", + "(ಥ⌣ಥ)", + "ŎUŎ", + "ಠ_ಠ", + "ಠ▃ಠ", + "ಥ⌣ಥ", + "눈_눈", + "(ᗒᗣᗕ)՞", + "૮( ᵒ̌ૢཪᵒ̌ૢ )ა", + "(,,Ծ‸Ծ,, )", + "(๑•ૅㅁ•๑)", + "╬•᷅д•᷄╬꒱", + "(╬•᷅д•᷄╬)", + "(๑‾᷆д‾᷇๑)", + "〴⋋_⋌〵", + "ఠ ͟ಠ", + "(ఠ్ఠ ˓̭ ఠ్ఠ)", + "(*´罒`*)", + "(๑•॒̀ ູ॒•́๑)", + "(。ì _ í。)", + "(๑ò︵ò๑)", + "(⑉・̆⌓・̆⑉)", + "₍₍ ◝(•̀ㅂ•́)◟ ⁾⁾", + "૮( ᵒ̌皿ᵒ̌ )ა", + "(╬ ‾᷅皿‾᷄ ╬)", + "(。☉︵ ಠ╬)", + "( ‾᷅‾᷄ )", + "(`◕‸◕´+)", + "(*`д´*)", + "˃ʍ˂", + "ʕ •̀ o •́ ʔ", + "⋋_⋌", + "(o・`Д´・o)", + "( ▀ 益 ▀ )", + "(▽д▽)", + "╭(๑¯д¯๑)╮", + "(ಠ ∩ಠ)", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "(」゜ロ゜)」", + "(/゚Д゚)/", + "\(`0´)/", + "ヽ(`⌒´メ)ノ", + "ヽ(●-`Д´-)ノ", + "ヽ༼ ಠ益ಠ ༽ノ", + "(((p(>o<)q)))", + "(ノ≧┏Д┓≦)ノ", + "(ノಠ益ಠ)ノ", + "{{|└(>o< )┘|}}", + "\(・`(ェ)・)/", + "(ノಠ益ಠ)ノ", + "{{|└(>o< )┘|}}", + "\(・`(ェ)・)/", + "\(〇O〇)/", + "\(@O@)/", + "\(`O´θ/", + "\( `.∀´)/", + "\(>o<)ノ", + "ヾ( ・`⌓´・)ノ゙", + "ヾ(。◣∀◢。)ノ", + "ヽ(≧Д≦)ノ", + "ヽ(#`Д´)ノ", + "ヽ(o`皿′o)ノ", + "┗|`O´|┛", + "ヾ(。`Д´。)ノ彡☆", + "ヽ(`◇´)/", + "ヽ(´益`)ノ", + "ヽ( ̄д ̄;)ノ", + "┗(`皿´)┛", + "ヽ(`δ´)ノ", + "└(○`ε´○)┘", + "ヾ(`◇´)ノ彡", + "ヾ( ˃̶⺫˂̶。)ノ", + "─(。ìдí。)─", + "0<)”・ –>", + "_<)}} –>", + "レ(◣益◢#)ヘ", + "ヽ(`⌒´)ノ", + "(’益’)", + "((ヾ(≧皿≦;)ノ_))", + "\`•̀益•́´/", + "ヾ(`⌒´メ)ノ″", + "ヽ(`○´)/", + "б(*`・´)∂", + "╰༼=ಠਊಠ=༽╯", + "。゚゚(」。≧□≦)」", + "(ノ`Д´)ノ", + "ヽ(♯`Д´)ノ", + "ヽ(`Д´#)ノ", + "ヽ(`Д´)ノ", + "ヾ(*`ェ´*)ノ", + "ヾ(o`ェ´)ノ", + "ヾ(。`Д´。)ノ", + "ヾ(メ`・д・´)ノ゙", + "ヽ(o`Д´o)ノ", + "┗曲━(`益´)━曲┛", + "┗(`Д゚┗(`゚Д゚´)┛゚Д´)┛", + "٩(╬ʘ益ʘ╬)۶", + "٩(๑`ȏ´๑)۶", + "o( ><)o", + "o(>< )o", + "ᕙ(⇀‸↼‶)ᕗ", + "ᕦ(ò_óˇ)ᕤ", + "٩(╬ఠ༬ఠ)و", + "٩(๑`^´๑)۶", + "٩(//̀Д/́/)۶", + "٩(╬ʘ益ʘ╬)۶", + "p( Ò ‸ Ó)q ", + "\\٩(๑`ȏ´๑)۶//", + "\\\\٩(๑`^´๑)۶////", + "୧ʕ ⇀ ⌂ ↼ ʔ୨", + "୧༼ಠ益ಠ༽୨", + "o(`Д´*)o", + "୧▒ •̀ o •́ ▒୨", + "!! o(*≧д≦)o))", + "o(-`д´- o)", + "୧(๑•̀ᗝ•́)૭", + "ೕ(Ò⺫ Ó )೨", + "o(`□´)○", + "ฅ(๑*д*๑)ฅ!!", + "(#`д´)ノ", + "(・`ェ´・)つ", + "(; `ェ´ ;)b三b", + "θ\(;¬_¬)", + "(ꈨຶꎁꈨຶ)۶”", + "┗(•̀へ •́ ╮ )", + "(ヾノ•᷅ ༬•᷄ )", + "( ⓞ⃘ ⺫ ⓞ⃘۶)۶ ੭ྀ", + "(ര̀⍨ര́)و ̑̑༉", + "(*☆OДo)9 。+゚", + "(益t)", + "v(`皿´)ノ~", + "໒( ᓀ ‸ ᓂ )७", + "ヽ(*`Д´*||", + "||*`Д´*)ノ", + "o(o・`з・´o)ノ", + "໒( ⇀ ‸ ↼ )७", + "(๑•̀ㅁ•́ฅ)", + "┗(`ム´)=З", + "ι(`ロ´)ノ", + "(`∧´メ)ρ))", + "໒( : ͡° д °͡ : )७", + "щ(ºДºщ)", + "щ(ಠ益ಠщ)", + "щ(ಥДಥщ)", + "ლ (#`ロ^;)>", + "ლ(ಠ_ಠლ)", + "ლ(ಠ益ಠ)ლ", + "ლ(ಠ益ಠლ", + "ლಠ益ಠ)ლ", + "ლ(ಠ益ಠ)ლી", + "(y゚ 益゚;)y", + "Щ(◣д◢)Щ", + "Щ(ಠ益ಠЩ)", + "(ノಠ ∩ಠ)ノ彡( o°o)", + "(╯°□°)╯︵ ┻━┻", + "(╯°Д°)╯︵/(.□ . )", + "(ノಠ益ಠ)ノ彡┻━┻", + "(۶ૈ ۜ ᵒ̌▱๋ᵒ̌ )۶ૈ=͟͟͞͞ ", + "(۶ૈ ᵒ̌ Дᵒ̌)۶ૈ=͟͟͞͞ ", + "(ノꐦ ◎曲◎)ノ=͟͟͞͞ ", + "‎(ノಥ益ಥ)ノ ┻━┻", + "(ノಥДಥ)ノ︵┻━┻・/", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "( #`⌂´)/┌┛", + "ヽ(#゚Д゚)ノ┌┛", + "(((๑‾᷅༬‾᷄๑)̂—̳͟͞͞o", + "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", + "(૭ ఠ༬ఠ)૭", + "(૭ ◉༬◉)૭⁾⁾⁾⁾", + "ᕙ( ︡’︡益’︠)ง", + "( #`⌂´)/┌┛", + "ヽ(#゚Д゚)ノ┌┛", + "‾͟͟͞(((ꎤ ✧曲✧)̂—̳͟͞͞o", + "(((ꎤ๑‾᷅༬‾᷄๑)̂—̳͟͞͞o", + "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", + "(૭ ఠ༬ఠ)૭", + "~‾͟͟͞(((ꎤ >ㅿ<)̂—̳͟͞͞o", + "‾͟͟͞(((ꎤ >口<)̂ꎤ⁾⁾⁾⁾", + "(૭ ◉༬◉)૭⁾⁾⁾⁾", + "ᕙ( ︡’︡益’︠)ง", + "ヽ(#゚Д゚)ノ┌┛Σ(ノ´Д`)ノ", + "⁽͑˙˚̀⚐˚́˙⁾̉", + "⁽͑˙˚̀བ̇˚́˙⁾̉", + "ˁ⁽͑˙˚̀ˆ̇˚́˙⁾̉ˀ", + "⁽͑ʺ˚̀˙̪̺˚́ʺ⁾̉ ˃͐", + "ი⁽͑˙˚̀༡̇˚́˙⁾̉ჟ ˒˒⁼³", + "ˁ⁽͑ ˚̀˙̭˚́ ⁾̉ˀ ⁼³", + "ฅ⁽͑ ˚̀ ˙̭ ˚́ ⁾̉ฅ", + "((╬ಠิ﹏ಠิ))", + "(◞≼◉≽◟ ;益;◞≼◉≽◟)", + "☜(:♛;益;♛;)☞", + "(⁎⚈೧⚈ै⁎ૢ)", + "໒(•නන•)७", + "⁽ƈ ͡ (ुŏ̥̥̥̥םŏ̥̥̥̥) ु", + "(๑•ิཬ•ั๑)", + "( ๑॔˃̶◡ ˂̶๑॓)", + "( *`ω´)ु", + "(╬ಠิ益ಠิ)", + "⸌ ͔〠 ̖⸍⌕⁔͡⸌ ̗〠 ͕⸍⌕", + "⁽⁽(੭ꐦ •̀Д•́ )੭*⁾⁾ ᑦᵒᔿᵉ ᵒᐢᵎᵎ", + "Ƒ ư ɕ ƙ (╬゚◥益◤゚) ╬゚", + "o͡͡͡͡͡͡╮(ꐦ ꈨຶ皿ꈨຶ)╭o͡͡͡͡͡͡", + "o͡͡͡͡͡͡╮(。>口<。)╭o͡͡͡͡͡͡ ᵑ৹!", + "(・_・ヾ", + "「(゚ペ)", + "(・・。)ゞ", + "(`_´)ゞ", + "(´−`) ンー", + "。(*^▽^*)ゞ", + "(^^ゞ", + "(^~^;)ゞ", + "( ̄(エ) ̄)ゞ", + "(-_-)ゞ゛", + "(#⌒∇⌒#)ゞ", + "(⌒▽⌒)ゞ", + "(●´ω`●)ゞ", + "〈(゜。゜)", + "「(°ヘ°)", + "く(^_・)ゝ", + "σ(´し_`〃)ゞ", + "δ(´д`; )", + "↷( ó╻ò)", + "(≖ლ≖๑ )フ", + "(;^◇^;)ゝ", + "(・∧‐)ゞ", + "ଽ (৺ੋ ௦ ৺ੋ )৴", + "( ;-(エ)-)ゞ", + "(;´д`)ゞ", + "(≧д≦ヾ)", + "「(゚<゚)゙??", + "∑(⌒◇⌒;)", + "Σ(๛д๛)", + "Σ(`‐ェ‐´)", + "Σ(´д ` メ)", + "∑(O_O;)", + "Σ(‘◉⌓◉’)", + "Σ(-᷅_-᷄๑)", + "Σ(・Д・)!?", + "Σ( ̄ロ ̄lll)", + "∑(゚台゚lll", + "Σ( ̄□ ̄lll)", + "Σ( ̄□ ̄;)", + "Σ(+_@)!?", + "Σ(゚ロ、゚;)", + "∑(´゚ω゚`*)", + "Σ(; ・`д・´)", + "Σ(;・益・;;;)!!!", + "∑(´△`○)", + "Σ(´△`Ⅲ)", + "Σ(•’╻’• ۶)۶", + "(?・・)σ", + "(´・_・`)", + "(‘◇’)?", + "(゜-゜)", + "( ・◇・)?", + "(゜。゜)", + "(◎_◎;)", + "(◎-◎;)", + "(●__●)", + "(☉_☉)", + "(゚ー゚;)", + "【・_・?】", + "【・ヘ・?】", + "c( O.O )ɔ", + "ఠ_ఠ", + "(๑ ́ᄇ`๑)", + "੨੨(´・・`)", + "(メ・ん・)?", + "(o*。_。)o", + "(・・?)", + "(o゜ー゜o)??", + "(゚ペ)?", + "(・∩・)?", + "??r(・x・。)???", + ": ◉ ∧ ◉ : ╏", + "σ(゜◆゜;)", + "(;゜◆゜)σ", + "( ゜Д゜;)!?", + "(。・ω・。)?", + "(`◎△◎)!?", + "(゚▽゚`*)?", + "(*`〇Д〇)?", + "(*OчO*)", + "(*・∧・*)?", + "(*。0 – 0。*)?", + "(●´・×・`●)?", + "?(ο´・д・)??", + "(⊙_⊙’)", + "٩(͡๏̯͡๏)۶", + "(」・ω・)」", + "(」゜ロ゜)」", + "(」゚ペ)」", + "(」゚ロ゚)」", + "(❀」╹□╹)」*・", + "(」๏้๏้)」", + "ι(´Д`ι)", + "( 」。╹o╹。)」", + "ƪ(•̃͡•̃͡ ƪ", + "(」。≧□≦)」", + "(」゚Д゚)」", + "(」°ロ°)」", + "ʅฺ(・ω・。)ʃฺ??", + "(。「´-ω・)ン?", + "(*「・ω・)ン?", + "(屮゜Д゜)屮", + "щ(ºДºщ)", + "щ(゜ロ゜щ)", + "ლ(ಠ_ಠლ)", + "(ლಠ益ಠ)ლ", + "ლ(ٱ٥ٱლ)", + "щ(゚д゚щ)", + "ლ(。-﹏-。 ლ)", + "ლ(∘◕‵ƹ′◕ლ)", + "꜡( ˃ ﹆̬ ˂꜡)", + "ლ(;; ิ益 ิ;‘ლ)", + "Щ(º̩̩́Дº̩̩̀щ)", + "ლ(́⚈人⚈‵ლ)", + "щ(▼ロ▼щ)", + "щ(´Д`щ)", + "щ(`D´#щ)", + "щ(゚ロ゚щ)", + "Щ(◣д◢)艸", + "ლ(ಠ_ಠ ლ)", + "ლ(´Д`ლ)", + "ლ(ಥ Д ಥ )ლ", + "щ(ಥдಥщ)", + "ಠ_ರೃ", + "( •᷄ὤ•᷅)?", + "(⊙_◎)", + "(⊙_☉)", + "(⊙.☉)7", + "⁀⊙﹏☉⁀", + "●.◉", + "(。☉︵ ಠ╬)", + "(๑•̌.•̑๑)ˀ̣ˀ̣", + "ʕ•ૅૄ•ʔ", + "(๑•ૅૄ•๑)", + "| ͠° ▃ °͠ |", + "( -_・)?", + "▐ ˵ ͠° (oo) °͠ ˵ ▐", + "(。ヘ°)", + "(´`;) ?", + "( ?´_ゝ`)", + "ヾ(´・ ・`。)ノ”", + "ヽ(゜Q。)ノ?", + "?(*´・д・)ノ", + "(,,゚Д゚)∩", + "((´‐公‐`))", + "<|^□^#|/", + "( ̄■ ̄;)!?", + "(>囗<?)", + "( ⌡ ຶम⌡ ຶ )", + "(๑ಕ̴ _̆ ಕ̴) ン?", + "(゚Д゚?)", + "?(°Д°≡°Д°)?", + "(♠_♦)", + "(C_C)", + "¿(❦﹏❦)?", + "(;´@へ@`)", + "( ⧉ ⦣ ⧉ )", + "( ؕؔʘ̥̥̥̥ ه ؔؕʘ̥̥̥̥ )?", + "﴾͡๏̯͡๏﴿", + "`(๑ △ ๑)`*", + "٩(̾●̮̮̃̾•̃̾)۶", + "( ؔ⚈͟ ◡ ؔ⚈͟ ๑)…ン?", + "(⸝⸝⸝՞̐ˀ̝՞̐ू)˖̛̠͉", + "(◕▿◕)??", + "ɿ(。・ɜ・)ɾⓌⓗⓨ?", + "ɿ(。・ɜ・)ɾⓌⓗⓐⓣ?", + "(「๑•₃•)「 ʷʱʸ?", + "(ㆀ˘・з・˘)ωҺat?", + "Ⓦⓗⓐⓣ(☉൧ ಠ ꐦ)", + "(ㆀ˘・з・˘)ωҺa ƭ?", + "Σ(‘Д’⁕)ահɑԵ’Տ up !?", + "(」゚ロ゚)」NOOOooooo━", + "【=◈︿◈=】", + "*^^)/。 ・:*:・゜ ★,。 ・:*:・゜☆オメデト", + "オメデタ・スター( ^_^)/☆.。.:*・°☆.。.:*・°☆.。.:*・°☆", + "( ^^)//(  ( )\\(^^ )ドンドン♪", + "(^-^)//\"\" パチパチ", + "オメデト☆\"8(^-^8 )Ξ( 8^-^)8\"☆オメデト", + "( ^。)iiiiiiおめでとう (~ 3 )iiiiiふー", + "( -。-) スゥー ( °口°) オメデトーー!", + "オメデト☆彡(^_^)∠※ PAN!", + "才×〒\"├¬♪ (。・_・)ノ☆・°:*:°", + "(/@^。)/お☆め☆で☆と☆う\(。^@\)", + "(*^ ^)/。・:*:・°'★,。・:*:・°'☆ Congratulations", + "(\.Y/. )(\.Y/. )おめでとうだっちゅうの♪", + "^(ノ゜ー゜)ノ☆パチパチ", + "( ^o^)ノ◇ ザブトン1マイダネ", + "(^ ○ ^)お!(^ □ ^)め!(^ ◇ ^)で!(^ ▽ ^)と!(^ ・ ^)う!", + "( *゜▽゜)/°・:*【祝】*:・°\(゜▽゜* )", + "(* ‘∇‘)/°・:*【祝】*:・°\(‘∇‘ *)", + "(* ̄(エ) ̄)/°・:*【祝】*:・°\( ̄(エ) ̄*)", + "(ノ_・。)/°・:*【祝】*:・°\(;_\)", + "(*^◇^)/°・:*【祝】*:・°\(^◇^*)", + "(*^ー^)/°・:*【祝】*:・°\(^ー^*)", + "オメデトウ ( ^ _ ^)∠☆PAN!", + "オメデト(・Θ・)ピヨピヨ♪", + "オメデトウジャクシ♪ (' - ' *)~~", + "。・:*:・°'★( ^Θ^ )オメデトピヨピヨ♪★'°・:*:・。", + "★祝福の大砲!☆(ノ^o^)♂ドド-ン ", + "オメデッポウ!(/^o^)♂♂ ・・・[オメデトウ]", + "(*^o^*)オ (*^。^*)メ (*^-^*)デ (*^o^*)トー", + "お( ̄○ ̄)め( ̄◇ ̄)で( ̄△ ̄)と( ̄0 ̄)う( ̄ー ̄)", + "お( ̄○ ̄;)め( ̄◇ ̄;)で( ̄△ ̄;)と( ̄0 ̄;)う( ̄ー ̄;)", + "オ(・ 。 ・)メ(・ ◇ ・)デ(・ △ ・)ト(・ 0 ・)ウ(・ ー ・)", + "おめでと~☆ シャンシャン゛8(^∇^゛8)(゛8^∇^)8゛シャンシャン", + "~( ^▽^)∠※☆ おめでとうでチュ~", + "(σ_σ)_∠※PAN!:・'°☆。.:*:・'°★°", + "( ^。^)オメデト∠※ポン!。・:*:・°'★,。・:*:♪・°'☆ミ", + "( ^-^)ノ∠※PON!。.:*:・'°☆。.:*:・'°★°'・:*オメデトウ", + "☆・。・。★・°・。・°☆ミ( ・_・ )ノ彡☆°・。・°★・。・。☆", + "☆・。・。★・°・。・°☆ミ(=^_^=)ノ彡☆°・。・°★・。・。☆", + "キラリーン(@ ^ ^)/。・:*:・°'★,。・:*:・°'☆ Congratulations!・:*:・°", + "オメ*《 ※ ☆( ★\(^0^)/★ )☆ ※ 》*デトウ", + "オメデタ (*'J '*) パオ~ン", + "( ^o)-o<パッパラッパ│~~~♪お♪め♪で♪と♪ー♪", + "ヤッタネ!(b^ー°) オメデト♪", + "オメメー\(^O^)/(*^_^*)\(^O^)/オメメー", + "お (o|o)┘め└(o|o) で (o|o) と└(o|o) う└(o|o)┘", + "オメデト肉まん (ノ^o^)ノ‥‥‥…━━━━(^○^ ) ハムハム", + "\(∇⌒\)☆オ☆メ☆デ☆ト☆ウ☆(/⌒∇)/", + "♪オメデト★*☆ヽ( ^-^)/★*☆オメデト♪", + "(*^ー^)/°・:*:・。オメデトウ。・:*:・°\(^ー^*)", + "オメデトウ(^-^)ノ~~・:*。・:*:・°'☆", + "★⌒☆⌒★〓☆ 祝 ☆〓★⌒☆⌒★", + "(* ̄ー ̄)ノ彡☆゜・。・゜★・。・。☆", + "(* ^^)/。・:*:・°'★,。・:*:・°'☆[Congratulations]", + "(  ̄(エ) ̄)ノ∠※PAN!。.:*:・'°☆。.:*:・'°★°'・:*オメデト", + "☆彡(ノ^ ^)ノ Congratulations ヘ(^ ^ヘ)☆彡", + "☆彡(ノ^^)ノ☆彡ヘ(^^ヘ)☆彡(ノ^^)ノ☆彡 Congratulations!!", + "\(^o^)≪★祝☆CONGRATULATIONS☆祝★≫(^o^)/", + "★☆オメデト☆★ヘ(^^ヘ)(ノ^^)ノ★☆オメデト☆★", + "=お( ^ O ^ )め( ^ 。 ^ )で( ^ O ^ )と( ^ o ^ )う( ^ 。 ^ )=", + " o<^・O・^>oオo<^・o・^>oメo<^・_・^>oデo<^・o・^>oトo<^・O・^>o", + "オメデト! ^-^)ノ ---==ΞΞΞ☆ 幸運の星", + "(ノ' 0 ')ノ~♪祝福 v(^ O ^)v の宴♪~ヘ(' 0 'ヘ)", + "o( ^ - ^ )m(- ^ )e(^   )d(   )e(   ^)t(  ^-)o( ^ - ^ )", + "オメットタイソウ1,2 ヽ(^_^))((^。^)ノ 3,4", + "ヽ(^-^ヽ)♪オメ♪ヾ(^‐^)ゞ♪オメ♪(/ ^-^)/", + "(=^ェ^=) おめでとにゃーん♪", + "┌(★o☆)┘♪└(★o★)┐♪┌(☆o★)┘オメピカ♪", + "☆;:*:;☆;:*:;☆“Congratulations”☆;:*:;☆;:*:;☆", + "オメデトカタツムリ .........@ノ”", + "オメデトコーラス ( °o°)( °o °)(°o° ) ドゥーワ~♪", + "なんて凄いんだ! ( /|_|)/:・;^・;・*.\";.*::*.;\".*・;・^;・: おめでとう!", + "⊂((〃'⊥'〃))⊃♂オ(⊂((・⊥・))⊃)♀メ", + ".....(((((((((((((。・_・。)ノ オメレト", + "ヾ(°ρ°) オメデター", + "(/~ー~)/‥∵:*:☆*゜★。::*☆ オメデトウ", + "オメットモンキー ⊂((〃'⊥'〃))⊃ / 。 ・:*:・゜ ★", + "(°Д°;)オッ!(°口°;)メッ! ( >з<)=3 デトーーークション!", + "ギリギリ ( ・_・)ノ~~~~~~>゜(((オメデトウ))彡", + ":*:((( ¨)/。.:*:・'☆オメデトウ☆", + "\_(^◇^)_/\(*^^*)/ 優勝オメデトウ!", + "(*^^)//。・:*:・°'★,。・:*:♪・°'☆パチパチ", + "(*^^)/。・:*:・°★,。・:*:・°☆オメデト!!", + "(^-^)//\"\"パチパチ", + "(^ ^)//゛゛゛パチパチ", + "(^^)// ハクシユー", + "ヘ(。□°)ヘ", + "(☉ε ⊙ノ)ノ", + "\(●o○;)ノ", + "\(☆o◎)/", + "⁀⊙﹏☉⁀", + "~(๑ñ﹏ ⊙☆)ノ", + "ヾ (✿>﹏ ⊙〃)ノ", + "ヽ(。_°)ノ", + "ヽ(。ゝω・。)ノ", + "ヾ(。ꏿ﹏ꏿ)ノ゙", + "ヽ(‘ ∇‘ )ノ", + "ヾ(@゜∇゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヽ(゜Q。)ノ", + "Σ(♡@﹏ @☆)ノ”", + "щ (*ㅇ△ Φ☆)ノ", + "へ(゜∇、°)へ", + "ヘ(゜◇、゜)ノ", + "ヘ(゜Д、゜)ノ", + "ヘ(°◇、°)ノ", + "ミ●﹏☉ミ", + "⁽⁽◝(ˊʂ˴⁎)◞՞", + "ヽ(°▽、°)ノ", + "(ლ ۞ิ ჴ ۞ิ)ლ", + "(/●◔∀◐●)/", + "ヾ|`・、●・|ノ", + "(ノ)ʘ﹃ʘ(ヾ)", + "\(´◓Д◔`)/", + "◝₍ᴑ̑ДO͝₎◞", + "(╯⊙ ⊱⊙╰ )", + "੧| ⊗ ▾ ⊗ |୨", + "⊂(©෴©)つ", + "ゞ(ↂ ω ↂ)ゞ", + "ヘ(゚∇゚ヘ)", + "(⑅ 「O_o)「", + "(⑅∫°ਊ°)∫", + "ヽ(๏∀◕ )ノ", + "へ[ ᴼ ▃ ᴼ ]_/¯", + "(。□゚ノ)ノ", + "┌(。°з ┐ )┘三└( ┌ ε°。)┐┘", + "(。☉౪ ⊙。)", + "(๑∀๑)", + "(⊙﹏⊙✿)", + "(⊙_◎)", + "(♠_♦)", + "(ּơ̑ළּơ̑)", + "(ʺʘੂ๔̈ੁʘੂ)", + "⊙_ʘ", + "◴_◶", + "◖|◔◡◉|◗", + "˛˛(๑ּగ˞ּగ๑) ̉ ̉", + "ಠ ּ͜೦", + "⊆◍益◍⊇", + "(*☉౪ ⊙。)", + "∑(*☼_☉*)", + "(╬☉д⊙)⊰⊹ฺ", + "~(-◎ω◎)", + "~(-◎y◎)", + "(◎ω◎*)", + "( ◎✦⃟◎ )", + "(◦△☆)~~!!!", + "(°͜ʖ͡°)", + "✦⍜✧", + "v(〄_〄)v", + "(。ヘ°)", + "(゜▼゜*)", + "(゜▽゜;)", + "`(๑ △ ๑)`*", + "(*゚∀゚*)", + "(*°∀°)", + "ъ川゚д^川", + "(o≧▽゚)o", + "Σ(・A゜)", + "┏( .-. ┏ ) ┓", + "( ┐΄✹ਊ✹)┐", + "σ(●゚┏∀┛。●)ノ", + ".(⁎ꈍ﹃ก⁎)๛", + "ര.༵ര", + "(((o(*゚▽゚*)o)))", + "o((*^▽^*))o", + "O(≧▽≦)O", + "o(〃^▽^〃)o", + "o(^▽^)o", + "O(≧∇≦)O", + "o(≧∇≦o)", + "σ(≧ε≦o)", + "o(*^▽^*)o", + "⌒°(❛ᴗ❛)°⌒", + "o(^∀^*)o", + "o(^◇^)o", + "《《o(≧◇≦)o》》", + "o(*≧□≦)o", + "o(*>ω<*)o", + "(ノ・ェ・)ノ", + "(/^▽^)/", + "(ノ´ヮ´)ノ*:・゚✧", + "(ノ≧∀≦)ノ", + "(ノ^ヮ^)ノ*:・゚✧", + "(/ ‘з’)/", + "(/ ‘з’)/ʸᵉᵃʰᵎ", + "⁽(◍˃̵͈̑ᴗ˂̵͈̑)⁽", + "(╯✧∇✧)╯", + "Σ(ノ°▽°)ノ", + "( ƅ°ਉ°)ƅ", + "ヽ( ・∀・)ノ", + "˭̡̞(◞⁎˃ᆺ˂)◞*✰", + "(p^-^)p", + "(ノ^∇^)ノ゚", + "ヽ(〃・ω・)ノ", + "(۶* ‘ꆚ’)۶”", + "(ノ・д・)ノ", + ".+:。(ノ・ω・)ノ゙", + "Σ(*ノ´>ω<。`)ノ", + "ヾ(〃^∇^)ノ♪", + ".゚☆(ノё∀ё)ノ☆゚.", + "⌒゚(❀>◞౪◟<)゚⌒", + "⤴︎ ε=ε=(ง ˃̶͈̀ᗨ˂̶͈́)۶ ⤴︎", + "୧༼✿ ͡◕ д ◕͡ ༽୨", + "ヽ(;^o^ヽ)", + "╰(✧∇✧╰)", + "٩(•౪•٩)三", + "₍•͟ ͜ • ₎", + "q(^-^q)", + "\(・c_・●)ゞ", + "۹⌤_⌤۹", + "ヾ(0∀0*★)゚*・.。", + "ヾ│・ェ・ヾ│", + "╰(・∇・╰)", + "。(>ω<。)", + "ヾ(・ω・。)シ", + "ヾ(・д・ヾ)", + "ヽ(´∀`ヽ)", + "ヽ(´ω`○)ノ.+゚*。:゚+", + "ヾ(≧∇≦*)ゝ", + "\(@ ̄∇ ̄@)/", + "\(^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "(((\(@v@)/)))", + "\(*T▽T*)/", + "\(^▽^)/", + "\(T∇T)/", + "ヽ( ★ω★)ノ", + "ヽ(;▽;)ノ", + "ヾ(@† ▽ †@)ノ", + "ヾ(@^∇^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@゜▽゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヾ(@°▽°@)ノ", + "ヽ(*≧ω≦)ノ", + "ヽ(*⌒∇⌒*)ノ", + "ヽ(^。^)丿", + "ヽ(^Д^)ノ", + "ヽ(=^・ω・^=)丿", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "⸜(ّᶿധّᶿ)⸝", + "ヽ(。・ω・。)ノ", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "⸜(ّᶿധّᶿ)⸝", + "ヽ(。・ω・。)ノ", + "╰(‘ω’ )╯", + "╰(°ㅂ°)╯", + "┗(^∀^)┛", + "ヾ(๑’౪`๑)ノ゙", + "ヾ(*Őฺ∀Őฺ*)ノ", + "╰(✧∇✧)╯", + "✯⸜(ّᶿ̷ധّᶿ̷)⸝✯", + "╰(◉ᾥ◉)╯", + "⌒°(ᴖ◡ᴖ)°⌒", + "ヾ(´∀`○)ノ", + "。゚✶ฺ.ヽ(*´∀`*)ノ.✶゚ฺ。", + "\(;゚∇゚)/", + "ヽ(*´∀`)ノ゙", + "⸂⸂⸜(ೆ௰ೆ๑)⸝⸃⸃", + "✧⁺⸜(●′▾‵●)⸝⁺✧", + "ヾ(`ω` )/", + "ヾ(。^ω^。)ノ", + "⸜(ّᶿॕധّᶿॕ)⸝", + "⸜(ؔᶿധؔᶿ)⸝", + "╰( ・ ᗜ ・ )╯", + "┏○ \(゚ 0゚ ;)/┓", + "ヽ(^◇^*)/", + "ヾ(≧∇≦)ゞ", + "*。ヾ(。>v<。)ノ゙*。", + "☆*~゚⌒(‘-‘*)⌒゚~*☆", + "ヽ(゚∀゚)ノ", + "ヾ(o≧∀≦o)ノ゙", + ".。゚+.ヽ| ゝ∀・*|ノ。+.゚", + "(゚<|\(・ω・)/|>゚)", + "╰| ° ◞౪◟ ° |╯", + "ヽ༼>ل͜<༽ノ", + "ヽ[ヘ ل͟ ヘ]╯", + "\(・ω・)/", + "ヽ(゜ω゜○)ノ", + "☆~~ヾ(>▽<)ノ。・☆", + "\(*´・∀・`*)/", + "\(゜э゜)/", + "ヾ( ̄◇ ̄)ノ", + "ヾ【*≧д≦】ノ", + "ヽ(^O^)ノ", + "ヾ(´▽`*)ノ☆", + "ヾ(・∀・`*)ノ☆", + "☆ヾ(*´▽`)ノ", + "☆ヾ(*´・∀・)ノ", + "ヾ(*・ω・)ノ", + "ヾ(・ω・*)ノ", + "ヽ( ´¬`)ノ", + "ヾ(≧∪≦*)ノ〃", + "ヾ(*ゝω・*)ノ", + "\(○^ω^○)/", + "╰(*´︶`*)╯", + "ヽ( ´ー`)ノ", + "┝\( ‘∇^*)^☆/┥", + "ヽ(^o^)丿", + "┗|⌒O⌒|┛", + "┗|・o・|┛", + "ヾ(●・◇・●)ノ", + "ヽ( ‘ω’ )ノ", + "((ヾ(* ´∀`)ノ))", + "ヽ(´∇`)ノ", + "ヽ(^□^。)ノ", + "ヾ(o✪‿✪o)シ", + "\(*゚∀゚*)/", + "\(*^¬^*)/", + "Ψ(≧ω≦)Ψ", + "ヽ(*≧л≦)ノ", + "୧☉□☉୨", + "(* >ω<)", + "(*≧▽≦)", + "(๑>ᴗ<๑)", + "( ˃̶ω˂̶ ૃ)", + "(٭°̧̧̧ω°̧̧̧٭)", + "⸍̥ꇴ̥⸌", + "(⊙ꇴ⊙)", + "(*≧∀≦*)", + "(≧∇≦*)", + "(๑✧∀✧๑)", + "(★^O^★)", + "(ᗒᗨᗕ)", + "(≧∀≦)", + "₊·*◟(˶╹̆ꇴ╹̆˵)◜‧*・", + "(ᗒᏬᗕ) ˡ̵˖✮⃛", + "(ؑ⸍⸍ᵕؑ̇⸍⸍)◞✧", + "✮⃛( ◞´•௰•`)✮⃛", + "(ؑᵒᵕؑ̇ᵒ)◞✧", + "₍₍ ◝(●˙꒳˙●)◜ ₎₎", + "(´。✪ω✪。`)", + "。;+*(★`∪´☆)*+;。", + "(๑˃̶͈̀o˂̶͈́๑)", + "≧ω≦", + "٩(^ᴗ^)۶", + "٩(●˙▿˙●)۶…⋆ฺ", + "٩(๑ơలơ)۶♡", + "٩(ó。ò۶ ♡)))♬", + "ε٩( ºωº )۶з", + "٩(๑òωó๑)۶", + "٩( ๑^ ꇴ^)۶", + "٩(๑˃́ꇴ˂̀๑)۶", + "٩(๑∂▿∂๑)۶♡", + "٩(♡ε♡ )۶", + "۹(ÒہÓ)۶", + "٩(ȏ)۶", + "٩(✿∂‿∂✿)۶", + "୧⍢⃝୨", + "⁽⁽٩(๑˃̶͈̀ ᗨ ˂̶͈́)۶⁾⁾", + "٩(;ʘ¿ʘ;)۶", + "=。:.゚٩(๑>ω<๑)۶:.。+゚", + "٩(˘◊˘)۶", + "٩(*ゝڡゝ๑)۶♥", + "٩(。θᗨθ。)۶", + "٩(ᴗ)۶", + "୧(˃◡ु˂)୨", + "۹(˒௰˓)۶", + "٩(●ᴗ●)۶", + "♡〜٩( ˃́▿˂̀ )۶〜♡", + "٩(º౪º๑)۶", + "=。:.゚٩(๑>◊<๑)۶:.。+゚", + "٩(๑❛ᴗ❛๑)۶", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "୧〳 ” ʘ̆ ᗜ ʘ̆ ” 〵୨", + "٩(๑❛ʚ❛๑)۶", + "٩(இ ⌓ இ๑)۶", + "୧| ” •̀ ل͜ •́ ” |୨", + "୧( , ^ ^ , )୨", + "٩| ര ‿ ര |╯", + "୧〳 ^ ౪ ^ 〵୨", + "୧( ˵ ° ~ ° ˵ )୨", + "୧། ☉ ౪ ☉ །୨", + "୧༼ ヘ ᗜ ヘ ༽୨", + "࿌ིྀ྇°˚࿅୧( ॑ധ ॑)୨࿅˳०࿌ིྀ྇", + "٩(◦`꒳´◦)۶", + "٩(๑˃̌ۿ˂̌๑)۶", + "٩(θ‿θ)۶", + "␟␏(ɲ˃ ˈ̫̮ ˂ɳ)␟␏ෆ", + "₊*ˈ˚·(๑˃̶̡̢̥ ॣಐ ॣ˂̶̡̢̥๑)·˚ˈ*₊", + "✩⃛∗·⁽⁽◞(˃◟̵◞̵˂⁎=͟͟͞͞ ⁎˃◟̵◞̵˂)◟⁾⁾·∗✩⃛", + "o(^O^*=*^O^)o", + "✧(๑✪д✪)۶ㅂ٩(✪д✪๑)✧", + "ヾ(゚∀゚○)ツ三ヾ(●゚∀゚)ノ", + "✧*.◟(ˊᗨˋ)◞.*✧ᗯ੨~ɪ̊♪ْ˖⋆", + "ෆු(*˃ர்˂*)ෆු", + "(ٛɲ˃ ˑ̣̮ ˂ٛɳ)", + "( ˃̆ૢ௰˂̆ૢഃ )", + "ლ(*꒪ヮ꒪*)ლ", + "૮(ᶿ̴͈᷇ॢ௰ᶿ̴͈᷆ॢ)ა✧", + "∗˚(* ˃̤൬˂̤ *)˚∗", + "б(>ε<)∂", + "∩|*`・ρ・´|∩", + "(gΦ皿Φ)g〃", + "(༶ૢ˃̵̑◡˂̵̑༶ૢ)", + "о(ж>▽<)y ☆", + "*\( *ω*)┓", + "โ๏∀๏ใ", + "癶(癶✺౪✺ )癶", + "⊂((〃≧▽≦〃))⊃", + "~(≧◇≦)/゙゙゙゙", + "6((((≧▽≦))))9", + "☆*・゜゚・*(^O^)/*・゜゚・*☆", + "☆*:.。. o(≧▽≦)o .。.:*☆", + "*✲゚*。✧٩(・ิᴗ・ิ๑)۶*✲゚*。✧", + "。.゚+:((ヾ(。・ω・)シ)).:゚+。", + "\( ● ⌒ ∇ ⌒ ● )/", + "゚・✿ヾ╲(。◕‿◕。)╱✿・゚", + "\\(゜ロ\\)Ξ(//ロ゜)//", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(^ ਊ ^)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "\(○^ω^○)/", + "゜+。:..:。+゜ (o´∀`o)──力ゎレlレl──(o´∀`o) ゜+。:..:。+゜", + "d(^^*)", + "♪d(´▽`)b♪オールオッケィ♪", + "♪(゚▽^*)ノ⌒☆", + "σ(゚ー^*)", + "(≧∇≦)キャー♪", + "ヾ(≧∇≦)ゞ チガウゥ", + "(o≧▽゚)oニパッ", + "(o゚▽゚)oニパッ", + "ヽ(*’-^*)。", + "ヾ(´▽`*;)ゝ", + "( ´∀`)ケラケラ", + "(´ω`*)ネー", + "゚+.(・∀・).+゚.。oO(    )", + "(人´∀`).☆.。.:*・", + "(ノ≧∀≦)ノ・‥…━━━★ ピキューン!", + "(;≧∇≦) =3 ホッ", + "にゃる~(σ^▽^)σ", + "o(≧∇≦o)(o≧∇≦)o", + "(゜ー゜*)ネッ!", + "(´ェ`*)ネー", + "^ω^", + "▼ω▼", + "(*^-^)", + "o(^-^)o", + "o(^▽^)o", + "σ(^○^)", + "(=^_^=)", + "(∩_∩)", + "o(^◇^)o", + "(゚∇^*)", + "(o^∀^)", + "(`▽´)", + "(☆▽☆)", + "(*´ー`)", + "(o^-^o)", + "(o^∇^o)", + "(○゚ε^○)", + "かわ.゚+.(´∀`*).+゚.ぃぃ", + "(*´∀`*)ゞ", + "(*・∀-)☆", + "゚+。:.゚ヽ(*´∀`)ノ゚.:。+゚", + "(★ ̄∀ ̄★)", + "{*≧∀≦}", + "°+(*´∀`)b°+°", + "(o゚▽゚)o゚▽゚)o゚▽゚)o ニパッ ニパッ ニパッ", + "0(^▽^*三*^▽^)0", + "y(^ヮ^)y", + "(●^U^●)", + "o(^∀^*)o", + "(○●^▽^●○)./", + "(o*∩3<*)☆", + "米^-^米", + "☆^(o≧∀≦)oニパッ", + "(´∀`)", + "(●>v<●)", + "(○^▽^○)", + "d(・∀<)ナイスッ*。*。”。*", + "(●^皿^●)にまー・・・", + "(●>ω<●)", + "(>Ц<●)", + "(◎>∀<◎)", + "・.。*・.。*(〃´∀`)・.。*・.。*ポワワァン…", + "(^■^*)", + "(*・∀<*)", + "(*´▽`*)", + "(●´I`●)", + "(o^^o)", + "カオ(o´∀`o)可愛いよ!", + "(◎>U<◎)", + "*:゜☆ヽ(*’∀’*)/☆゜:。*。", + "ヽ(= ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∇ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄=)ノ", + "(*・▽・*)", + "(´w`*)", + "ニコ(*^_^*)ニコ", + "\(^○^)人(^○^)/アハハハハ♪", + "(。→∀←。)キャハ♡", + "゜+・(о´▽`о)゜+・", + "(*ノ∀`*)ノ", + "(*ロ′∀`b)・゜☆$,", + "((●≧艸≦)プププッ", + ".゚+.(´∀`*).+゚.", + "(*´∀`)アハハン♪", + "(^▽^●)", + "(●^□^●)", + "(*#′∀`艸)", + "+.゚(●´I`)b゚+.゚", + "(^∀^)", + "(^-^)ニコッ", + "ヾ(*Ő౪Ő*)", + "人-∀Q`圉)+°。", + "(v`▽´)v", + "(◕ฺー≦)ノ", + "(*●艸∀<$)◆◇", + "・+゜・。(*´∀`*)・゜+。+・", + "【●´∀`●】アヒャアヒャ*", + "((@^ェ^@))", + "\( ● ⌒ ∇ ⌒ ● )/", + "。.:*.゜☆(●´∀`●)ニコ.゜☆.。.:*.゜", + "♬♩♫♪☻(●´∀`●)☺♪♫♩♬", + "*^ヮ^)♪.,#,.♪sumairu♪.,#,.♪(+´∀`+)", + "( ͡° ͜ʖ ͡°)", + "∠( ᐛ 」∠)_", + "(゚⊿゚)", + "ᕕ( ᐛ )ᕗ", + "_へ__(‾◡◝ )>", + "( ᐛ )و", + "( ◞・౪・)", + "( ´ ▽ ` )ノ", + "(*^▽^*)", + "(´∇ノ`*)ノ", + "(ノ^∇^)", + "⊂((・▽・))⊃", + "( ^∇^)", + "( ゚▽゚)/", + "(‐^▽^‐)", + "(“⌒∇⌒”)", + "(*´▽`*)", + "(*^▽^)/", + "(*^▽^*)", + "(*~▽~)", + "(*≧▽≦)", + "(*⌒∇⌒*)", + "(*⌒▽⌒*)θ~♪", + "(/^▽^)/", + "(^∇^)", + "(^▽^)", + "( ̄▽ ̄)ノ", + "( ̄▽+ ̄*)", + "(゜▽゜;)", + "(=´∇`=)", + "(=⌒▽⌒=)", + "(≡^∇^≡)", + "(≧∇≦)/", + "(⌒▽⌒)", + "(⌒▽⌒)☆", + "(⌒▽⌒ゞ", + "(●⌒∇⌒●)", + "(❁´▽`❁)*✲゚*", + "(ノ*゜▽゜*)", + "°˖✧◝(⁰▿⁰)◜✧˖°", + "~ヾ(^∇^)", + "∩(︶▽︶)∩", + "≧(´▽`)≦", + "ー( ´ ▽ ` )ノ", + "ヾ(´▽`;)ゝ", + "ヾ(^∇^)", + "d=(´▽`)=b", + "o(〃^▽^〃)o", + "o(^▽^)o", + "O(≧∇≦)O", + "o(≧∇≦o)", + "(≧∇≦*)", + "(=^▽^=)", + "o(*^▽^*)o", + "೭੧(❛▿❛✿)੭೨", + "☜(⌒▽⌒)☞", + "☜(˚▽˚)☞", + "ɾ⚈▿⚈ɹ", + "ヘ(= ̄∇ ̄)ノ", + "φ(*⌒▽⌒)ノ", + "(*・▽・*)", + "(☆▽☆)", + "≡(*′▽`)っ", + "」( ̄▽ ̄」)", + "(〃⌒∇⌒)", + "〔´∇`〕", + "(゜▼゜*)", + "໒( ͡ᵔ ▾ ͡ᵔ )७", + "(。´∀`)ノ", + "( ´∀`)", + "(・∀・)", + "(´∀`)", + "(°∀°)b", + "(●´∀`●)", + "(゚∀゚)☞", + "*(*´∀`*)☆", + "( ´ ∀ ` )", + "ヽ(・∀・)ノ", + "(。≖ˇ∀ˇ≖。)", + "((o(´∀`)o))", + "o(´∀`*)", + "(゚∀゚ )", + "(*≧∀≦*)", + "(*゚∀゚*)", + "ヾ(*´∀`*)ノ", + "(o^∀^o)", + "ヾ(^ิ∀^ิ)", + "o(`・∀・´)○", + "(ᗒᗊᗕ)", + "(ノ・∀・)ノ", + "o((◕ฺ∀ ◕✿))o", + "(´・∀・`)", + "∩(´∀`∩)", + "(ノ `・∀・)ノ゙", + "( ゚∀ ゚)", + "Ψ(゚∀゚ )Ψ", + "Ψ( ゚∀゚)Ψ", + "Ψ(゚∀゚)Ψ", + "d┃・∀・┃b", + "(*´・∀・)", + "(・∀・○)", + "【°∀°】", + "(★ ̄∀ ̄★)", + "(m*´∀`)m", + "=͟͟͞͞( °∀° )☛", + "∩(´∀`∩)", + "∩( ´∀` )∩", + "(∩´∀`)∩", + "⊂( ・ ̫・)⊃", + "(*′☉.̫☉)", + "((ඏ.̫ඏ*))", + "⁽͑˙ˆ˙̫ˆ˙⁾̉", + "(๑★ .̫ ★๑)", + "‧⁺◟( ᵒ̴̶̷̥́ ·̫ ᵒ̴̶̷̣̥̀ )", + "(^~^)", + "( ‾ʖ̫‾)", + "(̂ ˃̥̥̥ ˑ̫ ˂̥̥̥ )̂", + "⁽ˇ́˙̫ˇ̀˵⁾", + "( ᵕ̤ ‧̫̮ ᵕ̤ )", + "⁽͑΅ ˙̫ ῭⁾̉", + "(⋆ʾ ˙̫̮ ʿ⋆)", + "੭व(๑• .̫ •๑) ✧", + "(*′☉.̫☉)", + "⁽͑˙՞˙̫՞˙⁾̉", + "(´•.̫ • ⋈)", + "( ❝̆ ·̫̮ ❝̆ )✧", + "((⚆·̫⚆‧̣̥̇ ))", + "(Θ̎Ͻ̫̥Θ̎)", + "ᗧʻ̑ ˙̫ ʻ̑ᗤ", + "( •́ .̫ •̀ )", + "(*´・v・)", + "(*^v^*)", + "(^v^)", + "(▰˘v˘▰)", + "(n˘v˘•)¬", + "(´。・v・。`)", + "♡✧( ु•⌄• )", + "( •⌄• ू )✧", + "῍̩̞(∗ɞ⌄ɞ∗)◞", + "(′ʘ⌄ʘ‵)", + "( ^_^)/", + "(^ _ ^)/", + "(^_^)", + "(^-^*)/", + "( ̄ー ̄)", + "(∩_∩)", + "(∩▂∩)", + "(☆^ー^☆)", + "(v^_^)v", + "p(*^-^*)q", + "(^・ω・^ )", + "(=^-ω-^=)", + "(=^・ω・^)y=", + "( ノ^ω^)ノ゚", + "(_´ω`)", + "(。・ω・。)", + "(︶ω︶)", + "(`・ω・´)”", + "(´ω`★)", + "(^ω^)", + "(◐ω◑ )", + "∩( ・ω・)∩", + "ヾ(。・ω・。)", + "୧( ॑ധ ॑)୨", + "d(=^・ω・^=)b", + "o(U・ω・)⊃", + "V(=^・ω・^=)v", + "川´・ω・`川", + "(*´꒳`*)", + "(*^ω^*)", + "(❁´ω`❁)", + "(´-ω-`)", + "ଘ(੭ˊ꒳ˋ)੭✧", + "(´へωへ`*)", + "( ^ω^)", + "( ^ω^)", + "(’ω’)", + "(‘ω’)", + "(‘ω’)", + "٩(ↁωↁ❀)", + "˚✧₊⁎( ˘ω˘ )⁎⁺˳✧༚", + "(◜௰◝)", + "✾(〜 ☌ω☌)〜✾", + "(´∩ω∩`)", + "(¬‿¬)", + "( ⋂‿⋂’)", + "(-‿◦)", + "(*‿*✿)", + "(•‿•)", + "(•̀ᴗ•́)و ̑̑", + "(─‿─)", + "(◍•ᴗ•◍)", + "(◑‿◐)", + "(✿´‿`)", + "(❀◦‿◦)", + "(❁´‿`❁)*✲゚*", + "(ᅌᴗᅌ* )", + "(•ˇ‿ˇ•)-→", + "♫꒰・‿・๑꒱", + "o (^‿^✿)", + "(◑‿◐✿)", + "(◡‿◡✿)", + "(✿◠‿◠)", + "(◕‿◕✿)", + "(๑>ᴗ<๑)", + "(๑✧◡✧๑)", + "(๑>◡<๑)", + "♪(๑ᴖ◡ᴖ๑)♪", + "(。◝‿◜。)", + "(๑^ں^๑)", + "(ෆ ͒•∘̬• ͒)◞", + "(•৺•)", + "(ට˓˳̮ට๑)", + "(๑•͈ᴗ•͈)", + "₍՞◌′ᵕ‵ू◌₎♡", + "三⊂( っ⌒◡|", + "(ؑᵒᵕؑ̇ᵒ)◞✧", + "꒰•́ॢ৺•̀ॢ๑͒꒱", + "⁽(◍˃̵͈̑ᴗ˂̵͈̑)", + "(人 •͈ᴗ•͈)", + "(*˙︶˙*)☆*°", + "(୨୧ ❛ᴗ❛)✧", + "(*◕ᴗ◕*)", + "( ¨̮ )", + "(*´╰╯`๓)♬", + "(∗❛ัᴗ❛ั∗)", + "⊂(◉‿◉)つ", + "(人 •͈ᴗ•͈✿ฺ)", + "( ・ᴗ・̥̥̥ )", + "(≖ ‿ ≖)", + "(๑˃͈꒵˂͈๑)", + "(>̯-̮<̯)", + "(-‿-)", + "(๑→‿ฺ←๑)", + "(∗ᵕ̴᷄◡ᵕ̴᷅∗)՞", + "( •॒◞ ͜◟•॒ )", + "(ㆁᴗㆁ✿)", + "(๑’◡͐’๑)", + "(⌒⃝৺⌒⃝)", + "{´◕ ◡ ◕`}", + "(ට ̥̆ ට)", + "⁽͑˙˚̀ᵕ˚́˙⁾̉", + "(*☌ᴗ☌)。*゚", + "( ´◡‿ゝ◡`)", + "( ◠ ◡ ◠ )", + "ల(*´= ◡ =`*)", + "( ́⋅⃘ˬ̇⋅⃘ ̀ˋ)", + "( ᵘ ᵕ ᵘ ⁎)", + "(๑`・ᴗ・´๑)", + "❀.(*´◡`*)❀.", + "◟(๑•͈ᴗ•͈)◞", + "₍ఠ ͜ఠ₎", + "(•‾̑⌣‾̑•)", + "(⋈・◡・)✰", + "(⁝̥ꑦᴗꑦ)", + "(︶.̮︶✽)", + "(❍❛‿❛❍❋)", + "₍•͈ᴗ•͈₎", + "(ͼ ̥̆ ͽ)", + "(≖ᴗ≖๑)", + "( °̥̥̥̥̥̥̥̥◡͐°̥̥̥̥̥̥̥̥)", + "( ´͈ ◡ `͈ )", + "( ๑॔•◡ુ•๑॓)", + "(๑・`◡´・๑)", + ",、’`(((;ŏᴗŏ))),、’`’`,、", + "৵( °͜ °৵)", + "(✿◕ ‿◕)ノ))。₀: *゜", + "☆(❁‿❁)☆", + "◃┆◉◡◉┆▷", + "q(❂‿❂)p", + "☆(◒‿◒)☆", + "⊂◉‿◉つ", + "(。✿‿✿。)", + "໒( ﹒ ͜ر ﹒ )७", + "( ‾̮‿͂‾̮ ꐦ)", + "(˘・ᴗ・˘)", + "(ό‿ὸ)ノ", + "ヾ|๑ ╹ ◡ ╹ ๑|ノ", + "(((;◔ᴗ◔;)))", + "໒( ” ¤ ‿ ¤ ” )७", + "✩*॰ ( ¨̮ ) ॰*✩", + "(✧≖‿ゝ≖)", + "( ◠‿◠ )", + "(*´◡`​*)", + "(๑◔‿◔๑)", + "(◕‿‿◕。)", + "(✿╹◡╹)", + "(◞‿◟)", + "(o˘◡˘o)", + "( ˆᴗˆ )", + "₊·(ϱ॔⌄ᵕ๑॓)‧*", + "-(๑☆‿ ☆#)ᕗ", + "╭ (oㅇ‿ o#)ᕗ", + "/人◕ ‿‿ ◕人\", + "(o◞ิ‿◟ิo)", + "(•_ ͜_•)", + "(´>‸⚲͜<)", + "(๑❝᷀ົཽ ⁐̵ ❝᷀ົཽ)✧", + "(• ̥̆ •)", + "(o^^)o", + "ヾ(^ ^ゞ", + "o(^^o)", + "(o^^o)♪", + "(o⌒.⌒o)", + "(=^・^=)", + "。(⌒.⌒。)", + "( ノ^.^)ノ゚", + "(“⌒.⌒”)", + "(≧.≦*)", + "(*^^*)", + "( ´͈ ᗨ `͈ )", + "(・ัᗜ・ั)و", + "(➲ ᗜ ➲)", + "(˵¯̴͒ꇴ¯̴͒˵)", + "(ᗒᗨᗕ)", + "(๑’ᗢ’๑)ฅ", + "┌༼ ˵ ° ᗜ ° ˵ ༽┐", + "ˉ̶̡̭̭ ( ´͈ ᗨ `͈ ) ˉ̶̡̭̭", + "(□ᗜ□)", + "(:D)┼─┤", + "ヽ〳 ՞ ᗜ ՞ 〵ง", + "(-^〇^-)", + "(.=^・ェ・^=)", + "(・◇・)", + "(*^ワ^*)", + "(*¬*)", + "(´ヮ`)", + "(^(I)^)", + "(^(エ)^)", + "(^⊆^)", + "(๑^っ^๑)", + "(>y<)", + "(⊙ヮ⊙)", + "(☆^O^☆)", + "°˖ ✧◝(○ ヮ ○)◜✧˖ °", + "⊂(^(工)^)⊃", + "ヾ(*⌒ヮ⌒*)ゞ", + "(ⓥꇳⓥ*)", + "(๑❛ꆚ❛๑)", + "(^ワ^=)", + "(*´ч ` *)", + "(。◑ヮ◑。)", + "(ꉺ౪ꉺ)", + "( ◑ٹ◐)", + "(´ёٹё)", + "(*^ิ益^ิ*)", + "(´◉◞౪◟◉)", + "(*^。^*)", + "(๑*౪*๑)", + "(^凹^)", + ",、’`<(❛ヮ❛✿)>,、’`’`,、", + "ೖ(σ̑˽σ̑)ೖ", + "(●⌃ٹ⌃)", + "(*꒩̐﹀꒩̐*)", + "(^◇^;)", + "(✿ ◜◒◝ )", + "(´◉◞౪◟◉`)", + "(థฺˇ౪ˇథ)", + "( •˓◞•̀ )", + "(*ꄱͦ︺ꄱͦ*)", + "( ՞ٹ՞)", + "( ´•౪•`)", + "(*´∪`)", + "(◍ȋ ₎໐͜₍ ȋ◍)", + "♪~♪ d(⌒o⌒)b♪~♪", + "♪♪v(⌒o⌒)v♪♪", + "∩`・◇・)", + "థ౪థ", + "₍‧ꀈ˙⁾՜", + "( θོثθོ )", + "ʿʿ˅⁽ˆ⁰ˆ˺ ⁾˺", + "♪~♪ d(⌒o⌒)b♪~♪", + "♪♪v(⌒o⌒)v♪♪", + "(◍ȋ ₎໐͜₍ ȋ◍)", + "(*´∪`)", + "( ´•౪•`)", + "( ՞ٹ՞)", + "∩`・◇・)", + "థ౪థ", + "₍‧ꀈ˙⁾՜", + "( θོثθོ )", + "ʿʿ˅⁽ˆ⁰ˆ˺ ⁾˺", + "(★^O^★)", + "(((o(*゚▽゚*)o)))", + "\(@ ̄∇ ̄@)/", + "ヽ(;▽;)ノ", + "ヾ(@^▽^@)ノ", + "o((*^▽^*))o", + "O(≧▽≦)O", + "– =͟͟͞͞ ( ꒪౪꒪)ฅ✧", + "“ヽ(´▽`)ノ”", + "(((\(@v@)/)))", + "(ノ´ヮ´)ノ*:・゚✧", + "(ノ^_^)ノ", + "(ノ>▽<。)ノ", + "(ノ゚▽゚)ノ", + "〈( ^.^)ノ", + "\(*T▽T*)/", + "\(^▽^)/", + "\(^ω^\)", + "\(T∇T)/", + "☆*:.。. o(≧▽≦)o .。.:*☆", + "ヽ(;^o^ヽ)", + "ヽ(;▽;)ノ", + "ヽ(‘ ∇‘ )ノ", + "ヾ(@† ▽ †@)ノ", + "ヾ(@^∇^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@゜∇゜@)ノ", + "ヾ(@゜▽゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヾ(@⌒ー⌒@)ノ", + "ヽ(*≧ω≦)ノ", + "ヽ(*・ω・)ノ", + "ヽ(*⌒∇⌒*)ノ", + "ヾ(^-^)ノ", + "ヽ(^。^)丿", + "ヽ(^Д^)ノ", + "ヽ(=^・ω・^=)丿", + "٩(^ᴗ^)۶", + "о(ж>▽<)y ☆", + "ヘ(^_^ヘ)", + "ヘ(^o^ヘ)", + "へ(゜∇、°)へ", + "(/・ω・)/", + "୧(﹒︠ᴗ﹒︡)୨", + "( ՞ਊ ՞)", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "˛˛ƪ(⌾⃝ ౪ ⌾⃝ ๑)و ̉ ̉", + "ヾ(๑╹ヮ╹๑)ノ”", + "ヾ(๑╹ꇴ◠๑)ノ”", + "ヾ(๑ㆁᗜㆁ๑)ノ”", + "ヾ(Ő∀Ő๑)ノ", + "(੭ु。╹▿╹。)੭ु⁾⁾", + "₍₍ (ง Ŏ౪Ŏ)ว ⁾⁾", + "(ง •ૅ౪•᷄)ว", + "₍₍⁽⁽(ી(^‿ゝ^)ʃ)₎₎⁾⁾", + "(ノ^_^)ノ", + "⌒°(ᴖ◡ᴖ)°⌒", + "⌒(o^▽^o)ノ゚", + "。:.゚ヽ(´∀`。)ノ゚.:。+゚", + "゚+。:.゚ヽ(*´∀`)ノ゚.:。+゚", + "ヾ(○・ω・)ノ☆", + "୧( “̮ )୨✧", + "(๑˃̶͈̀◡˂̶͈́๑)", + "✩◝(◍⌣̎◍)◜✩", + "∕∕∕ ∕ ∕∕˛₍˴◅ˋ)੭✧∕∕∕ ∕∕", + "(◜▿‾ ≡‾▿◝)", + "୧[ ˵ ͡ᵔ ͜ʟ ͡ᵔ ˵ ]୨", + "ヾ( ~▽~)ツ", + "(ノ*´▽)ノ", + "ヽ(^◇^*)/", + "ヾ( ❀◕◡◕ฺฺ )ノ", + "ヽ(◕◡◕❀ฺ )ノ", + "ヾ(^▽^ヾ)", + "୧〳 ^ ౪ ^ 〵୨", + "=͟͟͞͞٩(๑☉ᴗ☉)੭ु⁾⁾", + "ლ(⌒▽⌒ლ)", + "(ღ˘⌣˘ღ)", + "(ღ˘⌣˘ღ) ♫・*:.。. .。.:*・", + "(ॢ˘⌣˘ ॢ⑅)", + "꒰ღ˘‿˘ற꒱⃛", + "ლ(́◉◞౪◟◉‵ლ)", + "ლ(๏‿๏ ◝ლ)", + "῍̻̩✧(´͈ ૢᐜ `͈ૢ)˖῍̻̩", + "( ᵕ́ૢ‧̮ᵕ̀ૢ)‧̊·*", + "(•́ ॣ·̫ ॣ•̀,)՞", + "(*๓´╰╯`๓)", + "(ू• ౪•ू )", + "ლ(╹◡╹ლ)", + "ლ(o◡oლ)", + "(ღ′◡‵)", + "(*ฅ́˘ฅ̀*)", + "*(Ü*ૢ)*", + "ღවꇳවღ", + "ಞ(ల˙◡˙ల)ಞ", + "( ღ’ᴗ’ღ )", + "(ლ◖◡◗ ლ)", + "ლↂ‿‿ↂლ", + "ლ(- ◡ -ლ)", + "ლ(❛◡❛✿)ლ", + "ლ(・ิω・ิლ)", + "ლ(^ω^ლ)", + "ლ(・∀・ )ლ", + "ლ(´∀`ლ)", + "(∩❛ڡ❛∩)", + "(っ˘ڡ˘ς)", + "(⁎⁍̴ڡ⁍̴⁎)", + "(≧ڡ≦*)", + "(*^ڡ^*)", + "(∩ڡ∩)", + "(〜^ڡ^)〜", + "o((*^ڡ^*))o", + "(・ڡ・)", + "( ^ڡ^)", + "(*⌒ڡ⌒*)", + "∩(︶ڡ︶)∩", + "〜(^∇^〜)", + "〜( ̄▽ ̄〜)", + "。(⌒∇⌒。)", + "(〜^∇^)〜", + "(〜 ̄▽ ̄)〜", + "(。⌒∇⌒)。", + "((┌|o^▽^o|┘))♪", + "(~‾⌣‾)~", + "(~ ̄▽ ̄)~", + "(~˘▾˘)~", + "~(⁰▿⁰)~", + "~(‾⌣‾~)", + "~(˘▾˘)~", + "~(˘▾˘~)", + "┌(˘⌣˘)ʃ", + "ƪ(˘⌣˘)ʃ", + "ƪ(˘⌣˘)┐", + "♪((└|o^▽^o|┐))", + "。^‿^。", + "。◕‿◕。", + "´・ᴗ・`", + "^ ͜• ^", + "~ヾ ^∇^", + "≖‿≖", + "⊙▽⊙", + "⊙ω⊙", + "▽・ω・▽", + "◕ ‿ ◕", + "ʘ‿ʘ", + "ಥ‿ಥ", + "ȏ.̮ȏ", + "✾꒡ .̮ ꒡✾", + "∩˙▿˙∩", + "´͈ ᵕ `͈", + "´͈ ᵕ `͈ ♡°◌̊", + "ヽミ ´∀`ミノ", + "◉‿◉", + "˙ ͜ʟ˙", + "ෆ╹ .̮ ╹ෆ", + "أ‿أ", + "ರ ౪ ರ", + "˙ᘧ ͜ ˙", + "❝᷀ົ৺❝᷀ົ", + "ɷ◡ɷ", + "⋆•̵̑◡͐•̵̑⋆", + "⁙ὸ‿ό⁙", + "ᴑ͝ᴗᴑ͝", + "〤◕‿◕〤", + "⋆ᘟ◡ुᘟ⋆", + "⚆ꆚ⚆", + "◙‿◙", + "Ü", + "❀◕ ‿ ◕❀", + "<【】‿【】>", + "◉ ˙̫̮ ◉", + "⁞ ᵕ ‿ ᵕ ⁞", + "米^-^米", + "റ്ധ ੭ റ്ധ", + "(◕‿◕✿)", + "(≖(‿)≖)", + "(´^ิ益^ิ` )", + "˚ஐ₊✧(ؔ❝ ⍢ ؔ❝ೢ⁎)⁺˳ஐ༚", + "(ؔ♝ཻ༨ཻ)✩⃛", + "(•ؔʶ̷ ˡ̲̮ ؔʶ̷)✧", + "ॱ॰⋆(˶ॢ‾᷄﹃‾᷅˵ॢ)ӵᵘᵐᵐᵞ♡♡♡", + "( ´͈ ॢꇴ  `͈)੭ु⁾⁾·°˖ᔆᵘᵗᵉᵏⁱ✧˖°", + "Ⓗⓐⓟⓟⓨヾ(◍’౪`◍)ノ゙", + "(^▽^)/ ʸᵉᔆᵎ", + "(•ᵕᴗᵕ•)⁾⁾ᵖᵉᵏᵒ", + "⦅❛◡❛ॣॣ⦆*.・。╟╢ᎯƤƤᎽ*.・。", + "ପ(๑•̀ुᴗ•̀ु)* ॣ৳৸ᵃᵑᵏ Ꮍ৹੫ᵎ *ॣ", + "▒▒▓█▇▅▂∩( ✧Д✧)∩▂▅▇█▓▒▒", + "☆⌒Y⌒Y⌒Y⌒Y⌒ヾ(●´U`●)ノ", + "☆*・゜゚・*(^O^)/*・゜゚・*☆", + "☆*✲゚*。(((´♡‿♡`+)))。*゚✲*☆", + "“:♡.•♬✧⁽⁽ଘ( ˊᵕˋ )ଓ⁾⁾*+:•*∴", + "☆゚・*:。.:(゚∀゚)゚・*:..:☆", + "( ❀⃙⃕⃠⃝⃘⃚౪❀⃙⃕⃠⃝⃘⃚ )", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(。❛ᴗ❛。)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "v(۝)v", + "( ´◔ ۝ゝ◔`)", + "(◉۝◉)", + "╭〳 . ˘ ۝ ˘ . 〵╮", + "ू꒰΄ ิ̤۝ ิ ̤꒱ु", + "༼∗ღ۝ღ∗༽", + "໒( ˵ ° ۝ ° ˵ )७", + "(✧۝✧)/", + "| ᴼ ۝ ᴼ |", + "༼ ˘ ۝ ˘ ༽", + "╰།  ̄ ۝  ̄ །╯", + "໒( ́ ۝ ́ )७", + "╭། ” • ۝ • ” །╮", + "┌[ ʘ̆ ۝ ʘ̆ ]┐", + "╏ *  ̄ ۝  ̄ * ╏", + "(⸌۝⸍)", + "╰(⊹◕۝◕ )╯", + "⊱(*⁍ ڡ ⁍*)⊰", + "(๑′ڡ‵๑)۶४४yϋᵐᵐӵ♡॰⋆̥", + "٩(*ゝڡ◕๑)۶♥", + "ꉨڡꉨ", + "(*´ڡ`●)", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ", + "╰། ❛ ڡ ❛ །╯", + "ヽ(๑╹ڡ╹๑)ノ", + "(ノ≧ڡ≦)", + "(ˆ ڡ ˆ)", + "ʕっ˘ڡ˘ςʔ", + "(๑╹ڡ╹๑)", + "ᕙ། – ڡ – །ᕗ", + "(∩❛ڡ❛∩)", + "(っ˘ڡ˘ς)", + "ლ(´ڡ`ლ)", + "(⁎⁍̴ڡ⁍̴⁎)", + "(රڡර人)", + "(ॢ◕ัڡ ◕ั ॢ)", + "(≧ڡ≦*)", + "ԅ[ ˵ ڡ ˵ ]凸", + "୧〳 ” • ڡ • ” 〵୨", + "ᕕ[ ˵ ڡ ˵ ]┐", + "(๑╹ڡ╹)", + "໒( = ▀ ڡ ▀ = )७", + "| ⊘ ڡ ⊘ |", + "ʕ ▀ ڡ ▀ ʔ", + "ʕ ି ڡ ି ʔ", + "╭〳 ° ڡ ° 〵╮", + "ᕙ▐ ” ° ڡ ° ” ▐ᕗ", + "ʕ ڡ ʔ", + " ᕦ〳 ⊙ ڡ ⊙ 〵ᕤ", + " ԅ| . ͡° ڡ ͡° . |ᕤ", + "ᕕ[ ᓀ ڡ ᓂ ]ㄏ", + " 〳 : ⊘ ڡ ⊘ : 〵", + "(๑ゝڡ◕๑)", + "(๑´ڡ`๑三๑´ڡ`๑)", + "໒( ᓀ ڡ ᓂ )७", + "[ ☉ ڡ ☉ ]", + "( ๑ ❛ ڡ ❛ ๑ )", + " (๑´ڤ`๑)", + " ( ՞ ڡ ՞ )", + "ԅ|.͡° ڡ ͡°.|ᕤ", + "ʅ ﴾סּ ؂ סּ ʅ ﴿", + "ತ ൧͑ ತ", + "(๑ ˭̴̵̶᷄൧̑ ˭̴̵̶᷅๑)", + "(ර൧ර☆)", + "(ತ ൧ ತ)", + "໒( ᓀ ൧ ᓂ )७", + "[ ☉ ൧ ☉ ]", + "ԅ|.͡° ൧ ͡°.|ᕤ", + "ʕっ˘൧˘ςʔ", + "╰། ❛ ൧ ❛ །╯", + "(っ˘൧˘ς)", + "(๑╹൧╹๑)", + "ʕ ∗ •́ ൧ •̀ ∗ ʔ", + "_:(´ཀ`」 ∠):_", + " (´ q ` ” )", + "v(❆ڼ❆)v", + "(  ิ౪ ิ )っ─∈", + "ᕕ[ ᓀ ڡ ᓂ ]ㄏ─∈", + " ( ՞ ڡ ՞ )─∈", + "໒( ́ ۝ ́ )७─∈", + "(っ˘ڡ˘)っ─∈", + "╭〳 ° ڡ ° 〵─∈", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ─∈", + "ᕙ། – ڡ – །─∈", + "╰། ❛ ڡ ❛ །─∈", + "ʕっ˘ڡ˘ʔっ─∈", + "ψ(・ω´・,,ψ", + "ヘ(。□°)ヘ", + "(。_+)\", + "((((*。_。)_", + "(xLx)ヾ", + "「(=>o≦=)ノ", + "/(*ι*)ヾ", + "/(x~x)\", + "~(>_<~)", + "┗( ●-﹏ `。)づ", + "☆ ̄(>。☆)", + "☆⌒(>。≪)", + "(‘﹏*๑)", + ".( ̵˃﹏˂̵ )", + "ლ(。-﹏-。 ლ)", + "(˃̶᷄︿๏)", + "(っ- ‸ – ς)", + "(ᗒᗩᗕ)՞", + "● ﹏☉", + "໒(⁄›˅̭‹∖)७", + "⁎×﹏×⁎՞༘", + "☆( -o-)~~", + "(x_x☆", + "◟̽◞̽ ༘*", + "(≥_<)", + "(⇀⼼_↼)*✲゚*", + "(*>_<*)", + "(*о*)≡☆", + "╰[Ĺ̯ಠ]╯", + "―(T_T)→", + "✧*。ヾ(。>﹏<。)ノ゙✧*。", + "(。_°☆\(- – )", + "(☆_@;)☆ \(`-´メ)", + "(._+ )☆\(-.-メ)", + "!!( *д*):・’.::・(ーー; )", + "(ノ>ノ)", + "◎☆(♯××)┘", + "(o_ _)o", + "(o_□_)o", + "(ヘ_ _)ヘ", + "* ・・(o_ _)o", + "ヽ(_ _ヽ)", + "ヽ(_ _ヽ)彡", + "(ノ_ _)ノ", + "εミ(ο_ _)ο", + "ο(_ _ο)彡3", + "ミ(ノ_ _)ノ", + "εミ(ο_ _)ο", + "ο(_ _ο)彡3", + "ミ(ノ_ _)ノ", + "ヘ(_ _ヘ)", + "ヘ(。。ヘ)☆", + "┏|*_ _|┓", + "( っ_ _)っ))", + "⊂⌒~⊃。Д。)⊃", + "((( ⊂⌒~⊃。Д。)⊃", + "(o_ _)ノ彡☆", + "☆ヽ(o_ _)o", + "⊂´⌒∠;゚Д゚)ゝつ", + "(。´>д<)っ彡☆", + "(o_ _)o))", + "!☆〓(ノ_ _)ノ", + "┌(。Д。)┐", + "(o_ _)ノ彡☆", + "☆^(o≧∀≦)o", + "=D—(o_ _)o", + "ミ(ノ_ _)ノ=3", + "☆ミ(+ωゞ)☆彡", + "ミ☆(*._.)", + "ヘ(>_<ヘ)", + "(;; ̄Д ̄)ノヾ((((;゜д゜))__", + "[ ± _ ± ]", + "(๑-﹏-๑)", + "(˘̭⺫˘̭ ;)", + "(-﹏-。)", + "(☍﹏⁰)。", + "( ⁺⌓⁺;)՞", + "ෆ(˃͈᷇◟̵◞̵˂͈᷆ ფ", + "◝(๑⁺᷄д⁺᷅๑)◞՞", + "ಸ , ໖", + "ಸ_ಸ", + "(°﹏。υ)", + "༼ ಥ﹏لಥ ༽ ᵘgᵍʰ", + "⊂((° x。))⊃", + "。.*:・’゚:。'(((+_+)))。.*:゚・’゚゚:。’・゚", + "(゚×゚lll)", + "( •́ •̀)", + "(´ж`;)", + "(●’x`*)⌒%", + "(ノ’x`。ヽ)", + "‧∘˳°∗˚(⁎›ˍູ‹) ∗.∘˚˳°", + "(;・ж;・;)", + "( ╹╹)", + "(*;゚;艸;゚;)", + "(;゚;┏艸┓;゚;)", + "_| ̄|○、;’.・", + ";`;:゙;`(;゚;ж;゚; )", + "˓˓( ₎˔̈₍ )˒˒", + "(。・艸・)", + "(*U艸U*)", + "((゜乂゜))", + "⋆* ⁑⋆* (๑•﹏•)⋆* ⁑⋆*", + "(#´Ⅹ`#)", + "┗┐(;;*;:´;艸;`:;*;;)┌┛", + "ε≡ ε≡ ε≡ ε= (#・ж・)", + "。゜+.(:.;゜;艸;゜;.:)゜+.゜", + "ε-(≖д≖﹆)", + "ε-(>.<;;", + "ε=o(´ロ`||)", + "((( +д+)o=3=3", + "ε-(>o<)", + "(;≧∇≦) =3", + "(●`□´)=з", + "人人人ヾ( ;×o×)〃 人人人", + "︵‿︵‿︵‿︵‿︵‿︵‿︵‿︵‿︵‿ヽ(゜□゜ )ノ︵‿︵‿︵‿︵‿︵‿", + "⁽⁽ƈ ͡ (ु ˲̥̥̥́ ˱̥̥̥̀) ु⁾⁾", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "ₒ˛˚̣ (˃ᾓ˂⁎)₎₎", + "₍₍ (˚͈ⅈ∘͈⁎৲ु₎₎՞", + "(ˊ⌄˴⁎৲ु", + "(●♡∀♡)", + "(。♥‿♥。)", + "(♥ω♥ ) ~♪", + "(♥ω♥*)", + "(✿ ♥‿♥)", + "✿♥‿♥✿", + "乂♥‿♥乂", + "٩(♡ε♡ )۶", + "ლζ*♡ε♡*ζლ", + "⊂(♡⌂♡)⊃", + "(๑♡3♡๑)", + "(๑♡⌓♡๑)", + "♱♡‿♡♰", + "⊆♥_㇁♥⊇", + "(●♡∀♡))ヾ☆*。", + "໒( ♥ ◡ ♥ )७", + "༼♥ل͜♥༽", + "(灬♥ω♥灬)", + "(‘∀’●)♡", + "(´∀`)♡", + "(*´▽`*)", + "(´・` )♡", + "(´ω`♡%)", + "♥(ˆ⌣ˆԅ)", + "ლ(́◉◞౪◟◉‵ლ)", + "₍՞◌′ᵕ‵ू◌₎♡", + "♡ฅ(ᐤˊฅˋᐤ♪)", + "ʚ♡⃛ɞ(ू•ᴗ•ू❁)", + "♡(ŐωŐ人)", + "⃛ヾ(๑❛ ▿ ◠๑ )", + "(*’∀’人)♥", + "(°◡°♡).:。", + "ʸ(➜◡ु⚈)♡⃛", + "ˉ̞̭(′͈∨‵͈♡)˄̻ ̊", + "φ(゚ ω゚//)♡", + "ʸ(ᴖ́◡ु⚈)♡⃛", + "(′̤ॢ∀ ू‵̤๑))ˉ̞̭♡", + "♡♡+.゚(→ε←*)゚+.゚", + "(●´□`)♡", + "(。・ω・。)ノ♡", + "(。’▽’。)♡", + "(●´∀`)ノ♡", + "₍₍ ( ๑॔˃̶◡ ˂̶๑॓)◞♡", + "(๑・ω-)~♥”", + "(๑°꒵°๑)・*♡", + "~(^з^)-♡", + "(ෆ ͒•∘̬• ͒)◞", + "♡(㋭ ਊ ㋲)♡", + "(●’ᴗ’σ)σணღ*", + "(•‾⌣‾•)و ̑̑♡", + "( ෆຶдෆຶ)", + "(⁎⁍̴̛͂▿⁍̴̛͂⁎)*✲゚*。⋆", + "(*´o`*)ʖˋʖˋʖˋ~♡", + "ღゝ◡╹)ノ♡", + "♡✧( •⌄• )", + "(●මᴗමσ)σணღ*", + "(๑╹ڡ╹)╭ ~ ♡", + "(๑ Ỡ ◡͐ Ỡ๑)ノ♡", + "(♡ ὅ ◡ ὅ )ʃ♡", + "(⁎⁍̴̀﹃ ⁍̴́⁎)♡", + "(⋈◍>◡<◍)。✧♡", + "ε=(。♡ˇд ˇ♡。)", + "(◍•ᴗ•◍)", + "(∩˃o˂∩)♡", + "♡(.◜ω◝.)♡", + "♡〜٩(^▿^)۶〜♡", + "♡´・ᴗ・`♡", + "♡^▽^♡", + "♥╣[-_-]╠♥", + "♡ლ(-༗‿༗-)ლ♡", + "(。・‧̫・。).**♡", + "(◍•ڡ•◍)", + "-ω(´•ω•`)♡", + "(ෆˊ͈ ु꒳ ूˋ͈ෆ)", + "(♡´౪`♡)", + "ෆ╹ .̮ ╹ෆ", + "( ◜◒◝ )♡", + "♡〜ლ(๑癶ᴗ癶๑)ლ〜♡", + "(♡´❍`♡)*✧ ✰ 。*", + "(´∩。• ᵕ •。∩`) ♡", + "( ˊᵕˋ )♡.°⑅", + "(♡ >ω< ♡)", + "( ๑ ❛ ڡ ❛ ๑ )", + "(♥→o←♥)", + "(◍•ᴗ•◍)♡ ✧*。", + "(〃・ω・〃)", + "(*°∀°)=3", + "♥(ノ´∀`)", + "(♡´艸`)", + "(´,,•ω•,,)♡", + "♥╰(⸝⸝⸝´꒳`⸝⸝⸝)╯", + "(⸝⸝⍢⸝⸝) ෆ", + "(๑´ლ`๑)フフ♡", + "(灬ºωº灬)♡", + "ヽ(o♡o)/", + "٩(๑ơలơ)۶♡", + "٩(*❛⊰❛)ʓਡ~", + "٩(ó。ò۶ ♡)))♬", + "(੭ु ›ω‹ )੭ु⁾⁾♡", + "٩(๑∂▿∂๑)۶♡", + "♡✧。 (⋈◍>◡<◍)。✧♡", + "♡٩(๑ö⊿ö๑)۶♡", + "٩(*ゝڡ◕๑)۶♥", + "♡〜٩( ╹▿╹ )۶〜♡", + "╰(✿´⌣`✿)╯♡", + "(´ ▽`).。o♡", + "( ´͈ ॢꇴ `͈ॢ)・*♡", + "(/∇\*)。o○♡", + "(´▽`ʃƪ)♡", + "(◞ꈍ∇ꈍ)◞⋆**✚⃞", + "(ღ˘⌣˘ღ)", + "(人´∀`*)", + "♡o。.(✿ฺ。 ✿ฺ)", + "♥~(‘▽^人)", + "꒰⑅ᵕ༚ᵕ꒱˖♡", + "♡˖꒰ᵕ༚ᵕ⑅꒱", + "(人 •͈ᴗ•͈)", + "(*´ ˘ `*).。oO ( ♡ )", + "´͈ ᵕ `͈ ♡°◌̊", + "(*˘︶˘*).。.:*♡", + "ღ˘◡˘ற♡.。oO", + "( ˘͈ ᵕ ˘͈♡)˚๐*˟ ♡", + "( ∩ˇωˇ∩)♡", + "˞♡ฅ(ᐤˊฅˋᐤ♪)", + "(o´`o)♡*✲゚*。", + "OwO", + "(人*´∀`)+゚:。*゚+", + "(人´ω`*)♡", + "(人´∀`)", + "(人*´∀`)", + "ლ(´◉❥◉`ლ)", + "( ˘ ³˘)♥", + "( ˘ ³˘)", + "(。ˇ ⊖ˇ)♡", + "(*^3^)/~♡", + "(。・//ε//・。)", + "(´ε` )♡", + "(ʃƪ ˘ ³˘)", + "(ʃƪ˘ﻬ˘)", + "(づ ̄ ³ ̄)づ", + "♡(˃͈ દ ˂͈ ༶ )", + "٩꒰ ˘ ³˘꒱۶~♡", + "ƪ(♥ﻬ♥)ʃ", + "ლ(|||⌒εー|||)ლ", + "♡ლζ(♛ε♛*ζლ♡", + "†=”Ⴛ̸ ♡(˃͈ દ ˂͈ ༶ )", + "(๑ơ ₃ ơ)♥", + "ฅ(♡ơ ₃ơ)ฅ", + "৲( ᵒ ૩ᵕ )৴♡*৹", + "( *¯ ³¯*)♡", + " (●❛3❛●)", + "˖◛⁺⑅♡", + "˅ɞ♡⃛ʚ˅", + "ฅ ̳͒•ˑ̫• ̳͒ฅ♡", + "ʕ•̫͡•ʔʕ•̫͡•ʔ", + "(•ө•)♡", + "(人・㉨・)♡", + "♡₍⸍⸌̣ʷ̣̫⸍̣⸌₎", + "ʕ͙•̫͑͡•ʔͦʕͮ•̫ͤ͡•ʔ͙", + "(≚ᄌ≚)ℒℴѵℯ", + "♡ඩ⌔ඩ♡", + "(ฅ’ω’ฅ)​♥", + "(⁎⁍̴̛͂▿⁍̴̛͂⁎)*✲゚*。⋆♡", + "(΄◞ิ౪◟ิ‵)ʃ♥", + "(ෆ❛ัᵌ❛ัෆ)°", + "( ^◡^)っ", + "(∿°○°)∿ ︵ ǝʌol", + "♡╰(*゚x゚​*)╯♡", + "( ゚∀゚)ノ【LOVE】", + "( ゚∀゚)ノ     ~【LOVE】", + "Σ(;゚∀゚)ノ            三【LOVE:;*.’:|", + "(⑅ ॣ•͈ᴗ•͈ ॣ)∟ᵒᵛᵉ૫૦∪", + "(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ♥", + "Lᵒᵛᵉᵧₒᵤ", + "♡+* Ɗɑɫë*+♡", + "ॱ॰⋆(˶‾᷄﹃‾᷅˵)ӵᵘᵐᵐᵞ♡♡♡", + "♡+:。.。LロVЁ。.。:+♡", + "(୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ*♡", + "(ෆ`´ෆ) ˡºᵛᵉ⃛", + "(๑′ڡ‵๑)۶४४yϋᵐᵐӵ♡॰⋆̥", + "ⓛⓞⓥⓔ♡", + "ɨ ʂ ʂ Ⓨσư (◡ε◡ฺ)", + "ʚ♡⃛ɞLᵒᵛᵉᵧₒᵤʚ♡⃛ɞ(ू•ᴗ•ू❁)", + "(ღˇ◡ˇ)♥ℒᵒᵛᵉᵧₒᵤ♥", + "ᎥᏝᵒᵛᵉϋෆ*", + "ℓ ϚϦοςӧԼձϮϵ⃛", + "(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ♡", + "L(*OεV*)E", + "ℒℴѵℯℒᎥѵℯ", + "(人-ω-)。o.゚。*・♡Good Night♡・*。゚o。(-ω-人)", + "Gооd Йight(´ε`*)ιον∈ Υου", + "✿*゚¨゚✎・ ✿.。.:* *.:。✿*゚¨゚✎・✿.。.:* ♡LOVE♡LOVE♡ ✿*゚¨゚✎・ ✿.。.:*", + "I £ονё Υου…..φ┃*・ω・*┃", + "Ƭ ɧ ձ ƞ Ƙ ʂ (◦˘ З(◦’ںˉ◦) Ȼ ɧ ư ♡", + "☆*✲゚*。(((´♡‿♡`+)))。*゚✲*☆", + "(๑•з•)))⋆*♡*⋆=͟͟͞͞=͟͟͞͞", + "♡*˖•. ·͙*̩̩͙˚̩̥̩̥*̩̩̥͙·̩̩̥͙*̩̩̥͙˚̩̥̩̥*̩̩͙‧͙ .•˖*♡", + "◌⃝●♡⋆♡⃝ ˻˳˯ₑ♡⃝⋆●♡⃝◌", + "(◦′ᆺ‵◦) ♬° ✧❥✧¸.•*¨*✧♡✧ ℒℴѵℯ ✧♡✧*¨*•.❥", + "♡⃛◟( ˊ̱˂˃ˋ̱ )◞⸜₍ ˍ́˱˲ˍ̀ ₎⸝◟( ˊ̱˂˃ˋ̱ )◞♡⃛", + "♡。゚.(*♡´◡` 人´◡` ♡*)゚♡ °・", + "( ≧Д≦)", + "((´д`))", + "(∩︵∩)", + "(▰˘︹˘▰)", + "(╭╮)", + "(‘A`)", + "(︶︹︺)", + "(@´_`@)", + "(´_`)", + "(⊙︿⊙✿)", + "(⌣_⌣”)", + "(▰︶︹︺▰)", + "~(。☉︵ ಠ@)>", + "⊙︿⊙", + "ヽ(●゚´Д`゚●)ノ゚", + "(Θ︹Θ)ს", + "~(。☉︵ ಠ@)>", + "(Θ︹Θ)ს", + "(.﹒︿﹒.)", + "(๑◕︵◕๑)", + "˓˓(ᑊᘩᑊ⁎)", + ":: ˓(ᑊᘩᑊ⁎) ::", + "(´°ω°`)", + "(。•́︿•̀。)", + "( .. )", + "(˃̶᷄ ﹏ ˂̶᷄)゚", + "๑˃͈˂͈๑ノ*゙̥", + "੨( ・᷄ ︵・᷅ )シ", + "⊛ठ̯⊛", + "(๑′°︿°๑)", + "(っ- ‸ – ς)", + "(o︵o)", + "ಠ╭╮ಠ", + "(⋅⃘˕̭⋅⃘)", + "ᵟຶᴖ ᵟຶ", + "ಗಾ ﹏ ಗಾ", + "(.﹒︠₋﹒︡.)", + "( ⁍᷄⌢̻⁍᷅ )", + "ōۃō", + "ै", + "( ´_ノ` )", + "(˵¯͒⌢͗¯͒˵)", + "ʕ ಡ ﹏ ಡ ʔ", + "(◕︿◕✿)", + "●︿●", + "ʕ ಡ ﹏ ಡ ʔ", + "໒( •́ ∧ •̀ )७", + "༶ඬ༝ඬ༶", + "ਉ_ਉ", + "▐ ﹒︣ Ĺ̯ ﹒︣ ▐", + "┏༼ ◉ ╭╮ ◉༽┓", + "へ[ •́ ‸ •̀ ]ʋ", + "( ˃̶͈ ̯ ̜ ˂̶͈ˊ ) ︠³", + "((●´∧`●))", + "(。-人-。)", + "(๑´╹‸╹`๑)", + "(⌯˃̶᷄ ﹏ ˂̶᷄⌯)", + "、ヽ`(~д~*)、ヽ`", + "(;*△*;)", + "( ; ; )", + "(っ˘̩╭╮˘̩)っ", + "(个_个)", + "(;へ:)", + "(*´;ェ;`*)", + "o(;△;)o", + "ͼ(ݓ_ݓ)ͽ", + "((o(;△;)o))", + "(´;Д;`)", + "(´;д;`)", + "(´;ω;`)", + "(iДi)", + "(٭°̧̧̧꒳°̧̧̧٭)", + "(๑′̥̥̥▵‵̥̥̥ ૂ๑)", + "( ˃̣̣̥ω˂̣̣̥ )", + "( ᵒ̴̶̷̥́ _ᵒ̴̶̷̣̥̀ )", + "( ´•̥ו̥` )", + "( ɵ̥̥ ˑ̫ ɵ̥̥)", + "(੭ ˃̣̣̥ ㅂ˂̣̣̥)੭ु", + "꒰๑•̥﹏•̥๑꒱", + "(ˊ̥̥̥̥̥ ³ ˋ̥̥̥̥̥)", + "(๑ १д१)", + "(⌯͒⁍̩̩᷄ ɪ ⁍̩̩᷄ฅ͒)", + "(˃̥̥ω˂̥̥̥)", + "(;﹏;)", + "⁝(˚͈͈͈͈̥̆₍₎˚͈͈͈͈̥̆⁎)⁝", + "(˃̥̥ω˂̥̥̥)", + "(;﹏;)", + "(˃̩̩̥ɷ˂̩̩̥)", + "(ᵕ̣̣̣̣̣̣﹏ᵕ̣̣̣̣̣̣)", + "( ͒˃̩̩⌂˂̩̩ ͒)", + "( ب_ب )", + "(﹡ᵗ ᵔ ᵗ ﹡)", + "( -̩̩̩͡˛ -̩̩̩͡ )", + "(´;ω;`)", + "( Ĭ ^ Ĭ )", + "(;•͈́༚•͈̀)", + "\(@;◇;@)/", + "(ू̯⋆̧ ͕⋆᷅ू̯ ) ༘˟", + "⁽⁽ƈ ͡ (ु ˲̥̥̥́ ˱̥̥̥̀) ु⁾⁾", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "ₒ˛˚̣ (˃ᾓ˂⁎)₎₎", + "(﹡﹏﹡)", + "(ˊ⌄˴⁎৲ु", + "ε≡ ε≡ ε≡ ε= (#・ж・)", + "。゜+.(:.;゜;艸;゜;.:)゜+.゜", + "ε-(≖д≖﹆)", + "ε-(>.<;;", + "ε=o(´ロ`||)", + "((( +д+)o=3=3", + "ε-(>o<)", + "(;≧∇≦) =3", + "(●`□´)=з", + "o( _ _ )o ショボーン", + "(゜ーÅ) ホロリ", + "(;´д` ) トホホ", + "\"(ノ_・、)\" グスングスン", + "ρ(。 。、 ) イイモンイイモン", + "フフッ (ノへ^) うそ泣き", + "(>へ<) ←涙を堪える", + "σ(TεT;)ナイチャウヨ・・・", + "(・_・、) グスン", + "ε~(;@_@) ガクン", + "ヘ(´o`)ヘ とほほ・・・・", + "ρ(・・、)イジイジ", + "(ノ_・。)クスン", + "(・・,) グスン", + "(ノ_σ)クスン", + "(ノ∇・、)クスン", + "(’_’、)ホロリ", + "(;へ:)ナカナイモン", + "(;_・) グスリ", + "(/_・)", + "(>_<)", + "(+_ q ))グスン", + "|ヽ(~~。) オチコミー", + "(хх) エーン", + "(Ω_Ω)クスン", + "へ(><#)ノ カナシイヨ", + "(;_;)クスン", + "(・_;)", + "(;_・)", + "(。>。<。)ウッー", + "(~^T) ジーン", + "(†〇†) ジーーン", + "(x_x;)シュン", + "(。;_;。) シュン", + "( ■ ;) そんな・・・", + "(++)", + "(;_q))クスン", + "(*_*) シュン", + "_|+_+|_ ガクン", + "〃´_`〃", + ";.;", + "(O.;)ガクン", + "(八、)~~~==3  ヒドイ・・・", + "ノヘ;)/\(;_;)/\(x_x)/ 悲しい衆だ~ん", + "(O.;) シュン・・・", + "[壁]ノ_・。) クスン", + "|ヽ(~゜。)シクシク", + "( ´△`) アァ-", + "ウゥ (-_\)(/_-)ウゥ", + "(ρ°∩°) ウウッ", + "0(>_<)0 ウー", + "o(´^`)o ウー", + "__(_ _;) ウゥ", + "(TεT) イイサ・・・", + "ρ(。。)イジイジ", + "ρ(-ε- ) イジイジ", + "。。。ρ(-ω- ) イジイジ", + "(°°)(。。)(。°)(°。) イジイジ", + "(。。 )(。。 )( 。。)( 。。)イジイジ", + "ガクーン ( ¨)( ‥)( ..)( __)", + "(~、~)(~、~)イジイジ", + "(~,~)イヂ(~,~)イヂ(~,~)イヂ", + "イシ゛イシ゛・・( ..)( __)イシ゛イシ゛・・", + "(((+ ;) イジイジッ", + "(・o+)", + "ゞ(+ヘ+)`` ナクモノカ・・", + ".....(;__)/| ずぅぅぅぅん", + "[壁]。。;) イジイジ", + "( >_;)/~ カナシイケド・・", + "(@´_`@)フエーン", + "(゜_、゜;)どよどよどよ~ん", + "(~~。) シクシク", + "(;´_ヘ;)ホロリ", + "ウウッ -_\)", + "/_-)ウウッ", + "(×_×;) シユン", + "(×_×#", + "(+o+)", + "(#+_+)", + "(+_+)", + "...((( *-*)", + "◑.◑", + "( ⚆ _ ⚆ )", + "━(◯Δ◯∥)━ン", + "( 〇□〇)", + "(((φ(◎ロ◎;)φ)))", + "ゞ◎Д◎ヾ", + "(`〇Д〇)", + "(ΟΔΟ;;)", + "(O∆O)", + "( (≪●≫) )Д( (≪●≫) )", + "ヽ(゚Д゚)ノ", + "(((╹д╹;)))", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "ヾ( •́д•̀ ;)ノ", + "ヽ ( ꒪д꒪ )ノ", + "ヾ( ๑´д`๑)ツ", + "џ(ºДºџ)", + "( ⁰д⁰)", + "-(゜Д゜;)-ン!", + "(゚Д゚;)", + "(゚д゚;)", + "∠(゚Д゚)/", + "σ(oдolll)", + "(゚Д゚?)", + "ヾ(´゚Д゚`;)ゝ", + "(#`゚д´)ノ", + "(╬☉д⊙)", + "゛(●ノ´・Д・`)ノ", + "╰། ᵒ̌ д ᵒ̌ །╯", + "ヽ(○´Д`)ノ", + "(゜Д゜*)", + "⊃゜Д゜)⊃", + "⊂(゜Д゜⊂", + "┗|*´゚Д゚`|┛", + "(シ;゚Д゚)シ", + "ヾ(゚Д゚;ヾ)", + "(ΩДΩ)", + "ヽ(#゚Д゚)ノ", + "!!(ノ*゚Д゚)ノ", + ",、’`( ꒪Д꒪),、’`’`,、", + "◝(๑⁺д⁺๑)◞՞", + "(-@Д@)", + "(「⊙Д⊙)「", + "<|๑⊙Д⊙|/", + "ლ|’Д’ლ|", + "(┛〃° Д°)┛", + "ヽ〔゚Д゚〕丿", + ")Д⊙`)", + "ฺ(☼Д☼)", + "工エエェェ(;╹⌓╹)ェェエエ工", + "エエェェェ(●’Д’●)ェェェエエ", + "エエェェェェ(/×\)ェェエエエエ", + "ε=ε=(っ*´□`)っ", + "ε=ε=(怒゚Д゚)ノ", + "=͟͟͞͞ =͟͟͞͞ ヘ( ´Д`)ノ", + "ヽ( ̄д ̄;)ノ=3=3=3", + "٩(´Д` ;)۶:.*", + "(´×д×`三꒪д꒪ ;)", + "– =͟͟͞͞ =͟͟͞͞ ヘ( ´Д`)ノ", + "ε=ε=ε=(((((ノ`・Д・)ノ", + "(◞º❒º)◞₎₎(◟º❑º)◟⁾⁾➟➠➨", + "ε=٩(●❛ö❛)۶", + "Σ(゚Д゚;≡;゚д゚)", + "(c=(c=(c=(c=(゚ロ゚;c=", + "⊂(゚Д゚;⊂⌒`つ", + "..・ヾ(。 ̄□ ̄)ツ", + "≡≡≡=(ノTдT)ノ", + "ε=ε=(⊃≧□≦)⊃", + "!!Σ(゚Д゚;≡≡≡≡≡ヾ(;゚д゚)/", + "┃ ु ⠁⃘ ⠁⃘ू┃⁼³₌₃", + "༻(〃ຶ⌂〃ຶ)", + "ਭ३౽=͟͟͞͞(((ഽʻ⁸ʻ)ഽ", + "ε=ε=ε=(ノ≧∀)ノ", + "(❛ӧ❛三❛ӧ❛)", + "Σ(°Д°;≡;°д°)", + "ε=ε=ε=(ノTдT)ノ", + "~ε~ε~┌(|||´Д`)ノ", + "゛(ノ~o~)ノ", + "ε=ε=ε=┏(゚ロ゚;)┛", + "ε==ε==(ノ゜д゜)ツ", + "ヽ(д`ヽ)。。", + "。。(ノ´д)ノ", + "ヽ(´Д`;≡;´Д`)丿", + "((ヽ(´Д`;ゞ=ヾ;´Д`)ノ))", + "ヽ(ω;`ヽ))…((ノ´;ω)ノ", + "ヽ(д`ヽ彡ノ´д)ノ", + "ε=ε=ε=(((怒゚Д゚)ノノ", + "ε=ε=ε=(*ノ´Д`)ノ゚", + "ヾ(*゜、ω゜*)ノ゚", + "!!((((((っ;゚∀゚)っ", + "(´□`;)=З=З=З=З=З=З", + "へ(~Д~*へ))))… …((((ノ*~З~)ノ", + "★⌒Y⌒Y⌒Y⌒Y⌒ ヾ(o゚Д゚)ノ", + "(˵¯͒ བ¯͒˵)", + "(●゜□゜)人(゜□゜○)", + "ヽ(≡ω≡;ヽ)", + "ヽ(;゚;∀;゚; )ノ", + "(ノ´ロ`)ノ", + "(ノ ゜口゜)ノ", + "!!!!!!(゚ロ゚屮)屮", + "§;゚ロ゚§", + "ヾ(´囗`。)ノ", + "(/;◇;)/", + "ヘ(;´o`)ヘ", + "(°□°)⊅", + "Σ(°□°)⊃", + "…(゚Ⅹ゚)…。", + "(@O@;)", + "〣( ºΔº )〣", + "˓⁽͑ʺˀ́˙̻ˁ̀ʺ⁾̉ʾʾ ᵏᵞᵅ˞ᵎ", + "t(ツ)_/¯", + "乁[ᓀ˵▾˵ᓂ]ㄏ", + "へ‿(ツ)‿ㄏ", + "\(;´□`)/", + "\(〇_o)/", + "\⍩⃝/", + "\|  ̄ヘ ̄|/", + "┐(‘~`;)┌", + "┐( ̄ー ̄)┌", + "┐( ̄ヮ ̄)┌", + "┐(´-`)┌", + "┐( ˘_˘)┌", + "┐( ∵ )┌", + "┐( ̄ヘ ̄)┌", + "┐(´∀`)┌", + "┐(´∇`)┌", + "┐(´д`)┌", + "┐(‘д’)┌", + "┐(゚~゚)┌", + "┐(~ー~;)┌", + "┐(;Ծ⌓Ծ;)┌", + "┐(・ิL_・ิ)┌", + "(┐◎_◎┌)", + "┐(´(エ)`)┌", + "┐(´・c_・` ;)┌", + "┐(●’v’)┌", + "┐(´ー)┌", + "┐(´Д`┌", + "┐(゚⊇゚)┌", + "┐(‘~`;)┌", + "┐| ̄ρ ̄✿|┌", + "┐(;´・Д・`)┌", + "┐(´ー`)┌", + "(「ఠωఠ)「", + "┐(‘~`;)┌", + "┐( ̄ー ̄)┌", + "┐( ̄ヮ ̄)┌", + "┐(´-`)┌", + "┐( ˘_˘)┌", + "┐( ∵ )┌", + "┐( ̄ヘ ̄)┌", + "┐(´∀`)┌", + "┐(´∇`)┌", + "┐(´д`)┌", + "┐(‘д’)┌", + "┐(゚~゚)┌", + "┐(~ー~;)┌", + "┐(;Ծ⌓Ծ;)┌", + "┐(・ิL_・ิ)┌", + "(┐◎_◎┌)", + "┐(´(エ)`)┌", + "┐(´・c_・` ;)┌", + "┐(●’v’)┌", + "┐(´ー)┌", + "┐(´Д`┌", + "┐(゚⊇゚)┌", + "┐(‘~`;)┌", + "┐| ̄ρ ̄✿|┌", + "┐(;´・Д・`)┌", + "┐(´ー`)┌", + "(「ఠωఠ)「", + "┗(・ω・;)┛", + "┗┃・ ■ ・┃┛", + "┗┐ヽ(′Д、`*)ノ┌┛", + "└(・-・)┘", + "└(・。・)┘", + "≡└( ‘o’)┘≡", + "╚(•⌂•)╝", + "(┛゚Θ゚)┛", + "┗(;´Д`)┛", + "╚༼ ຈل͜ຈ༽╝", + "┗|*´Д`|┛", + "└[ ◕ 〜 ◕ ]┘", + "╚═[ ˵ •̀ ﹏ •́ ˵ ]═╝", + "└(◉◞౪◟◉)┘", + "┗[~▿~]┛", + "┗[•͡˘◞౪◟•͡˘]┛", + "L(´▽`L )", + "└((´э`))┘", + "└( ͡° ︿ °͡ )┘", + "(」*´∇`)」", + "└། ๑ _ ๑ །┘", + "L(゚皿゚メ)」", + "└(゚∀゚└))", + "((┘゚∀゚)┘", + "┗|´Д`*|┛", + "┗┐(*´Д`*)┌┛", + "【┛゚,_ゝ゚】┛", + "L(゚益゚L)", + "└|゚益゚└|", + "┗(´ι_,`*;)┛", + "└(°ᴥ°)┘", + "└། : ᓀ ل͜ ᓂ : །┘", + "└╏ ʘ ▾ ʘ ╏┘", + "╚ |░▤﹏▤░|╝", + "└║ ՞ ౪ ՞ ║┘", + "└། – 〜 – །┘", + "└(՞▃՞ └)", + "└༼ •́ ͜ʖ •̀ ༽┘", + "└( * ᴼ ں ᴼ * )┘", + "└[ ☉ ل͟ ☉ ]┘", + "┗|´Д`*||*´Д`|┛", + "┗|`O´|┛", + "┗(・o・)┛", + "└(o゚∀゚o)┘", + "(」*´ェ`)」", + "┗(`皿´)┛", + "└(○`ε´○)┘", + "└( ՞ ~ ՞ )┘", + "┗| ຶӫ ຶ|┛", + "╮ (. ❛ ᴗ ❛.) ╭", + "╮(^▽^)╭", + "╮(─▽─)╭", + "╮(•˘︿ ˘•)╭", + "╮(╯▽╰)╭", + "╮(╯-╰”)╭", + "╮(ਊ◞‸◟ਊ|||)╭", + "╮( ꒪౪꒪)╭", + "╮(╯ل͜╰)╭", + "╮(゚ェ゚*)╭", + "╮(▰´△`)╭", + "╰( ´◔ ω ◔ `)╯", + "╰། ﹒ _ ﹒ །╯", + "╰╏ ◉ 〜 ◉ ╏╯", + "╰( ͡’◟◯ ͡’)╯", + "╰▐ ◑ ‸ ◑ ▐╯", + "╰| ⊡ _ ⊡ |╯", + "ヽ( ´¬`)ノ", + "ヽ(  ̄д ̄;)ノ", + "ヽ(・_・;)ノ", + "ヽ(。_°)ノ", + "ヽ(‘ー`)ノ", + "ヾ(*´ー`)ノ", + "ヽ(*ω。)ノ", + "ヾ(´¬`)ノ", + "ヽ(´ー`)ノ", + "ヾ(´A`)ノ゚", + "ヽ(ー_ー )ノ", + "ヾ(o・ω・)ノ", + "ヽ(。・c_,・。)ノ゙", + "ヽ(´ー`)ノ", + "乁( ◔ ౪◔)ㄏ", + "乁༼ ͒ ╭͜ʖ╮ ͒ ༽ㄏ", + "乁▐ ˘ o ˘ ▐ㄏ", + "ㄟ( θ﹏θ)厂", + "乁║ ͡° ౪ °͡ ║ㄏ", + "乁༼‿✿༽ㄏ", + "乁( •_• )ㄏ", + "乁▐ * ◖ ‸ ◗ * ▐ㄏ", + "乁⁞ ි _ʖ ි ⁞ㄏ", + "乁⁞ ◑ ͜ر ◑ ⁞ㄏ", + "乁༼ ◯ ༽ㄏ", + "乁[ ୖ ୖ ]ㄏ", + "乁( . ര ʖ̯ ര . )ㄏ", + "乁░ ‾́ ‾́ ░ㄏ", + "乁║ ˙ 益 ˙ ║ㄏ", + "乁[ ◕ ᴥ ◕ ]ㄏ", + "乁╏ ಠ ┏ل͜┓ ಠ ╏ㄏ", + "乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ", + "乁༼ Ɵ͆ ل͜ Ɵ͆ ༽ㄏ", + "乁| ・ ・ |ㄏ", + "ƪ(Ơ̴̴̴̴̴̴͡.̮Ơ̴̴͡)ʃ", + "ƪ(‾ε‾“)ʃ", + "ʅ(。◔‸◔。)ʃ", + "ʅ(。Ő౪Ő。)ʃ", + "ƪ(•̃͡ε•̃͡)∫ʃ", + "ヾ(❛ε❛“)ʃ", + "ƪ(“╰ _ ╯ )ʃ", + "ʅ(´՞ਊ ՞ )ʃ", + "ʅ(´⊙◞⊱◟⊙`)ʃ", + "ƪ(‾(••)‾”)ʃ", + "ʅ(‾◡◝)ʃ", + "ʅ(‾‸◝)ʃ", + "ƪ(~ε~“)ʃ", + "ʅ( ‾⊖◝)ʃ", + "ʅʕ•ᴥ•ʔʃ", + "ʅ(´◔౪◔)ʃ", + "三三三ʅ(;◔౪◔)ʃ", + "ʅ( ‾⊖◝)ʃ", + "ʅ(‾◡◝)ʃ", + "ʅ(◔౪◔ ) ʃ", + "ƪƪ(•̃͡ε•̃͡)(•̃͡ε•̃͡)∫ʃ", + "ʅฺ(・ω・。)ʃฺ", + "ʅ(⑅*´◡`)ʃ", + "ʅ(´-ω-`)ʃ", + "ʅ(*´◡`)ʃ", + "ƪ(΄◉◉‵;)))ʃ", + "ʅ( ◜‸‾)ʅ(‾‸◝)ʃ(‾‸◝ )ʃ", + "ɿ(。・ɜ・)ɾⓌⓗⓨ?", + "ɿ(。・ɜ・)ɾⓌⓗⓐⓣ?", + "(「๑•₃•)「 ʷʱʸ?", + "o͡͡͡͡͡͡╮꒰♡∇♡*꒱╭o͡͡͡͡͡͡", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(๑θωθ๑)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "ʅ(◔.̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨̨̨̨̨̨̨̨̨̨̨̨.̸̸̨̨◔)ʃ", + "(v^_^)v", + "╮ (☆-_ ⊙;)ゞ", + "ヽ(´ー`)┌", + "ヽ(´~`;)", + "J( ‘ー`)し", + "⎦◜◦¬◦◝⎣", + "ɿ (•᷄દ•᷅)", + "щ(´^`щ)", + "|´U`●)r”", + "(^~^)", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + " ̄(=^ー^=) ̄", + "( ᵌ ⍨ ᵌ )", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + "⋋| ◉ ͟ʖ ◉ |⋌", + "⋋|།’͡ᴼ╭͜ʖ╮͡ᴼ’།|⋌", + "(n˘v˘•)¬", + "₍₍ (ง Ŏ౪Ŏ)ว ⁾⁾", + "(ง ´͈౪`͈)ว", + "ᕕ╏ ͡ ▾ ͡ ╏┐", + "(ペ◇゚)」", + "ᕕ[ ́ ل͜ ́ ]੭", + "₍₍ (ง ˙ω˙)ว ⁾⁾", + "(*´_ゝ`)", + "(*´∀`*)", + "(*´ェ`*)", + "。(*^▽^*)ゞ", + "(‘-’*)", + "(*´∀`*)", + "(*^^*)", + "(*゚ー゚)ゞ", + "(ノ*゜▽゜*)", + "ฅ(*°ω°*ฅ)", + "(*゚∀゚*)", + "(*´ω`*)", + "(´ω`*)", + "(⁎❝᷀ົ ˙̫ ❝᷀ົ⁎)", + "ε=ε=ε=ε=ε” “(/*’-‘*)/", + "ヽ(*>∇<)ノ", + "(*´-`*)", + "( *’ω’* )", + "( *∵* )", + "*:゚*。⋆ฺ(*´◡`)", + "(#^.^#)", + "(#`ε´# )ゞ", + "(#⌒∇⌒#)ゞ", + "(#゚ロ゚#)", + "#’ω`#੭", + "(#^^#)ゞ", + "(๑•́ ω •̀๑)", + "(๑•́ ₃ •̀๑)", + "(๑ˊ▵ˋ̥๑)", + "(๑´ㅂ`๑)", + "(๑ゝω╹๑)", + "(´๑•_•๑)", + "(๑•́ω•̀๑)", + "(◞ ๑௰)", + "(๑´ω`๑)", + "(๑癶ω癶๑)", + "(´•ω•`๑)", + "(๑´•ω • `๑)", + "(_๑˘ㅂ˘๑)", + "(๑´⍢`๑)", + "(๑′°︿°๑)", + "(๑́•∀•๑̀)ฅ", + "(๑ּగ⌄ּగ๑)", + "(⁶ੌ௰⁶ੌ๑)", + "(๑-๑)", + "(๑⁍᷄౪⁍᷅๑)", + "(๑→‿←๑)", + "(๑•́‧̫•̀๑)", + "(๑・▱・๑)", + "(〃 ̄ω ̄〃)ゞ", + "(。・//ε//・。)", + "(//・_・//)", + "(〃・ω・〃)", + "(〃▽〃)", + "(///Σ///)", + "(//∇//)", + "(灬ºωº灬)", + "(´,,•ω•,,)", + "(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(灬º 艸º灬)", + "(✿ꈍ。 ꈍ✿)", + "(⁄ ⁄^⁄ᗨ⁄^⁄ ⁄)", + "(⸝⸝⸝ ≧ㅿ\⸝⸝⸝)/", + "⁽⁽ ◟(灬 ˊωˋ 灬)◞ ⁾⁾", + "╰(⸝⸝⸝´꒳`⸝⸝⸝)╯", + "(ؑ‷ᵕؑ̇‷)◞✧", + "{•̴͈ ˔̇ •̴͈}", + "ლ(///´◜⊜`//////ლ)", + "(⸝⸝⍢⸝⸝) ෆ", + "⁄(⁄ ⁄ˊૢ⁄ ⌑ ⁄ˋૢ⁄ ⁄)⁄", + "˚✧₊⁎˓˓⁽̨̡ ˚͈́꒳​˚͈̀*⁾̧̢˒˒⁎⁺˳✧༚", + "(⺣◡⺣)♡*", + "( ̧⸝⸝⍢⸝⸝)ི", + "꒰ •͈́ ̫ •͈̀ ꒱ˉ̞̭", + "(*ꈍ꒳ꈍ*)", + "(*ꈍ꒙ꈍ*)", + "ค{•̴͈ ˳̇ •̴͈}ค✧", + "⁄(⁄ ⁄•⁄-⁄•⁄ ⁄)⁄", + "(∗∕ ∕•̥̥̥̥∕ω∕•̥̥̥̥∕)", + "(⸝⸝•́દ•̀⸝⸝)", + "ꈍ .̮ ꈍ", + "・:*(〃・ェ・〃人)*:・", + "⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(ृ°͈꒳​°͈ ृ)ु", + "⁽͑ʺˊ˙̫ˋʺ⁾̉", + "(˵¯͒⌄¯͒˵)", + "⊂((〃’⊥’〃))⊃", + "(灬╹ω╹灬)", + "(〃ω〃)", + "(〃´Å`〃)", + "ヾ( 〃ω〃)ッ", + "(・ω・`〃)", + "ヾ(〃ω〃ヾ))", + "((ノ〃ω〃)ノ゙", + "ヽ(〃v〃)ノ", + "(〃´ノω`〃)", + "<(〃´∀`〃)>", + "・:*(〃∇〃人)*:・", + "(〃・ω・〃)ノ~☆", + "୧( ˵ ° ~ ° ˵ )୨", + "(˶′◡‵˶)", + "o(〃’▽’〃)o", + "(〃´∀`)", + "(∥ ̄■ ̄∥)", + "ヾ(〃゚ー゚〃)ノ", + "( 〃..)", + "(´,,•ω•,,`)", + "⁽˚̌ʷ˚̌ʺ⁾", + "ー(°◇°〃)", + "(●///▽///●)", + "б(//x//)", + "(灬ºωº灬)♡", + "ο(‘・’〃)ο″", + "(。-_-。)", + "(。・・。)", + "(o・・o)/", + "(●ฅ́дฅ̀●)", + "( 。•_• 。)", + "(●˙꒳˙●)", + "(●°u°●)​ 」", + "(。uωu。)", + "ღღ•̥̑ .̮ •̥̑)", + "(o´∪`o)", + "|´∀`●)", + "(@´_`@)", + "(。≖ˇ∀ˇ≖。)", + "(∗ᵕ̴᷄◡ᵕ̴᷅∗)՞", + "ల(*´= ◡ =`*)", + "(⊙﹏⊙✿)", + "⸜(ᶿ᷇ധᶿ᷆)⸝", + "( ͒•·̫|", + "(w´ω`w)", + "((≡ຶ◡≡ຶ))", + "( ´•௰•`)", + "(´°ω°`)", + "*⁂((✪⥎✪))⁂*", + "( ͒ ́ඉ .̫ ඉ ̀ ͒)", + "(◍´ಲ`◍)", + "(◍ ´꒳` ◍)b", + "(ˊˡ·̫ˡˋ)", + "(´ . .̫ . `)", + "˄̩̞(˒௰˓)", + "ԅ[ •́ ﹏ •̀ ]و", + "ԅ[ •́ ﹏├┬┴┬┴", + "(⌒_⌒;)", + "(;゙°´ω°´)", + "(^_^;)", + "(^^;)", + "(;^ω^)", + "(^◇^;)", + "(ヾ; ̄▽ ̄)ヾ", + "(*/∇\*)", + "(*/ω\*)", + "(*ノ▽ノ)", + "(*ノωノ)", + "(/。\)", + "(/(エ)\)", + "(/□\*)・゜", + "(/ω\)", + "(#/。\#)", + "(╯_╰)", + "(╯ಊ╰)", + "(つω⊂* )", + "(ノ)´∀`(ヾ)", + "(ʃᵕ̩̩ ᵕ̩̩⑅)", + "(♡´艸`)", + "(´つヮ⊂)", + "(Ŏ艸Ŏ)", + "(/▽ ̄)/", + "(/≧ω\)", + "(*/∇\*)", + "ʕ*ノᴥノʔ", + "( *´ノェ`)", + "(ノ∀`●)⊃", + "⊂((〃/⊥\〃))⊃", + "(/へ\*)", + "(ノ∇≦*)", + "(〃ノωノ)", + "(〃ノ∀`〃)", + "(ノ∀\*)", + "(*ノωヾ*)", + "(*ノзノ*)", + "♡(。→ˇ艸←)", + "(*ノ∀`*)ノ", + "(ノ∀ ̄〃)", + "(*/▽\*)", + "(*´ノ∀`)", + ".゚:;。+。ε(ノ∀≦*)з。+.。゚:", + "(´•͈ुω•͈ू`)", + "( ੭⌯᷄௰⌯᷅ ू’l|)", + "( • • )", + "(*,,ºัωºั,,)", + "‹(⁽˙́ʷ˙̀⁾ )∨( ⁽˙́ʷ˙̀⁾)›", + "(v〃∇〃)ハ(〃∇〃v)", + "(v〃ω〃)八(〃ω〃v)", + "(v〃∇〃)ハ(〃∇〃v)", + "(  ̄з(〃´▽`〃)ε ̄ )", + "◌⑅⃝*॰ॱᒄᵒᵏⁱ(꜆˘͈ෆ˘͈꜀)ᒄᵒᵏⁱ◌⑅⃝*॰ॱ", + "⁽͑ˀˉ˙̫ˉˁ⁾̉ ᵐᵘⁿⁱ", + "£ονё Υου…..φ(〃∇〃 ))", + "(⑅ᵒ̴̶̷᷄ωᵒ̴̶̷᷅⊞ོॢ)fෆr yෆu⋆*⋆✩", + "", + "( ;`ヘ´)", + "((( ̄へ ̄井)", + "(`へ´*)ノ", + "( ̄へ ̄)", + "(。-`へ´-。)", + "ε-(‘ヘ´○)┓", + "(≧ヘ≦ )", + "ρ( ̄ヘ ̄ メ)", + "(*`・へ・´*)", + "(((0へ0)", + "(*`へ´*) 彡3", + "(`へ′)", + "(’へ’)", + "(*´ω`)o", + "( ̄ω ̄)", + "( ̄ω ̄;)", + "(✿´ ꒳ ` )", + "✩꒳✩", + "(´꒳`∗)", + "(´꒳`)", + "(∗´꒳`)", + "(^~^)", + "( ̄~ ̄;)", + "( ̄~ ̄)", + "ー( ̄~ ̄)ξ", + "೭੧(❛〜❛✿)੭೨", + "(*´~`*)", + "੧| ‾́ 〜 ‾́ |੭", + "(*・~・*)", + "|  ̄~ ̄|o", + "(^~^;)", + "(⁰ ◕〜◕ ⁰)", + "(; ̄ェ ̄)", + "( ̄ェ ̄;)", + "(*´ェ`)o", + "o(´ェ`*)", + "(´ェ`*)", + "(*´ェ`*)", + "੧| ‾́ェ ‾́ |੭", + "( ̄ー ̄)", + "(*´ー`)", + "( `ー´)", + "<( ̄ー ̄)>", + "(; ̄ー ̄)", + "੧| ‾́ー ‾́ |੭", + "<( ̄︶ ̄)>", + "(。◝‿◜。)", + "§ԾᴗԾ§", + "੧| ‾́︶ ‾́ |੭", + "(; ̄︶ ̄)", + "( ̄︶ ̄;)", + "(*´︶`*)", + "[●´︶`●]", + "|  ̄︶ ̄|o", + "[●´Å`●]", + "(´Å`)", + "(●´Å`)", + "(; ̄Å ̄)", + "(*´Å`)o", + "(*´Å`*)", + "┏| ̄Å ̄* |┛", + "o(´Å`)o", + "( ̄Å ̄)", + "(#´Å`)", + "|  ̄Å ̄|o", + "〳 ᓀÅᓂ)", + "o(´^`)o", + "(`^´)ノ", + "( ̄^ ̄)", + "( ̄^ ̄)", + "(⌤⌗)", + "!( ̄^^ ̄)", + "┏| ̄^ ̄* |┛", + "( ̄^ ̄メ)\(_ _ ;)", + "(#´^`)", + "(*`Λ´*)」", + "|  ̄^ ̄|o", + "<( ̄^ ̄)>", + "(((o(`・∧・´)o)))", + "(。•ˇ‸ˇ•。)", + "(•̀⌄•́)", + "•̀.̫•́✧", + "(˵¯͒¯͒˵)", + "(๑ˇ ῁̫ ˇ)˒˒", + "(`ڼ´)", + "(o^皿^)", + "|  ̄∀ ̄ |", + "⚈ ̫ ⚈", + "╭⚈¬⚈╮", + "((o(●´皿`●;)o))", + "〳 ᓀ ﹏ ᓂ 〵", + "<(  ̄ ≧ ̄)>", + "( ̄´-` ̄)", + "(^⌒^*)", + "(*´⌒`*)", + "₍₍ ( ‾᷄꒫‾᷅ ) ₎₎", + "(-、-)", + "( ̄个 ̄)", + "┌( ‘o’)┐", + "╭〻◕`w´◕〻╮", + "┌(┌ 廿-廿)┐", + "(꒡ꜙ꒡)", + "( ྃ亽 ྃ)", + "(≧*≦)", + "( ๑‾̀◡‾́)σ»", + "⁎❝᷀ົཽ˴˷̮❝᷀ົཽ⁎", + "SMUG ANIME FACE", + "(*•̀ᴗ•́*)و ̑̑", + "╭( ・ㅂ・)و ̑̑", + "(๑˃̵ᴗ˂̵)و", + "(๑•̀ㅂ•́)و", + "╭(♡・ㅂ・)و ̑̑", + "◝( ′ㅂ`)و ̑̑", + "╭( ・ㅂ・)و ̑̑ "", + "╭( ・ㅂ・)و )))", + "╭(๑ ॔ㅂ ਂ ॓)و ̑̑", + "( ⁼̴̤̆ ළ̉ ⁼̴̤̆)و ̑̑", + "(๑˃̵ᴗ˂̵)و", + "(๑•̀ㅂ•́)و✧", + "๑͒•̀ु•و ̑̑", + "ଘ ๑ ˃̶ ᴗ ᵒ̴̶̷๑و ̑̑", + "(ฅ⁍̴̀◊⁍̴́)و ̑̑", + "╭( ・ㅂ・)و ̑̑ ˂ᵒ͜͡ᵏᵎ⁾✩", + "(•́⌄•́๑)૭✧", + "(•̀ᴗ•́)൬༉", + "!(•̀ᴗ•́)و ̑̑", + "(•̀o•́)ง", + "٩(•̤̀ᵕ•̤́๑)ᵒᵏ!!!!", + "ೕ(`・୰・´)", + "ೕ(・ㅂ・ )", + "ೕ(•̀ᴗ•́)", + "ೕ(˃̵ᴗ˂̵ ๑)", + "ೕ(•̀ㅂ•́ )", + "✧٩(•́⌄•́๑)", + "ೕ(⁍̴̀◊⁍̴́ฅ)", + "٩(。•ω•。)و", + "٩(⸝⸝⸝◕௰ ◕ั⸝⸝⸝ )و", + "٩(✪ꀾ⍟༶)و", + "୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭", + "٩(˃̶͈̀௰˂̶͈́)و", + "٩( ‘ω’ )و", + "٩(。•ㅅ•。)و", + "٩( ´・ш・)و", + "٩(•̤̀ᵕ•̤́๑)૭✧", + "٩(๑❛ワ❛๑)و", + "(۶•̀ᴗ•́)۶", + "٩( ᐛ )و", + "✧٩(•́⌄•́๑)و ✧", + "ೕ(`・୰・´)و ̑̑", + "٩(๑•̀ㅂ•́)و", + "٩(๑˃̵ᴗ˂̵)و", + "(((( ・ㅂ・)و )))", + "٩( ′ㅂ`)و ̑̑", + "٩(ˊᗜˋ*)و", + "(و ˃̵ᴗ˂̵)و", + "(ง ͡ʘ ͜ʖ ͡ʘ)ง", + "(ง ͠ ͠° ل͜ °)ง", + "٩(╬ŏ3ŏ)و", + "✧٩(ˊωˋ*)و✧", + "٩̋(ˊ•͈ ꇴ •͈ˋ)و", + "٩( ᐛ )و", + "\\\\୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭ ////", + "\\\\٩(˃̶͈̀௰˂̶͈́)و ////", + "✧*。٩(ˊᗜˋ*)و✧*。", + "¡¡¡( •̀ ᴗ •́ )و!!!", + "\\\\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 ////", + "(・□・;)", + "(」゜ロ゜)」", + "(*゚ロ゚)", + "Σ(゜ロ゜;)", + "щ(゜ロ゜щ)", + "∑(゚ロ゚〃)", + "┌╏ º □ º ╏┐", + "Σ(・口・)", + "(○□○)", + "(*〇□〇)……!", + "((((;゜Д゜)))", + "( ꒪Д꒪)ノ", + "(((( ;°Д°))))", + "((((;゜Д゜)))", + "(屮゜Д゜)屮", + "∑(;°Д°)", + "━Σ(゚Д゚|||)━", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "Σ (  Д )ﻌﻌﻌﻌ⊙ ⊙", + "!!(⊃ Д)⊃≡゚ ゚", + "w(@。@;)w", + "˓˓ ⍥⃝⃝ ˒˒", + "◟(◔₀◔ )◞ ༘♡", + "(ට˓˳̮ට๑)", + "(✿☉。☉)", + "(മ ̥̆ മ)", + "(ల◕ั˘๐◕ల)", + "(⋆⁰ ̥̮⁽⁰)(⁰⁾ ̥̮⁰⋆)", + "[ □ ₒ □ ]", + "(๑°o°๑)", + "(*´・o・)", + "(。・o・。)", + "(◔o◔ฺ)", + "(;゜○゜)", + "(・о・)", + "(∗❛௦❛ั∗)", + "L(・o・)」", + "( •͈૦•͈ ॣ)", + "(°o°;)", + "(○o○)", + "(◐ o ◑ )", + "\(>o<)ノ", + "w(°o°)w", + "(;꒪ö꒪)", + "(´ ˙○˙ `)", + "༼⁰o⁰;༽", + "(´⊙o⊙`;)", + "(〇o〇;) !!", + "|o゜)", + "(°o°:)", + "(° o°)!", + "oh!((゚o゚#", + "(゚o゚)", + "٩(●ö●)۶", + "(ू′o‵ ू)*✲゚", + "( 」。╹o╹。)」", + "(⑉⊙ȏ⊙)", + "Σ(꒪ȏ꒪)", + "( ゚o゚)", + "⑉ႣỏႣ⑉", + "(இ௦இ)", + "(•̪ o •̪)", + "(三・o・)", + "॥ँऀ ଠି ॥ँऀ", + "༼ つ ◕o◕ ༽つ", + "Σ(・o・;)", + "(〇o〇;)", + "(●’o’●)", + "╚═། . ◯ o ◯ . །═╝", + "@(。・0・)@", + "(ノ゚ο゚)ノ", + "(ノ*0*)ノ", + "(((;ꏿöꏿ;)))", + "੧[ ⁰ o ⁰ ]ʋ", + "༼ . ° o ° . ༽", + "⋋░ ✿ ⁰ o ⁰ ✿ ░⋌", + "(>0<;;;)", + "∑(‘0‘@)", + "(ФоФ)", + "(゚o゚〃)", + "(๑•́o•̀๑)", + "ლ(^o^ლ)", + "∩(。・o・。)∩", + "(゚ο゚人))", + "(⸝⸝⸝ª̷̛იॢª̷̛⸝⸝⸝)ᵒʰ┈", + "(◎0◎)", + "(ノ゚0゚)ノ~", + "(*0*)/", + "(・0・。(・-・。(・0・。(・-・。)", + "(#´O`)", + "(!!´◯`)∑", + "⊙0⊙", + "(⁎❛ ꒩ુ ❛⁎)", + "(*゚O゚*)", + "☉̥̆ Ô☉̥̆", + "(´〇`)", + "‧˚₊*̥(* ⁰̷̴͈꒨⁰̷̴͈)‧˚₊*̥", + "‧˚₊*̥(∗*⁰͈꒨⁰͈)‧˚₊*̥", + "(。☬0☬。)", + "‧˚₊*̥•̤ॢ•̤‧˚₊*̥", + "b(’0’)d", + "(*゚◯゚*)", + "ヾ(*’O’*)イ", + "ԅ║ . º ◯ º . ║ノ", + "(○`・」0・´)」", + "☉̥̆ Ô☉̥̆", + "╰║ ❛ ◯ ❛ ║╯", + "░ ⊚ ◯ ⊚ ░", + "║ ” ◕ ◯ ◕ ” ║", + "░ ි ◯ ි ░", + "(@・0・)ノ", + "╰། ◉ ◯ ◉ །╯", + "ے( Ö )ص", + "(´⊙ω⊙`)!", + "(゜◇゜)", + "⊙▂⊙", + "Σ(゜゜)", + "Σ(ಠิωಠิ|||)", + "〣( ºΔº )〣", + "Σ░(꒪◊꒪ ))))", + "(∗॔꒪⺫ॢ꒪)", + "ლ(╹◊╹)ლ", + "‷̗ↂ凸ↂ‴̖ i", + "◎ܫ◎", + "(ʘᗩʘ’)", + "(○A○)", + "=͟͟͞͞(  ω )=͟͟͞͞ ³ ³", + "w(゚△゚)w", + "(‘◇’`)", + "o(゚◇゚o)", + "(゜◇゜ ))", + "(( ゜◇゜)", + "(ؔᓒ⍥⃘ؔᓒ)", + "(๑o̴̶̷̥᷅﹏o̴̶̷̥᷅๑)ᵒᵐᵍ!!!", + "(´⊙ω⊙`)ᵒᵐᵍᵎᵎᵎ", + "║ ” ◕ ◯ ◕ ” ║ᵒᵐᵍᵎᵎᵎ", + "ԅ║ . º ◯ º . ║ノᵒᵐᵍᵎᵎᵎ", + "(◎0◎)ᵒᵐᵍᵎᵎᵎ", + "༼⁰o⁰;༽ᵒᵐᵍᵎᵎᵎ", + "┌╏ º □ º ╏┐ᵒᵐᵍᵎᵎᵎ", + "w(°o°)w ᵒᵐᵍᵎᵎᵎ", + "(;゜○゜)ᵒᵐᵍᵎᵎᵎ", + "∑(;°Д°)ᵒᵐᵍᵎᵎᵎ", + "(ᵒ̤̑ ₀̑ ᵒ̤̑)wow!*✰", + "!(ᵒ̤̑ ◁ ᵒ̤̑)wow!৹ᵍᵎᵎ", + "(´・艸・`)", + "(゚艸゚;)", + "∴(O艸O★)", + "|✿´・ლ・`|", + "║ . º 艸 º . ║", + "(#´艸`)", + "(๑°艸°๑)", + "あ( ̄○ ̄)り( ̄◇ ̄)が( ̄△ ̄)と( ̄0 ̄)う( ̄ー ̄)", + "アリガタビーム!!(ノ・_・)ノ‥‥━━━━━☆ピーー", + "どもども( ^-^)∠※.。・:*:・°`☆、。・:*:・°`★", + "°・:,。★\(^-^ )♪ありがとう♪( ^-^)/★,。・:・°", + "(*^^)/。・:*:・°★,。・:*:・°☆アリガトー!", + "Thanks ☆☆** v(o^▽^o)v**☆☆ Thanks", + "☆⌒(*^-°)v Thanks!!", + "ドモ~♪ヽ(^-^ )", + "アリガトタッキュウヽ(^o^)ρ┳━┻━┳°σ(^o^)/", + "アリガトネ\(^^\)三(/ ^^)/アリガトネ", + "ありがとさん (*^ - ^*)ゞ ポリポリ", + "♪♪♪ d(⌒O⌒)b♪♪♪サンキュ", + "ありがとちょっぷ!(°<___/(°o°)//いたいよ ", + "サンクスファイヤー( ・_・)r鹵~<火火炎炎炎゛【・ロ・】゛ヤケルヤケル", + "どうもです (' - ' *)ゞカキカキ", + "★あ(^ - ^) り(- ^ ) が(   ) と( ^ -) う\(^ 0 ^)/★", + "゛v(^_^ v)=アリガトウ=(v ^_^)v゛", + "アリガトランクス 凹凹凹凹凹凹凹 \(▽⌒\)", + "アリガト エヘ♪(*^・^)ノ ⌒☆(*^_^*)ポッ", + "アリガトヨーヨー ( ^o^)/-----((Thanks))゜o゜) ~☆グエッ", + "▽ありがとう▽ ヽ(#^ー゜#)v", + "ドモヽ(∇⌒ヽ)三(ノ⌒∇)ノドモ", + "o(*^▽^*)oどうもねぇ~", + "~アリガトネ~ (* '-^) ⌒☆パチン", + "アリガト ウフッ♪(*~ё~)ノ ⌒☆(。。lll)オエッ", + "アリガトビーム!!(ノ・_・)━━━━━━\☆(・_\)白刃取り", + "\"(*^^)/。・:*:・゜★,。・:*:・゜☆アリガトー!", + "m(._.)mアリガト", + "アリガトー!\(=^O^=)/'`*:;。・★'`*:;。・☆", + "ブンブン ヾヾ(^-^) ありがとぉ♪", + "アリガトシュリケン! ( ^o^)/---=≡卍)´o゜;) サクッ", + "アリガト\(^^\)(/^^)/アリガト", + "アリガトスケベイス!  ‥‥~凹凹凹凹 \(⌒▽⌒\)", + "\(∇⌒\)☆ア☆リ☆ガ☆ト☆ウ☆(/⌒∇)/", + "アリ\(*^▽^*)/ガトゥ", + "v(^_^v)♪ありがと♪(v^_^)v", + "m(_ _)m アリガトォ~★", + "蟻が十 ..........", + "☆⌒(*^∇゜)v ありがとう!", + "アリガト♪(*'-^)‐☆パチン キラキラ~~~コツン゛☆(°_° )~°ポケー", + "あ(^○^)り(^。^)が(^∇^)と(^O^)う(^ー^)ノ", + "クルクル(・_・)(_・ )(  )( ・_)(*°∇^V)⌒☆アリガトウ!", + "アリガチョーク ( -ω-)ノ-=≡≡≡☆-(>。<) イタイ", + "アリガタビーム (( o|o) ピ~》》》 (V)。。(V)フォッ", + "アリガトキッーク \(`O´)―θ☆(x x)", + "アリガタマキビシ ( -.-)ノ・・・-=≡≡≡*********", + "( ´△`)", + "ฅ(๑’Δ’๑)", + "(❁°͈▵°͈)", + "ฅ=͟͟͞͞((꒪∆꒪;)ฅ", + "(๑ʘ∆ʘ๑)", + "(๑ˊ▵ॢˋ̥๑)", + "(๑ ˊ͈ ᐞ ˋ͈ )ƅ̋", + "ల(`°Δ°)", + "(,,꒪꒫꒪,,)", + "((((爾△爾))))", + "(●´・△・`)", + "Σ(,,oΔo,,*)", + "(⊙△⊙✿)", + "⊙△⊙", + "〝〇〟⊂(`・Δ・´)⊃〝〇〟", + "( ゚д゚)", + "(๏д๏)", + "( ;´Д`)", + "(;´Д`)", + "(((( ;°Д°))))", + "((*゜Д゜)ゞ”", + "(@ ̄Д ̄@;)", + "(´;Д;`)", + "(´Д` )", + "(ι´Д`)ノ", + "《゚Д゚》", + "∑(;°Д°)", + "(;๏д๏)", + "Σ(゚д゚lll)", + "(((╹д╹;)))", + "(๑⁺᷄д⁺᷅๑)◞՞", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "( ᵒ̴̶̷᷄ д ᵒ̴̶̷᷅ )", + "(●ฅ́дฅ̀●)", + "(๑ŐдŐ)b", + "(・:゚д゚:・)", + "(๑´•д • `๑)", + "(´◑д◐`)", + "(◐д◑´,,)", + "d(ŐдŐ๑)", + "(°᷄д°᷅)", + "(*´゚д)(д゚`*)", + "(*´・Д・)", + "(υ´Д`)", + "(´Д`υ)", + "(・д・`o)", + "(:.;゚;Д;゚;.:)", + "( ;゚д゚)", + "Σ(゚д゚;)", + "(ノ゚д゚(; ̄Д ̄)", + "Σ【*゚д゚*】", + "๑ΘдΘ๑", + "(⌇ຶД⌇ຶ)", + "(๑Ő д Ő๑)", + "(・д・)", + "⊂(⊙д⊙)つ", + "(||゚Д゚)", + "(゚Д゚||)", + "⊂((メ´Д`))⊃", + "( ゚д゚)", + "(σ・Д・)σ", + "(*σ´Д`*)", + "Σ(っ゚Д゚;)っ", + "ヽ(;゚;Д;゚;; )", + "(´д`ι)", + "o┤*´Д`*├o", + "(;´゚Д゚)ゞ", + "(;゚;Д;゚;;)", + "w(´゚Д゚`)w", + "(# ゚Д゚)", + "ヾ(゚д゚)ノ゙", + "m(*´Д`)m", + "(;´・Д・)", + "|*´・Д・)r))゚", + "Σ(゚Д゚;≡`゚д゚)", + "(σ ´゜д゜)σ", + "( ゚д゚ )", + "((*`゚д゚)ゞ", + "σ(°Д°*)", + "┌┤´д`├┐", + "ミ(゜д゜○)", + "(゚д゚)", + "(。´・д・)o", + "o(゚Д゚)っ", + "Σ๑•ॢд •ॢ๑", + "(。´д`。)", + "Σ(`・Д・ノ)ノ", + "(οдО;)", + "◍´Д‵◍", + "o|๑⊙Д⊙๑|ツ", + "(✽ ゚д゚ ✽)", + "(´д`、)", + "(,,゚Д゚)", + "o(*´д`*)o", + "(´・Д・lll)ゞ", + "o(・´д・`o)))三(((o´・д`・)o", + "o(゚Д゚ = ゚Д゚)o ", + "o(゚Д゚ = ゚Д゚)o ", + "(´・(´・(´・(´・(´・(´・д・`) ・`)・`)・`)・`)・`)", + "(╯•﹏•╰)", + "(☍﹏⁰)", + "(◍•﹏•)", + "(๑•﹏•)", + "(‘﹏*๑)", + "(ó﹏ò。)", + "(。ŏ﹏ŏ)", + "( ・ั﹏・ั)", + "(´-﹏-`;)", + "•(◐﹏◐)•", + "(.`・﹏・´.)", + "c໒( ◐ ﹏ ◐ )७੭", + "ԅ[ •́ ﹏├┬┴┬┴", + " 。७﹏७ 。", + "(¤﹏¤)", + "●﹏●", + "へ[ : ⊚ ﹏ ⊚ : ]ง", + "╏ ˵ ✪ ﹏ ✪ ˵ ╏", + "▐ ” ⊗ ﹏ ⊗ ”▐", + "⊙﹏⊙", + "ミ●﹏☉ミ", + "ヾ(。﹏。)ノ゙", + "〳 •́ ﹏ •̀ 〵", + "╰[ ⁰﹏⁰ ]╯", + "(๑ó⌓ò๑)", + "(●´⌓`●)", + "( •᷄⌓•᷅ )", + "(´๑・⌓・`)", + "( ³⌓³)", + "(๑°⌓°๑)", + "(;ↀ⌓ↀ)", + "(◕⌓◕;)", + "Σ(‘◉⌓◉’)", + "(ὀ⌓ὀ⑅)", + "˛˛૧(˵¯͒▱¯͒˵)", + "˛૧(˵¯͒▱¯͒˵)", + "૮( ‘▱๋’ )ა", + "૮( ´⁰▱๋⁰` )ა", + "ଽ ૮( ⁰▱๋⁰ )ა", + "˚▱˚", + "(ⅈ▱ⅈ)", + "/( ̄ロ ̄;)\", + "( ̄□ ̄)", + "Σ੧(❛□❛✿)", + "[ ∗ ◕ □ ◕ ∗ ]", + "(o゚□゚)o", + "(oミ゚ロ゚ミ)o", + "(๑º ロ º๑)", + "(๑⊙ロ⊙๑)", + "∩( ̄□ ̄#)∩", + "(˚☐˚! )/", + "o(*・ロ・*)o", + "⁞ ✪ ⌂ ✪ ⁞", + "(✱°⌂°✱)", + "╏ ⁰ ⌂ ⁰ ╏", + "ヽ[ ಡ ⌂ ಡ ]⊃", + "₍₍ (̨̡ ‾᷄⌂‾᷅)̧̢ ₎₎", + "⚆ᗝ⚆", + "\(°o°;)", + "~~旦_(・o・;)", + "(;´・`)>", + "(; ̄ェ ̄)", + "(;° ロ°)", + "(;☉_☉)", + "( ̄□ ̄;)", + "( ̄□ ̄;)!!", + "( ̄◇ ̄;)", + "(°◇°;)", + "(°o°;)", + "(~_~;)", + "(−_−;)", + "(ーー;)", + "(o。o;)", + "(-。-;", + "༼⁰o⁰;༽", + "(´⊙o⊙`;)", + "・(•́⍛•̀; ≡ •́⍛•̀;)", + "(◞‸◟;)", + "( ´;゚;ё;゚;)", + ":;(∩´﹏`∩);:", + "(゚A゚;)", + "( ゚Å゚;)", + "٩̋(•᷄◟̵◞̵•᷅‧̣̥̇)’`~✧", + "(φ╻φ;)", + "(≖╻≖;)", + "(;ꏿ︿ꏿ)", + "༼ : ౦ ‸ ౦ : ༽", + "(´エ`;)", + "(-∀-`; )", + "(・∀・;)", + "(*;´□`)ゞ", + "[ : • 益 • : ]", + "ʕ・_・ ;ʔ≡ʕ; ・_・ʔ", + "( ̄ー ̄;)", + "((´∀`;))", + "(( ´∀`;))", + "。(>_<;=;>_<)。", + "(;○□○)", + "(*゚Å゚;*)", + "((((。(´°Α°`)。))))", + "f(^_^;", + "(°m°;)", + "(-∧-;)", + "。:゚*+;(●´・д・`●);+*゚:。", + "(:.;゚;益;゚;益;゚;益;゚;益;゚;益;゚;益;゚;.)", + "(」゜ロ゜)」", + "\(●o○;)ノ", + "┗┐ヽ(′Д、`*)ノ┌┛", + "ヽ(・_・;)ノ", + "ヾ(´・ ・`。)ノ”", + "ヽ( ̄д ̄;)ノ", + "ヽ(゜ロ゜;)ノ", + "ヾ(=゚・゚=)ノ", + "Σ(゚ロ゚」)」", + "ლ(´﹏`ლ)", + "╭(°A°`)╮", + "┌┤´゚Д゚`├┐", + "ヾ( •́д•̀ ;)ノ", + "ヽ(*´Д`*)ノ", + "ヽ(゚Д゚)ノ", + "ヾ(◎o◎,,;)ノ", + "ヾ( ๑´д`๑)ツ", + "ヾ(*ㅿ*๑)ツ", + "ヾ(๑ ³ㅿ³)ノ", + "ヾ(((;ꈡ▱ꈡ;)))ノ", + "ʿʿ⁽⁽((⁰ⅈ⁰))⁾⁾ʾʾ", + "ヾ(゚д゚;)", + "ヽ(;´Д`)ノ", + "ヾ(o´0ω0o)ノ", + "ヾ(o´0Д0o)ノ", + "<(´・д・`)ノ", + "ɭ ɿ (•᷄દ•᷅)", + "(ι´ Д`)ノ", + "ヽ༼﹏༽ノ", + "੧║ ” ◔ Ĺ̯ ◔ ” ║و", + "ゞ( ͡°⍛ ͡°)ゞ", + "ヽ༼⊙_⊙༽ノ", + "ヾ(*’□’*)ー", + "ヾ(・ω・`;))ノ", + "<(ll゚◇゚ll)>", + "ヾ((;´・ω・)ノ", + "ヾ(・ω・`;)ノ", + "ヽ(*´□`)ノ゙", + "ヾ(;゚;Д;゚;)ノ゙", + "(*ノ´□`)ノ~", + "╰໒(⸝⸝⸝⚆Ĺ̯⚆⸝⸝⸝)७ノ", + "ヽ(‘ºل͟º)ノ", + "へ( ̿̿ o ̿̿ )╮", + "ԅ། , ◔ ﹏ ◔ , །ᓄ", + "ヽ(◕﹏◕)ノ", + "(○´・д・)ノ", + "(*′口`)ノ", + "ヽ(*´□`*)ッ", + "ヽ(´・д・`)ノ", + "ヽ(・д・`。)ノ", + "ヽ(。´・д・)ノ", + "ヾ(゜д゜)ノ", + "(┓゜A゜)┓", + "ლ(゚д゚ლ)", + "ヽ(*゜∀゜*)ノ", + "ヾ(◕д◕❀)ツ", + "ヾ(❀◕д◕)ノ", + "(゜」∀」゜)", + "o|✿´・ェ・`|o", + "ヽ(▣﹏▣\*≡*/▣﹏▣)ノ", + "/~\o=(;゚ロ゚)=o/~\", + ".+:。ヽU゚Д゚Uノ゚.+:。", + "ヘ(゚∀゚ヘ)ヘ(゚∀゚ヘ)ヘ(゚∀゚ヘ)", + "ଵ˛̼ଵ", + "⁎ۜ′̛˷˒′̛⌕", + "⋆ᶿ̵᷄ ˒̼ ᶿ̵᷅⋆", + "๑•́ㅿ•̀๑) ᔆᵒʳʳᵞ", + "(๑o̴̶̷̥᷅﹏o̴̶̷̥᷅๑)ᵒᵐᵍᵎᵎᵎ", + "(・_-。 )", + "(’-’*)", + "(´ ˙○˙ `)", + "((유∀유|||))", + "Σ(´゚ω゚` )", + "(╯•ω•╰)", + "(๑ŏ _ ŏ๑)", + "~( ´•︵•` )~", + "(ૢ•᷄⊱•᷅ ╬)", + "(ʘᗩʘ’)", + "[・Å・` ○]", + "(๑´•ω • `๑)", + "‷̗ↂ凸ↂ‴̖", + "(*´・Å・`)", + "(๑•́ω•̀)", + "[・A・` ○]", + "ჴ˘ര‸രჴ", + "(੭ु⍨)੭ु⁾⁾", + "/・_・ヾ\", + "(⁎·́ˍູˑ·̀)", + "┌╏ •́ – •̀ ╏┐", + "( ´゚,_」゚)", + "o(°ω°メ)O))", + "(*´○∧○`*)", + "░ ര Ĺ̯ ര ░", + "~( ~´・_・`)~", + "[*っ´・Å・]", + "(  ゚々゚)", + "ε=(゚∀゜´)", + "(´σωσ*)", + "(´・⊥・`)", + "(⊙…⊙ )", + "(-’๏_๏’-)", + "(⊙︿⊙✿)", + "◑.◑", + "( ˵ ◐ ︿ ◐ ˵ )", + "( ° ^ ° )", + "໒(•න꒶̼න•)७", + "╏ ” ⊚ ͟ʖ ⊚ ” ╏", + "(✿˵•́ ‸ •̀˵)", + "“(´≖ ‸ ≖`)”", + ".,.,.,∵゜⊂-o(´・ω・`o)三(o´・ω・`)o-⊃゜∵.,.,.,", + "Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!", + "(•᷊᷄ṏ̮•᷊᷅)", + "(‖ⁱ꒪♖꒪)", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "(❛ॕ⌓ ̣̣̥❛ॕ•ॢ)", + "“(゚c_,゚`。)プ", + "“(#゚,_ゝ゚)”", + "o͡͡͡╮〳 ~ ☉ ₒ ☉ ~ 〵╭o͡͡͡", + "૮( ᵒ̌ัૢ▱ᵒ̌ัૢ )ა", + "(⌓⍢⌓〣)", + "⁝ʺ̢͈̗̋ •᷊᷄ṏ̮•᷊᷅ ˵̡̖̎̏⁝", + "( ͒๑㉾ܫ㉾๑ ͒)" +] + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'kaomoji', + description: 'Send a kaomoji text!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + const settings = await Guild.findOne({ + guildId: message.guild.id + }, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } + }); + + + + message.channel.send(`${rightThere[Math.round(Math.random() * (rightThere.length - 1))]}`).catch(() => {}); + + + + } +}; \ No newline at end of file diff --git a/commands/fun/kill.js b/commands/fun/kill.js new file mode 100644 index 00000000..93908e26 --- /dev/null +++ b/commands/fun/kill.js @@ -0,0 +1,74 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'kill', + description: 'Kill someone! !', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + if (!args[0]) return message.channel.send(`${language.kill1}`).catch(() => { + message.channel.send(`${language.kill1}`) + }); + + let userr = message.guild.member(message.mentions.users.first()); + if(!userr) return message.channel.send(`${language.kill1}`) + let user = userr.user.username; + + + const answers = [ + `${message.author.username} ${language.kill3} ${user}${language.kill4}`, + `${user} ${language.kill5}`, + `${user} ${language.kill6}`, + `${user} ${language.kill7}`, + `..Noo, ${message.author.username} ${language.kill8} ${user} ${language.kill9}`, + `${user} ${language.kill10} ${message.author.username}${language.kill11} `, + `${user} ${language.kill12}`, + `${user} ${language.kill13} ${message.author.username} ${language.kill14}`, + `${user} ${language.kill15}`, + `${message.author.username} ${language.kill16} ${user}${language.kill17}`, + `${user} ${language.kill18}`, + `${user} ${language.kill19}`, + `${user} ${language.kill20}`, + `${message.author.username} ${language.kill21} ${user} ${language.kill22}`, + `${message.author.username} ${language.kill23} ${user}.. rip`, + `${user} ${language.kill24}`, + `${language.kill25} ${user}${language.kill26}`, + `${language.kill27} ${user}.. rip }`, + `${message.author.username} crushes ${user} ${language.kill28}`, + `${user} ${language.kill29}`, + `${language.kill31} ${message.author.username}, ${user} ${language.kill30}`, + `${user} ${language.kill32} `, + `${user} ${language.kill33} `, + + ]; + + + if (userr.id === message.author.id) return message.channel.send(`${language.kill2}`).catch(() => { + message.channel.send(`${language.kill1}`) + }); + + + message.channel.send(`${answers[Math.floor(Math.random() * answers.length)]}`).catch(() => { + message.channel.send(`${language.kill1}`) + }); + + + + } +}; \ No newline at end of file diff --git a/commands/fun/nuke.js b/commands/fun/nuke.js new file mode 100644 index 00000000..d3dc3b1c --- /dev/null +++ b/commands/fun/nuke.js @@ -0,0 +1,21 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'nuke', + description: 'nuke a server (FAKE) !', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + message.channel.send(`https://tenor.com/view/explosion-mushroom-cloud-atomic-bomb-bomb-boom-gif-4464831`).catch(() => {}); + message.react('790133942095183873').catch(() => {}); + + } +}; \ No newline at end of file diff --git a/commands/fun/pickupline.js b/commands/fun/pickupline.js new file mode 100644 index 00000000..b9aa4fc7 --- /dev/null +++ b/commands/fun/pickupline.js @@ -0,0 +1,72 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); + + + +const line = [ + "Are you Node.js because I'd always give you a callback? I promise", + "I hope you know CPR because you take my breath away!", + "You've made me so nervous that I've totally forgotten my standard pick-up line.", + "Are you a trap card? Because I’ve fallen for you.", + "Roses are red, violets are blue, omae wa mo shindeiru", + "Baby, come with me and you'll be Going Merry.", + "I think I need a paralyze heal! Because you're stunning!", + "You must be a mahou shoujo, you've got me under your spell!", + "Do you have a Death Note? Because everytime you smile, I feel like I'm having a heart attack!", + "Are you Saitama? Because you've got me down in one move!", + "I don't need 99 souls, all I need is yours!", + "You must be better than Kuuhaku. Because when I first saw you, you already won my heart!", + "I'd take the Hunter Exam just for you!", + "Do you believe in fate? How about you stay the night? (Fate/Night; this one wasn't too apparant..)", + "Just say yes and I'll give you more than seven Eurekas!", + "You're like the 3D Maneuver gear. I won't stand a chance in this world without you!", + "You remind me of Menma. Because even when I can't see you, I still feel you inside my heart!", + "If I just had a Geass, I'd command you to be mine!", + "Extra cursed student or not, I wont even think of ignoring you! (From anime *another*; not too apparant..rip)", + "I don't need a Sharingan to see how beautiful you are!", + "Are you Kikyo? Because I think you shot an arrow through my heart!", + "Even if it means risking my existence, I'll cross different world lines just to find you! (Steins;Gate)", + "Hey! Are you the railgun? Because I can feel a spark! (Toaru Kagaku no Railgun)", + "Are you from the Bath House? Because you take my spirit away. (Spirited Away)", + "Omae wa mo shindeiru!", + "You must be Kira, because you just gave me a heart attack!", + "You're cooler than Grey's ice shell!", + "You're more delicious than Ciel's soul!", + "Our love is like Grell, it never seems to die!", + "We were born to make history!!", + "If you were a potato, you would be a good potato.", + "I don't need a Death Note, your beauty is killer!", + "I love you as much as Ryuk loves apples!", + "I'll buy you ice cream, just be careful not to drop it ...🍦", + "Call me All Might, because I’m just looking to Texas Smash!", + "...Full Homo...", + "I don't need pickup lines, because they don't work on corpses.", + "Kanye feel the love?", + "You can take me to flavour town!!", + "Hey, you're pretty good!!", + "I'd go full homo for you!", + "I wish they'd all die, except for you!" +] + + +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'pickupline', + description: 'Generate some pickuplines!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + + const embed = new MessageEmbed() + .setDescription(line[Math.round(Math.random() * (line.length - 1))]) + .setColor(message.client.color.pink); + return message.channel.send({ embed }).catch(() => {}); + } +}; \ No newline at end of file diff --git a/commands/fun/pokemon.js b/commands/fun/pokemon.js new file mode 100644 index 00000000..aa2ae5f6 --- /dev/null +++ b/commands/fun/pokemon.js @@ -0,0 +1,46 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const pokemon = require('../../assets/json/pokemon.json'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'pokemon', + aliases: [ 'poke'], + description: 'Guess the sent Pokemon!', + category: 'Fun', + guildOnly: true, + cooldown: 3 + }); + } + + async run(message) { + const rand = Math.floor(Math.random() * 802); + const poke = rand > 0 ? rand : Math.floor(Math.random() * 802); + const pokem = pokemon[poke]; + + const embed = new MessageEmbed() + .setAuthor(`Guess the pokemon`, pokem.imageURL, pokem.imageURL) + .setImage(pokem.imageURL) + .setColor('BLURPLE'); + + const msg = await message.channel.send({ embed }); + + const filter = m => m.author.id === message.author.id; + const attempts = await msg.channel.awaitMessages(filter, { time: 15000, max: 1 }); + + if (!attempts || !attempts.size) { + msg.delete(); + return message.channel.send(`You took too long to answer. It was ${pokem.name}.`); + } + + const answer = attempts.first().content.toLowerCase(); + + if (answer === pokem.name.toLowerCase()) { + await msg.edit(); + return msg.channel.send(`Great job! Your answer was correct!`); + } + await msg.edit(); + return msg.channel.send(`Fasle, the pokemon was **${pokem.name}.**`); + } +}; \ No newline at end of file diff --git a/commands/fun/quote.js b/commands/fun/quote.js new file mode 100644 index 00000000..b1e35350 --- /dev/null +++ b/commands/fun/quote.js @@ -0,0 +1,48 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'quote', + description: 'Make a quoted text!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + if(!message.member.hasPermission('MANAGE_MESSAGES')) return message.channel.send(`${language.managemessages}`) + + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]); + if (channel) { + args.shift(); + } else channel = message.channel; + + // Check type and viewable + if (channel.type != 'text' || !channel.viewable) return message.channel.send(`${language.notaccessible}`) + + + if (!args[0]) return message.channel.send(`${language.whatdoIsay}`); + + // Check channel permissions + if (!channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES'])) + return message.channel.send(`${language.sendmessages}`) + + if (!channel.permissionsFor(message.member).has(['SEND_MESSAGES'])) + return message.channel.send(`${language.userSendMessages}`); + const msg = message.content.slice(message.content.indexOf(args[0]), message.content.length); + channel.send(`>>> ${msg}`, { disableMentions: 'everyone' }).catch(() => {}); + + } +}; \ No newline at end of file diff --git a/commands/fun/rate.js b/commands/fun/rate.js new file mode 100644 index 00000000..dc326f36 --- /dev/null +++ b/commands/fun/rate.js @@ -0,0 +1,40 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rate', + description: 'Give me something and ill rate', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + const rating = Math.floor(Math.random() * 10) + 0; + const item = message.content.split(/\s+/g).slice(1).join(' '); + if (!item) return message.channel.send(new discord.MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${language.rate1} ${rating}/10!`)); + + if (item.length > 40) return message.channel.send(`${language.rate2}`); + + if (item.toUpperCase().startsWith('POGY')) return message.channel.send(`${language.rate3}`); + + return message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setDescription(`${language.rate4} **${item}** ${language.rate5} ${rating}/10!`)).catch(() => {}); + + + } + +}; \ No newline at end of file diff --git a/commands/fun/reverse.js b/commands/fun/reverse.js new file mode 100644 index 00000000..2ecbec30 --- /dev/null +++ b/commands/fun/reverse.js @@ -0,0 +1,33 @@ +const discord = require("discord.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'reverse', + aliases: [ 'rev' ], + description: 'Sends the same message that you had sent but reversed.', + category: 'Fun', + usage: '', + examples: [ 'reverse Hello World' ] + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + if(!args[0]) return message.channel.send(`${language.reverseError}`) + const text = args.join(' ') + const converted = text.split('').reverse().join(''); + message.channel.send(new discord.MessageEmbed().setDescription(`\u180E${converted}`).setColor(message.client.color.blue)).catch(() => {}); + + + + + } +}; \ No newline at end of file diff --git a/commands/fun/say.js b/commands/fun/say.js new file mode 100644 index 00000000..3aecc8d9 --- /dev/null +++ b/commands/fun/say.js @@ -0,0 +1,52 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const send = require(`../../packages/logs/index.js`) +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'say', + description: 'Make the bot send a message!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]); + if (channel) { + args.shift(); + } else channel = message.channel; + + // Check type and viewable + if (channel.type != 'text' || !channel.viewable) return message.channel.send(`${language.notaccessible}`) + + + if (!args[0]) return message.channel.send(`${language.whatdoIsay}`); + + // Check channel permissions + if (!channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES'])) + return message.channel.send(`${language.sendmessages}`) + + if (!channel.permissionsFor(message.member).has(['SEND_MESSAGES'])) + return message.channel.send(`${language.userSendMessages}`); + + const msg = message.content.slice(message.content.indexOf(args[0]), message.content.length); + send(channel, msg, { + name: `${message.author.username}`, + icon: `${message.author.displayAvatarURL()}` + }).catch(()=>{}) + + } +}; \ No newline at end of file diff --git a/commands/fun/simprate.js b/commands/fun/simprate.js new file mode 100644 index 00000000..4a608e25 --- /dev/null +++ b/commands/fun/simprate.js @@ -0,0 +1,56 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js"); +const fetch = require("node-fetch"); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'simprate', + aliases: [ 'howsimp' ], + description: 'See how simp you are', + category: 'Fun', + usage: '[user]', + examples: [ 'howsimp @user' ], + cooldown: 3 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + +function randomInteger(min, max) { + min = Math.ceil(min); + max = Math.floor(max) + return Math.floor(Math.random() * (max - min +1)) + min +} + const target = message.mentions.users.first() + const authorId = message.author.id + + let amount = randomInteger(1,100) + let text = message.mentions.members.first() + let embedd = new discord.MessageEmbed() + .setColor('GREEN') + .setTitle(`${language.simpmachine}`) + .setDescription(`${language.simpyouare} **${amount}%** simp`) + + if (target === authorId){ + + message.channel.send(embedd)} + if(!target)return message.channel.send(embedd) + let targett = target.username + let embed = new discord.MessageEmbed() + .setColor('GREEN') + .setTitle(`${language.simpmachine}`) + .setDescription(`${targett} ${language.simpIs} **${amount}%** simp`) + message.channel.send(embed) + + + + } + +}; \ No newline at end of file diff --git a/commands/fun/uselessweb.js b/commands/fun/uselessweb.js new file mode 100644 index 00000000..43b988c5 --- /dev/null +++ b/commands/fun/uselessweb.js @@ -0,0 +1,97 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'uselessweb', + description: 'See a random site from theuselessweb.com', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + var sitesList = [ + "http://heeeeeeeey.com/", + "http://corndog.io/", + "https://alwaysjudgeabookbyitscover.com", + "http://thatsthefinger.com/", + "http://cant-not-tweet-this.com/", + "http://weirdorconfusing.com/", + "http://eelslap.com/", + "http://www.staggeringbeauty.com/", + "http://burymewithmymoney.com/", + "https://smashthewalls.com/", + "https://jacksonpollock.org/", + "http://endless.horse/", + "http://www.trypap.com/", + "http://www.republiquedesmangues.fr/", + "http://www.movenowthinklater.com/", + "http://www.partridgegetslucky.com/", + "http://www.rrrgggbbb.com/", + "http://beesbeesbees.com/", + "http://www.koalastothemax.com/", + "http://www.everydayim.com/", + "http://randomcolour.com/", + "http://cat-bounce.com/", + "http://chrismckenzie.com/", + "https://thezen.zone/", + "http://hasthelargehadroncolliderdestroyedtheworldyet.com/", + "http://ninjaflex.com/", + "http://ihasabucket.com/", + "http://corndogoncorndog.com/", + "http://www.hackertyper.com/", + "https://pointerpointer.com", + "http://imaninja.com/", + "http://drawing.garden/", + "http://www.ismycomputeron.com/", + "http://www.nullingthevoid.com/", + "http://www.muchbetterthanthis.com/", + "http://www.yesnoif.com/", + "http://lacquerlacquer.com", + "http://potatoortomato.com/", + "http://iamawesome.com/", + "https://strobe.cool/", + "http://www.pleaselike.com/", + "http://crouton.net/", + "http://corgiorgy.com/", + "http://www.wutdafuk.com/", + "http://unicodesnowmanforyou.com/", + "http://chillestmonkey.com/", + "http://scroll-o-meter.club/", + "http://www.crossdivisions.com/", + "http://tencents.info/", + "http://www.patience-is-a-virtue.org/", + "http://pixelsfighting.com/", + "http://isitwhite.com/", + "https://existentialcrisis.com/", + "http://onemillionlols.com/", + "http://www.omfgdogs.com/", + "http://oct82.com/", + "http://chihuahuaspin.com/", + "http://www.blankwindows.com/", + "http://dogs.are.the.most.moe/", + "http://tunnelsnakes.com/", + "http://www.trashloop.com/", + "http://www.ascii-middle-finger.com/", + "http://spaceis.cool/", + "http://www.donothingfor2minutes.com/", + "http://buildshruggie.com/", + "http://buzzybuzz.biz/", + "http://yeahlemons.com/", + "http://wowenwilsonquiz.com", + "https://thepigeon.org/", + "http://notdayoftheweek.com/", + "http://www.amialright.com/", + "http://nooooooooooooooo.com/", + "https://greatbignothing.com/", + "https://zoomquilt.org/", + "https://dadlaughbutton.com/", + "https://www.bouncingdvdlogo.com/", + ]; + + var sites = sitesList[Math.round(Math.random() * (sitesList.length - 1))]; + + message.channel.send(sites) + } +}; \ No newline at end of file diff --git a/commands/fun/vaporwave.js b/commands/fun/vaporwave.js new file mode 100644 index 00000000..1515cbf2 --- /dev/null +++ b/commands/fun/vaporwave.js @@ -0,0 +1,33 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'vaporwave', + description: 'Vaporwavefies a text.', + category: 'Fun', + examples: [ 'vaporwave POG' ] + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + if (!args[0]) return message.channel.send(`${language.whatdoIsay}`); + + const vaporwavefied = args.toString().split('').map(char => { + const code = char.charCodeAt(0) + return code >= 33 && code <= 126 ? String.fromCharCode((code - 33) + 65281) : char + }).join('').replace(/,/g, ' ') + message.channel.send(new discord.MessageEmbed().setDescription(vaporwavefied).setColor(message.client.color.blue)); + } +}; \ No newline at end of file diff --git a/commands/fun/yomama.js b/commands/fun/yomama.js new file mode 100644 index 00000000..3a1292db --- /dev/null +++ b/commands/fun/yomama.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'yomama', + aliases: ['yomoma', 'yommama','yommoma'], + description: 'Make the bot send a spoiler message!', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + const client = message.client + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const res = await fetch('https://api.yomomma.info'); + let joke = (await res.json()).joke; + joke = joke.charAt(0).toLowerCase() + joke.slice(1); + if (!joke.endsWith('!') && !joke.endsWith('.') && !joke.endsWith('"')) joke += '!'; + message.channel.send(new discord.MessageEmbed().setColor('GREEN').setDescription(`hey ${user}, ${joke}`)).catch(() => {}); + + } +}; + +function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } \ No newline at end of file diff --git a/commands/fun/youtube.js b/commands/fun/youtube.js new file mode 100644 index 00000000..ffff1ea3 --- /dev/null +++ b/commands/fun/youtube.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js"); +const search = require('youtube-search'); +const he = require('he'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'youtube', + description: 'Search Specific videos off youtube!', + category: 'Fun', + cooldown: 60 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const apiKey = `AIzaSyD5c_0bfLA6Jz7ZSmeCsvn7NEH_VzQeBeM`; + const videoName = args.join(' '); + if (!videoName) return message.channel.send(`${language.youtube}`) + const searchOptions = { maxResults: 1, key: apiKey, type: 'video' }; + if (!message.channel.nsfw) searchOptions['safeSearch'] = 'strict'; + let result = await search(videoName, searchOptions) + .catch(() => {}); + result = result.results[0]; + if (!result) + return message.channel.send(`${language.youtubeUnable}`).catch(() => {}); + const decodedTitle = he.decode(result.title); + const embed = new discord.MessageEmbed() + .setTitle(decodedTitle) + .setURL(result.link) + .setThumbnail('https://github.com/peterhanania/pictures/blob/main/yt.png?raw=true') + .setDescription(result.description) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor('#FF1CA4'); + + if (message.channel.nsfw) embed.setImage(result.thumbnails.high.url); + message.channel.send(embed).catch(() => {}); + + } +}; \ No newline at end of file diff --git a/commands/fun/zalgo.js b/commands/fun/zalgo.js new file mode 100644 index 00000000..476ede3c --- /dev/null +++ b/commands/fun/zalgo.js @@ -0,0 +1,33 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js"); +const zalgo = require('zalgolize'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'zalgo', + aliases:'zalgolize', + description: 'Make the bot zalgolize a message', + category: 'Fun', + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + if(!args[0]) return message.channel.send(`${language.zalgolize}`) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setDescription(`\u180E${zalgo(args, 0.2, [10, 5, 10])}`)); + + + } +}; \ No newline at end of file diff --git a/commands/images/achievement.js b/commands/images/achievement.js new file mode 100644 index 00000000..30b174ad --- /dev/null +++ b/commands/images/achievement.js @@ -0,0 +1,49 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'achievement', + aliases: ['minecraftachievement', 'mcachievement'], + description: 'Get a minecraft achievement!', + category: 'Images', + usage: '', + examples: [ 'achievement Earnt a Diamond' ], + cooldown: 5, + disabled: true, + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const text = args.join(" "); + + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + + if (text.length > 25) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.mcErrorCharacter}`)); + + let numb = Math.ceil(Math.random() * 39) + /* const superagent = require('superagent') + const { body } = await superagent + .get('https://www.minecraftskinstealer.com/achievement/a.php') + .query({ + i: numb, + h: 'Achievement Got!', + t: text + }); + message.channel.send({ files: [{ attachment: body, name: 'achievement.png' }] + }); */ + + + }} \ No newline at end of file diff --git a/commands/images/awooify.js b/commands/images/awooify.js new file mode 100644 index 00000000..6caca594 --- /dev/null +++ b/commands/images/awooify.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'awooify', + aliases: [ ], + description: 'awooify someone!', + category: 'Images', + usage: '', + examples: [ 'awooify @peter' ], + cooldown: 5 + }); + } + + async run(message, args) { + let client = message.client + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + //Ye put code here + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=awooify&url=${user.displayAvatarURL({ size: 512 })}` + ).then((res) => res.json()); + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)); + + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + } +}; diff --git a/commands/images/bird.js b/commands/images/bird.js new file mode 100644 index 00000000..3e472727 --- /dev/null +++ b/commands/images/bird.js @@ -0,0 +1,41 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'bird', + description: 'Get a bird picture!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + try { + const res = await fetch('http://shibe.online/api/birds'); + const img = (await res.json())[0]; + const embed = new discord.MessageEmbed() + .setImage(img) + .setFooter(`/shibe.online/api/birds`) + .setTimestamp() + .setColor(client.color.red); + message.channel.send(embed); + + } catch (err) { + console.log(`${err}, command name: bird`) + message.reply(language.birdError) + + } + }} \ No newline at end of file diff --git a/commands/images/blurpify.js b/commands/images/blurpify.js new file mode 100644 index 00000000..152e961a --- /dev/null +++ b/commands/images/blurpify.js @@ -0,0 +1,48 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'blurpify', + description: 'Blurpify a picture!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=blurpify&image=${user.displayAvatarURL({ size: 512 })}` + ).then((res) => res.json()); + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)); + + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + }} \ No newline at end of file diff --git a/commands/images/calling.js b/commands/images/calling.js new file mode 100644 index 00000000..d0051334 --- /dev/null +++ b/commands/images/calling.js @@ -0,0 +1,59 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'calling', + aliases: [ 'call' ], + description: 'Tom&Jerry Tom calling Meme image', + category: 'Images', + usage: '', + examples: [ 'achievement LOL WHATS UP??' ], + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + + + try { + const text = args.join(" "); + + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + if (text.length > 100) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.callingError}`)); + + let options = { + url: 'https://api.alexflipnote.dev/calling', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + icon: 1, + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/captcha.js b/commands/images/captcha.js new file mode 100644 index 00000000..367e6381 --- /dev/null +++ b/commands/images/captcha.js @@ -0,0 +1,56 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'captcha', + description: 'Sends you a Captcha image!', + category: 'Images', + usage: '', + examples: [ 'captcha hey Im a robot!' ], + cooldown: 5 + }); + } + + async run(message, args) { + + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + try { + const text = args.join(" "); + + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + if (text.length > 70) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.capchaError}`)); + + let options = { + url: 'https://api.alexflipnote.dev/captcha', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + icon: 1, + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/cat.js b/commands/images/cat.js new file mode 100644 index 00000000..cd8cdc4a --- /dev/null +++ b/commands/images/cat.js @@ -0,0 +1,40 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'cat', + description: 'Get a cat picture!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + const apiKey = `ef531f70-1f89-4196-ba72-ced3d2213c09`; + try { + const res = await fetch('https://api.thecatapi.com/v1/images/search', { headers: { 'x-api-key': apiKey }}); + const img = (await res.json())[0].url; + const embed = new discord.MessageEmbed() + .setImage(img) + .setFooter(`/api.thecatapi.com/v1/images/search`) + .setTimestamp() + .setColor(client.color.blue) + message.channel.send(embed); + } catch (err) { + console.log(`${err}, command name: cat`) + message.channel.send(language.catError) + } + + }} \ No newline at end of file diff --git a/commands/images/changemymind.js b/commands/images/changemymind.js new file mode 100644 index 00000000..19b3c2cb --- /dev/null +++ b/commands/images/changemymind.js @@ -0,0 +1,49 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'changemymind', + aliases: ['chmm'], + description: 'Sends a changemymind Text!', + category: 'Images', + usage: '', + examples: [ 'changemymind Poggers' ], + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + + if(text.length > 85) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorCharacter}`)); + + let msg = await message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.generating)) + + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=changemymind&text=${text}` + ).then((res) => res.json()); + msg.delete({timeout: 500}) + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)) + + } catch (err) { + console.log(`${err}, command name: changemymind`) + message.channel.send(language.changeError) + } + + + }} \ No newline at end of file diff --git a/commands/images/clyde.js b/commands/images/clyde.js new file mode 100644 index 00000000..8b1b2668 --- /dev/null +++ b/commands/images/clyde.js @@ -0,0 +1,50 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'clyde', + description: 'Sends a clyde message!', + category: 'Images', + usage: '', + examples: [ 'clyde hey discord!' ], + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + +let text = args.slice(0).join(" ") +if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + if(text.length > 60) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.clydeError}`)); + +try { +let msg = await message.channel.send(language.generating); + + +const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=clyde&text=${text}` + ).then((res) => res.json()); + msg.delete({timeout: 500}) + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)) + + + } catch (err) { + console.log(`${err}, command name: clyde`) + message.channel.send(language.clydeError) + } + + + }} \ No newline at end of file diff --git a/commands/images/deepfry.js b/commands/images/deepfry.js new file mode 100644 index 00000000..818c30d6 --- /dev/null +++ b/commands/images/deepfry.js @@ -0,0 +1,49 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'deepfry', + description: 'deepfry a picture!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=deepfry&image=${user.displayAvatarURL({ size: 512 })}` + ).then((res) => res.json()); + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)); + + + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + }} \ No newline at end of file diff --git a/commands/images/dog.js b/commands/images/dog.js new file mode 100644 index 00000000..613be3fc --- /dev/null +++ b/commands/images/dog.js @@ -0,0 +1,39 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'dog', + description: 'Get a cute dog picture!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + try { + const res = await fetch('https://dog.ceo/api/breeds/image/random'); + const img = (await res.json()).message; + const embed = new discord.MessageEmbed() + .setImage(img) + .setFooter('/dog.ceo/api/breeds/image/random') + .setColor(message.guild.me.displayHexColor) + message.channel.send(embed); + } catch (err) { + console.log(`${err}, command name: dog`) + message.reply(language.birdError) + + } + + }} \ No newline at end of file diff --git a/commands/images/facts.js b/commands/images/facts.js new file mode 100644 index 00000000..155d6f38 --- /dev/null +++ b/commands/images/facts.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const request = require('request-promise-native'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'facts', + aliases:['fact'], + description: 'make a fact', + category: 'Images', + usage: '', + examples: [ 'facts Im pog' ], + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + if(text.length > 60) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.clydeError}`)); + let options = { + url: 'https://api.alexflipnote.dev/facts', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/floor.js b/commands/images/floor.js new file mode 100644 index 00000000..fb074d05 --- /dev/null +++ b/commands/images/floor.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const request = require('request-promise-native'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'floor', + aliases: [ 'fil', 'floorislava' ], + description: 'The floor is lava', + category: 'Images', + usage: '', + examples: [ 'floor Lava' ], + cooldown: 5 + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + if(text.length > 40) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.floorError}`)); + let options = { + url: 'https://api.alexflipnote.dev/floor', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + icon: 1, + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/imposter.js b/commands/images/imposter.js new file mode 100644 index 00000000..20011d86 --- /dev/null +++ b/commands/images/imposter.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const request = require('request-promise-native'); + + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'impostor', + aliases: ['imposter'], + description: 'Be an impostor', + category: 'Images', + usage: '', + examples: [ 'imposter Peter' ], + cooldown: 5, + guildOnly: true + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + if(text.length > 40) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.floorError}`)); + //https://vacefron.nl/api/ejected?name=[MESSAGE]&imposter=true&crewmate=red + let options = { + url: 'https://vacefron.nl/api/ejected', + qs: { + name: args.join(' ').split('').join(''), + imposter: true, + crewmate: 'red' + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/iphonex.js b/commands/images/iphonex.js new file mode 100644 index 00000000..81afcd15 --- /dev/null +++ b/commands/images/iphonex.js @@ -0,0 +1,47 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'iphonex', + description: 'Make someone fit in an iphonex!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=iphonex&url=${user.displayAvatarURL({ size: 512 })}` + ).then((res) => res.json()); + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)); + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + }} \ No newline at end of file diff --git a/commands/images/jail.js b/commands/images/jail.js new file mode 100644 index 00000000..579b43ae --- /dev/null +++ b/commands/images/jail.js @@ -0,0 +1,47 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const Canvacord = require('canvacord'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'jail', + description: 'Send Someone to jail!', + category: 'Images', + cooldown: 5 + }); + } + + async run(message, args) { + + const client = message.client; + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + let avatar = user.displayAvatarURL({dynamic : true, format:'png'}); + let image = await Canvacord.Canvas.jail(avatar); + let attachment = new discord.MessageAttachment(image, "jail.png"); + message.channel.send(attachment); + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + }} \ No newline at end of file diff --git a/commands/images/magik.js b/commands/images/magik.js new file mode 100644 index 00000000..5062aacb --- /dev/null +++ b/commands/images/magik.js @@ -0,0 +1,64 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'magik', + aliases: [], + description: 'Make a magik avatar!', + category: 'Fun', + usage: '', + examples: [ 'magik'], + guildOnly: true + }); + } + + async run(message, args) { + const client = message.client; + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + + let msg = await message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.generating)) + + + let user = message.mentions.users.first() ? message.mentions.users.first().displayAvatarURL({format: 'png', size: 512}) :message.author.displayAvatarURL({format: 'png', size: 512}); + let numb = Math.ceil(Math.random() * 10) + const data = await fetch( + `https://nekobot.xyz/api/imagegen?type=magik&image=${user}&intensity=${numb}` + ).then((res) => res.json()); + msg.delete({timeout: 500}) + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setImage(data.message)) + + } catch (err) { + + console.log(`${err}, command name: magik`) + message.channel.send(language.magikError) + } + + + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + + }} +}; \ No newline at end of file diff --git a/commands/images/meme.js b/commands/images/meme.js new file mode 100644 index 00000000..060ba45c --- /dev/null +++ b/commands/images/meme.js @@ -0,0 +1,36 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'meme', + description: 'Generate some memes!', + category: 'Images', + cooldown: 2 + }); + } + + async run(message) { + try { + const data = await fetch(`https://meme-api.herokuapp.com/gimme`) + .then(res => res.json()) + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/notimposter.js b/commands/images/notimposter.js new file mode 100644 index 00000000..234243b4 --- /dev/null +++ b/commands/images/notimposter.js @@ -0,0 +1,52 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'notimpostor', + aliases:['notimposter'], + description: 'Someone was not the impostor', + category: 'Images', + usage: '', + examples: [ 'notimpostor Peter' ], + cooldown: 5, + guildOnly: true + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + if(text.length > 40) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.floorError}`)); + //https://vacefron.nl/api/ejected?name=[MESSAGE]&imposter=true&crewmate=red + let options = { + url: 'https://vacefron.nl/api/ejected', + qs: { + name: args.join(' ').split('').join(''), + imposter: false, + crewmate: 'red' + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/pornhub.js b/commands/images/pornhub.js new file mode 100644 index 00000000..19b1cf5d --- /dev/null +++ b/commands/images/pornhub.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'pornhub', + aliases: [ 'ph' ], + description: 'Make your own HUB logo!', + category: 'Images', + usage: '', + examples: [ 'pornhub Pog' ], + cooldown: 5 + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + let options = { + url: 'https://api.alexflipnote.dev/pornhub?text2=Hub&', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/pornhubcomment.js b/commands/images/pornhubcomment.js new file mode 100644 index 00000000..2179bcec --- /dev/null +++ b/commands/images/pornhubcomment.js @@ -0,0 +1,36 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const { Canvas } = require("canvacord"); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'pornhubcomment', + aliases: [ 'phcomment', 'phubcomment' ], + description: 'Make your own HUB text!', + category: 'Images', + usage: '', + examples: [ 'pornhub Hello there' ], + cooldown: 5 + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + if(text.length > 50) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.phubErrorCharacter}`)); + + Canvas.phub({ username: message.author.username, message: text, image: message.author.displayAvatarURL({ format: "png" }) }) + .then(attachment => message.channel.send({ files: [{attachment, name: "img.png"}] })) + } +}; \ No newline at end of file diff --git a/commands/images/reddit.js b/commands/images/reddit.js new file mode 100644 index 00000000..2ddd4b0c --- /dev/null +++ b/commands/images/reddit.js @@ -0,0 +1,52 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'reddit', + description: 'Get a random photo from specified subreddit', + category: 'Images', + cooldown: 2 + }); + } + + async run(message, args) { + try { + if (args.length < 1) { + return message.channel.send('Please give me a subreddit!') + } + + var subreddits = [ + args.join(' ').split('').join('') + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if(data.nsfw) return message.channel.send(`${message.client.emoji.fail} The selected subreddit is 18+. please consider using an NSFW Channel!`) + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: message.client.config.blue, + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }).catch(() => { + message.channel.send(`Could not find that subreddit!`) + }); + + + } catch(error) { + + message.channel.send(`Could not find that subreddit!`) + } + } +}; \ No newline at end of file diff --git a/commands/images/slap.js b/commands/images/slap.js new file mode 100644 index 00000000..55f2802c --- /dev/null +++ b/commands/images/slap.js @@ -0,0 +1,75 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const { MessageAttachment } = require("discord.js") +const Canvacord = require("canvacord/src/Canvacord") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'slap', + description: 'slap a user!', + category: 'Images', + cooldown: 4 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + const recipient = message.content.split(/\s+/g).slice(1).join(' '); + if (!recipient) { + const member = message.guild.me + const mentionedMemberAvatar = member.user.displayAvatarURL({dynamic: false, format: "png"}) + const messageAuthorAvatar = message.author.displayAvatarURL({dynamic: false, format: "png"}) + + let image = await Canvacord.slap(mentionedMemberAvatar, messageAuthorAvatar) + + let slap = new MessageAttachment(image, "slap.png") + + message.channel.send(slap) + + } + else if (message.mentions.users.first() == message.author) { + + + const member = this.client.user + const mentionedMemberAvatar = member.user.displayAvatarURL({dynamic: false, format: "png"}) + const messageAuthorAvatar = message.author.displayAvatarURL({dynamic: false, format: "png"}) + + let image = await Canvacord.slap(mentionedMemberAvatar, messageAuthorAvatar) + + let slap = new MessageAttachment(image, "slap.png") + + message.channel.send(slap) + } + + else { + const member = message.mentions.users.first() + const mentionedMemberAvatar = member.displayAvatarURL({dynamic: false, format: "png"}) + const messageAuthorAvatar = message.author.displayAvatarURL({dynamic: false, format: "png"}) + + let image = await Canvacord.slap(messageAuthorAvatar, mentionedMemberAvatar) + + let slap = new MessageAttachment(image, "slap.png") + + message.channel.send(slap) + + } + + } catch (err) { + message.channel.send(new discord.MessageEmbed().setColor(client.color.blue).setDescription(language.slapError)) + }; + + + + } +}; \ No newline at end of file diff --git a/commands/images/supreme.js b/commands/images/supreme.js new file mode 100644 index 00000000..cb71e417 --- /dev/null +++ b/commands/images/supreme.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'supreme', + description: 'Make a fake Supreme logo', + category: 'Images', + usage: '', + examples: [ 'supreme Peter '], + cooldown: 5 + }); + } + + async run(message, args) { + const client = message.client; + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + try { + let text = args.slice(0).join(" ") + if(!text) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + if(text.length > 40) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.floorError}`)); + let options = { + url: 'https://api.alexflipnote.dev/supreme', + headers: { + 'Authorization': this.client.config.alexflipnoteApiKey + }, + qs: { + text: args.join(' ').split('').join('') + }, + encoding: null + }; + + let response = await request(options); + + await message.channel.send({ + files: [ response ] + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/images/trumptweet.js b/commands/images/trumptweet.js new file mode 100644 index 00000000..39e3b282 --- /dev/null +++ b/commands/images/trumptweet.js @@ -0,0 +1,47 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const discord = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'trumptweet', + aliases: [ 'trump' , 'tweet'], + description: 'Make trump say a message!', + category: 'Images', + usage: '', + examples: [ 'trumptweet Hey its me' ], + cooldown: 3 + }); + } + + async run(message, args) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + if (!args[0]) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} ${language.changeErrorValid}`)); + + let tweet = message.content.slice(message.content.indexOf(args[0]), message.content.length); + if (tweet.length > 68) tweet = tweet.slice(0, 65) + '...'; + + try { + const res = await fetch('https://nekobot.xyz/api/imagegen?type=trumptweet&text=' + tweet); + const img = (await res.json()).message; + const embed = new discord.MessageEmbed() + .setTitle(':flag_us: Trump Tweet :flag_us: ') + .setImage(img) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(client.color.blue); + message.channel.send(embed); + } catch (err) { + console.log(`error: ${err}, command name: Trump Tweet`) + message.reply(language.trumpError) + } + } +}; \ No newline at end of file diff --git a/commands/information/avatar.js b/commands/information/avatar.js new file mode 100644 index 00000000..fe3ceb77 --- /dev/null +++ b/commands/information/avatar.js @@ -0,0 +1,42 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); + +const Guild = require('../../database/schemas/Guild'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'avatar', + aliases: ['profilepic', 'pic', 'ava', 'av'], + usage: '[user]', + description: 'Displays a user\'s avatar', + category: 'Information', + examples: [ 'av', 'av @Peter'], + cooldown: 3 + }); + } + + async run(message) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const match = message.content.match(/\d{18}/); + let member = match ? message.guild.members.cache.get(match[0]) : message.member + + if (!member) member = message.member + + const embed = new MessageEmbed() + .setAuthor(`${language.pfpAvatar.replace("{user}", `${member.user.tag}`)}`, member.user.displayAvatarURL({ dynamic: true, size: 512 }), member.user.displayAvatarURL({ dynamic: true, size: 512 })) + .setImage(member.user.displayAvatarURL({ dynamic: true, size: 512 })) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(member.displayHexColor); + return message.channel.send(embed); + } +}; \ No newline at end of file diff --git a/commands/information/emojis.js b/commands/information/emojis.js new file mode 100644 index 00000000..6c807fac --- /dev/null +++ b/commands/information/emojis.js @@ -0,0 +1,60 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const ReactionMenu = require('../../data/ReactionMenu.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'emojis', + description: `Check the curent guild's emojis`, + category: 'Information', + cooldown: 3 + }); + } + + + async run(message, args) { + +let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let prefix = guildDB.prefix + + const emojis = []; + message.guild.emojis.cache.forEach(e => emojis.push(`\u0009 ${e} **—** \`:${e.name}:\``)); + +const embed = new MessageEmbed() + .setAuthor(`${language.emoji1}`, message.guild.iconURL({ dynamic: true })) + .setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + + const interval = 25; + if (emojis.length === 0) message.channel.send(embed.setDescription(`${language.emoji2}`)); + else if (emojis.length <= interval) { + const range = (emojis.length == 1) ? '[1]' : `[1 - ${emojis.length}]`; + message.channel.send(embed + .setAuthor(`${language.emoji1} ${range}`, message.guild.iconURL({ dynamic: true })) + .setDescription(emojis.join('\n')) + ); + + // Reaction Menu + } else { + + embed + .setAuthor(`${language.emoji1}`, message.guild.iconURL({ dynamic: true })) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ); + + new ReactionMenu(message.client, message.channel, message.member, embed, emojis, interval); + } + + } +}; \ No newline at end of file diff --git a/commands/information/help.js b/commands/information/help.js new file mode 100644 index 00000000..783f59ea --- /dev/null +++ b/commands/information/help.js @@ -0,0 +1,332 @@ +const { MessageEmbed } = require('discord.js'); +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require('discord.js'); +const { oneLine, stripIndent } = require('common-tags'); +const emojis = require('../../assets/emojis.json') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'help', + aliases: ['menu', 'bothelp', 'commands'], + description: 'Shows you every available command in the guild', + category: 'Information', + usage: '[command]', + examples: [ 'help userinfo', 'help avatar' ], + cooldown: 3 + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ guildId: message.guild.id }); + + let disabledCommands = guildDB.disabledCommands; + if (typeof(disabledCommands) === 'string') disabledCommands = disabledCommands.split(' '); + + const prefix = guildDB.prefix; + + + const emoji = { + altdetector: `${emojis.altdetector}`, + applications: `${emojis.applications}`, + config: `${emojis.config}`, + utility: `${emojis.utility}`, + economy: `${emojis.economy}`, + fun: `${emojis.fun}`, + images: `${emojis.images}`, + information: `${emojis.information}`, + moderation: `${emojis.moderation}`, + nsfw: `${emojis.nsfw}`, + reactionrole: `${emojis.reactionrole}`, + tickets: `${emojis.tickets}`, + }; + + const green = '<:purple:826033456207233045>'; + const red = '<:redsquare:803527843661217802>'; + + const settings = await Guild.findOne({ + guildId: message.guild.id, + }); + + const embed = new MessageEmbed() + .setColor('PURPLE') + + + if (!args || args.length < 1) { + + let categories; + categories = this.client.utils.removeDuplicates(this.client.commands.filter(cmd => cmd.category !== 'Owner').map(cmd => cmd.category)); + + for (const category of categories) { + embed.addField(`${emoji[category.split(" ").join("").toLowerCase()]} **${capitalize(category)}**`, `\`${prefix}help ${category.toLowerCase()}\``, true) + } + embed.setTitle(`Pogy's Command List`) + embed.setDescription(stripIndent` + <:purple:826033456207233045> The Prefix for this server is \`${prefix}\` + + `); + + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() + + +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args.join(" ").toLowerCase() == "alt detector" || args && args[0].toLowerCase() == "alt"){ + + embed.setTitle(` ${emojis.altdetector} - Alt Detector`) + embed.setDescription(this.client.commands.filter(cmd => + cmd.category.toLowerCase() === "alt detector").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(9 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() + embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + } else if(args && args[0].toLowerCase() == "applications" || args && args[0].toLowerCase() == "apps"){ + + embed.setTitle(` ${emojis.applications} - applications`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "applications").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(11 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() + +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "config" || args && args[0].toLowerCase() == "configuration"){ + + embed.setTitle(` ${emojis.config} - Config`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "config").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(14 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + } else if(args && args[0].toLowerCase() == "utility" || args && args[0].toLowerCase() == "utils"){ + + embed.setTitle(` ${emojis.utility} - Utility`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "utility").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(10 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "economy" || args && args[0].toLowerCase() == "currency"){ + + embed.setTitle(` ${emojis.economy} - Economy`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "economy").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(9 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "fun"){ + + embed.setTitle(` ${emojis.fun} - Fun`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "fun").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(10 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "images" || args && args[0].toLowerCase() == "image"){ + + embed.setTitle(` ${emojis.images} - Image`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "images").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(14 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "information" || args && args[0].toLowerCase() == "info"){ + + embed.setTitle(` ${emojis.information} - Info`) + embed.setDescription(this.client.commands.filter(cmd => + cmd.category.toLowerCase() === "information").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(11 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + } else if(args && args[0].toLowerCase() == "moderation" || args && args[0].toLowerCase() == "mod"){ + + embed.setTitle(` ${emojis.moderation} - Moderation`) + embed.setDescription(this.client.commands.filter(cmd => + cmd.category.toLowerCase() === "moderation").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(11 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + return message.channel.send(embed) + + + } else if(args && args[0].toLowerCase() == "nsfw"){ + + + embed.setTitle(` ${emojis.nsfw} - NSFW`) + embed.setDescription(this.client.commands.filter(cmd => + cmd.category.toLowerCase() === "nsfw").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(9 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + if(!message.channel.nsfw) embed.setDescription(`The following Menu only belongs to NSFW Channels 👀`) + return message.channel.send(embed) + + } else if(args && args.slice(0).join(" ").toLowerCase() == "reaction role" || args && args[0].toLowerCase() == "rr"){ + + embed.setTitle(` ${emojis.reactionrole} - Reaction Roles`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "reaction role").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(12 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); + + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + + return message.channel.send(embed) + + } else if(args && args[0].toLowerCase() == "tickets" || args && args[0].toLowerCase() == "ticketing"){ + + embed.setTitle(` ${emojis.tickets} - Tickets`) + embed.setDescription(this.client.commands.filter(cmd => + + cmd.category.toLowerCase() === "tickets").map(cmd => `${cmd.disabled || disabledCommands.includes(cmd.name || cmd) ? red : green} \`${cmd.name} ${" ".repeat(11 - Number(cmd.name.length))}:\` ${cmd.description}`).join("\n")); +embed.addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + embed.setFooter(`Requested by ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + embed.setTimestamp() + + return message.channel.send(embed) + + + + } else { + + + + + const cmd = this.client.commands.get(args[0]) || this.client.commands.get(this.client.aliases.get(args[0])) + + if (!cmd) return message.channel.send(`${message.client.emoji.fail} Could not find the Command you're looking for`) + + if(cmd.category === "Owner") return message.channel.send(`${message.client.emoji.fail} Could not find the Command you're looking for`) + + + embed.setTitle(`Command: ${cmd.name}`) + embed.setDescription(cmd.description) + embed.setThumbnail(`${message.client.domain}/logo.png`) + embed.setFooter(cmd.disabled || disabledCommands.includes(args[0] || args[0].toLowerCase()) ? 'This command is currently disabled.' : message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + + + embed.addField('Usage', `\`${cmd.usage}\``, true) + embed.addField('category', `\`${capitalize(cmd.category)}\``, true) + + if(cmd.aliases && cmd.aliases.length) embed.addField('Aliases', cmd.aliases.map(alias => `\`${alias}\``, true).join(', '), true) + if(cmd.cooldown && cmd.cooldown > 1) embed.addField('Cooldown', `\`${cmd.cooldown}s\``, true) + if(cmd.examples && cmd.examples.length) embed.addField('__**Examples**__', cmd.examples.map(example => `<:purple:826033456207233045> \`${example}\``).join('\n')) + + + return message.channel.send(embed) + + } + } +}; + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} \ No newline at end of file diff --git a/commands/information/members.js b/commands/information/members.js new file mode 100644 index 00000000..7d485289 --- /dev/null +++ b/commands/information/members.js @@ -0,0 +1,83 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const PROTOCOL_REGEX = /^[a-zA-Z]+:\/\// +const PATH_REGEX = /(\/(.+)?)/g +const ReactionMenu = require('../../data/ReactionMenu.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'members', + description: 'Check all members of a certain role! or maybe all!', + category: 'Information', + usage: 'all | role name | @role', + cooldown: 3, + botPermission: ['ADD_REACTIONS'] + }); + } + + async run(message, args) { +let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let prefix = guildDB.prefix + +let role = message.mentions.roles.first() ||message.guild.roles.cache.get(args[0]) || message.guild.roles.cache.find(rl => rl.name.toLowerCase() === args.slice(0).join(' ').toLowerCase()) || message.guild.roles.cache.find(rl => rl.name.toUpperCase() === args.slice(0).join(' ').toUpperCase()) + +let embedValid = new MessageEmbed() +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`${language.members2.replace(/{prefix}/g, `${prefix}`)}`) +.setFooter('https://pogy.xyz') +.setColor(message.guild.me.displayHexColor) + +if(!args[0]) return message.channel.send(embedValid) + +if(args[0].toLowerCase() === 'everyone' || args[0].toLowerCase() === 'all' ) role = message.guild.roles.everyone + +if(!role) return message.channel.send(embedValid) +const memberRole = role + + const members = message.guild.members.cache.filter(m => { + if (m.roles.cache.find(r => r === memberRole)) return true; + }).sort((a, b) => (a.joinedAt > b.joinedAt) ? 1 : -1).array(); + + const embed = new MessageEmbed() + .setTitle(`${capitalize(memberRole.name)} ${language.list} [${members.length}]`) + .setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + + const interval = 25; + if (members.length === 0) message.channel.send(embed.setDescription(`${language.members1.replace('{cap}', `${capitalize(memberRole.name)}`)}`)); + else if (members.length <= interval) { + const range = (members.length == 1) ? '[1]' : `[1 - ${members.length}]`; + message.channel.send(embed + .setTitle(`${capitalize(memberRole.name)} ${language.list} ${range}`) + .setDescription(members.join('\n')) + ); + + // Reaction Menu + } else { + + embed + .setTitle(`${capitalize(memberRole.name)} ${language.list}`) + .setThumbnail(message.guild.iconURL({ dynamic: true })) + .setFooter(message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ); + + new ReactionMenu(message.client, message.channel, message.member, embed, members, interval); + } + } +}; + + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} diff --git a/commands/information/news.js b/commands/information/news.js new file mode 100644 index 00000000..65739b2e --- /dev/null +++ b/commands/information/news.js @@ -0,0 +1,47 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Pogy'); +const Guildd = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require("moment") +moment.suppressDeprecationWarnings = true; + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'news', + description: `Shows Pogy's latest news`, + category: 'Information', + cooldown: 3 + }); + } + + async run(message) { + const client = message.client; + const guildDB = await Guild.findOne({ + tag: '710465231779790849' + }); + + + const guildDB2 = await Guildd.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB2.language}.json`) + + if(!guildDB) return message.channel.send(`${language.noNews}`) + + + + let embed = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setTitle(`Pogy News`) + .setDescription(`***__${language.datePublished}__ ${moment(guildDB.time).format("dddd, MMMM Do YYYY")}*** *__[\`(${moment(guildDB.time).fromNow()})\`](https://pogy.xyz)__*\n\n ${guildDB.news}`) + .setFooter('https://pogy.xyz') + .setTimestamp(); + + message.channel.send(embed).catch(() => { + message.channel.send(`${language.noNews}`) + }); + + } +}; \ No newline at end of file diff --git a/commands/information/permissions.js b/commands/information/permissions.js new file mode 100644 index 00000000..a6859848 --- /dev/null +++ b/commands/information/permissions.js @@ -0,0 +1,50 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require("moment") +const permissions = require('../../assets/json/permissions.json'); +moment.suppressDeprecationWarnings = true; + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'permissions', + aliases: ['perms'], + description: `Shows a user's permissions`, + category: 'Information', + cooldown: 3 + }); + } + + async run(message, args) { + const client = message.client; + + const member = getMemberFromMention(message, args[0]) || + message.guild.members.cache.get(args[0]) || + message.member; + + const memberPermissions = member.permissions.toArray(); + const finalPermissions = []; + for (const permission in permissions) { + if (memberPermissions.includes(permission)) finalPermissions.push(`+ ${permissions[permission]}`); + else finalPermissions.push(`- ${permissions[permission]}`); + } + + const embed = new MessageEmbed() + .setTitle(`${member.displayName}'s Permissions`) + .setDescription(`\`\`\`diff\n${finalPermissions.join('\n')}\`\`\``) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed); + } + +} + +function getMemberFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<@!?(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.members.cache.get(id); + } \ No newline at end of file diff --git a/commands/information/ping.js b/commands/information/ping.js new file mode 100644 index 00000000..7f319196 --- /dev/null +++ b/commands/information/ping.js @@ -0,0 +1,58 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const { oneLine, stripIndent } = require('common-tags'); +const ms = require("parse-ms"); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'ping', + aliases: ['latency'], + description: 'Check\'s Pogy\'s latency', + category: 'Information', + cooldown: 5 + }); + } + + async run(message) { + + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const embed = new MessageEmbed() + .setDescription(`\`${language.pinging}\``) + .setColor(message.guild.me.displayHexColor) + .setFooter(`Shard #${message.guild.shardID}`); + + const msg = await message.channel.send(embed); + +const latency = msg.createdTimestamp - message.createdTimestamp; + +let koko = stripIndent` +**${language.timeTaken}** \`${latency}ms\` +**${language.discordAPI}** \`${Math.round(this.client.ws.ping)}ms\` +` + + +let color = message.guild.me.displayHexColor +if (latency < 100) { + color = `#00ff00` +} else if (latency > 100 && latency < 200){ + color = `#CCCC00` +} else if (latency > 200){ + color = message.client.color.red +} else color = message.guild.me.displayHexColor + + + embed.setDescription(`${koko}`) + embed.setColor(color) + msg.edit(embed); + + + + } +}; \ No newline at end of file diff --git a/commands/information/servericon.js b/commands/information/servericon.js new file mode 100644 index 00000000..c892c71f --- /dev/null +++ b/commands/information/servericon.js @@ -0,0 +1,33 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'servericon', + aliases: ["sicon"], + description: 'Display\'s the current Server Icon', + category: 'Information', + cooldown: 3 + }); + } + + async run(message) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const embed = new MessageEmbed() + .setAuthor(`${message.guild.name}'s Server Icon`, " ", message.guild.iconURL({ dynamic: true, size: 512 })) + .setImage(message.guild.iconURL({ dynamic: true, size: 512 })) + .setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed); + + } +}; \ No newline at end of file diff --git a/commands/information/serverinfo.js b/commands/information/serverinfo.js new file mode 100644 index 00000000..956a9938 --- /dev/null +++ b/commands/information/serverinfo.js @@ -0,0 +1,80 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment') +const Guild = require('../../database/schemas/Guild'); +const filterLevels = { + DISABLED: 'Off', + MEMBERS_WITHOUT_ROLES: 'No Role', + ALL_MEMBERS: 'Everyone' +}; + +const verificationLevels = { + NONE: 'None', + LOW: 'Low', + MEDIUM: 'Medium', + HIGH: 'High', + VERY_HIGH: 'Highest' +}; +function checkDays(date) { + let now = new Date(); + let diff = now.getTime() - date.getTime(); + let days = Math.floor(diff / 86400000); + return days + (days == 1 ? " day" : " days") + " ago"; + }; + let verifLevels = ["None", "Low", "Medium", "(╯°□°)╯︵ ┻━┻", "┻━┻ミヽ(ಠ益ಠ)ノ彡┻━┻"]; + + let region = { + "eu-central": ":flag_eu: Central Europe", + "singapore": ":flag_sg: Singapore", + "us-central": ":flag_us: U.S. Central", + "sydney": ":flag_au: Sydney", + "us-east": ":flag_us: U.S. East", + "us-south": ":flag_us: U.S. South", + "us-west": ":flag_us: U.S. West", + "eu-west": ":flag_eu: Western Europe", + "vip-us-east": ":flag_us: VIP U.S. East", + "london": ":flag_gb: London", + "amsterdam": ":flag_nl: Amsterdam", + "hongkong": ":flag_hk: Hong Kong", + "russia": ":flag_ru: Russia", + "southafrica": ":flag_za: South Africa", + "brazil": ":flag_br: Brazil" +}; + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'serverinfo', + aliases: [ 'server', 'si', 'guildinfo', 'info' ], + description: 'Displays information about the current server.', + category: 'Information', + guildOnly: true, + cooldown: 3 + }); + } + + async run(message) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const embed = new MessageEmbed() + .setFooter(`Shard #${message.guild.shardID}`) +.setAuthor(message.guild.name, message.guild.iconURL) +.addField(`${language.nameS}`, message.guild.name, true) +.addField("ID", message.guild.id, true) +.addField(`${language.owner}`, `${message.guild.owner.user.username}#${message.guild.owner.user.discriminator}`, true) +.addField(`${language.region}`, message.guild.region, true) +.addField(`${language.serverInfo1}`, `${message.guild.members.cache.size} | ${message.guild.members.cache.filter(member => !member.user.bot).size} | ${message.guild.members.cache.filter(member => member.user.bot).size}`, true) +.addField(`${language.verificationLevel}`, message.guild.verificationLevel, true) +.addField(`${language.channels}`, message.guild.channels.cache.size, true) +.addField(`${language.roleCount}`, message.guild.roles.cache.size, true) +.addField(`Created at`, `${message.channel.guild.createdAt.toUTCString().substr(0, 16)} **(${checkDays(message.channel.guild.createdAt)})**`, true) +.setThumbnail(message.guild.iconURL()) +.setColor(message.guild.me.displayHexColor); + message.channel.send({embed}); +} +}; \ No newline at end of file diff --git a/commands/information/shards.js b/commands/information/shards.js new file mode 100644 index 00000000..e17e54a5 --- /dev/null +++ b/commands/information/shards.js @@ -0,0 +1,37 @@ +const Command = require('../../structures/Command'); +const MiscUtils = require('../../utils/MiscUtils'); +const AsciiTable = require('ascii-table'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'shards', + aliases: ['shard'], + description: 'Check\'s stats of a shard', + category: 'Information', + cooldown: 3 + }); + } + + async run(message) { + const table = new AsciiTable() + .setHeading('Shard', 'Servers', 'Users', 'Ping', 'Uptime') + .setAlign(0, AsciiTable.CENTER) + .setAlign(1, AsciiTable.CENTER) + .setAlign(2, AsciiTable.CENTER) + .setAlign(3, AsciiTable.CENTER) + .removeBorder() + + const guildCount = await this.client.shard.fetchClientValues('guilds.cache.size') + const users = await this.client.shard.fetchClientValues('users.cache.size') + const ping = await this.client.shard.fetchClientValues('ws.ping') + + guildCount.forEach((count, shardId) => { + table.addRow(shardId, MiscUtils.formatNumber(count), MiscUtils.formatNumber(users[shardId]), `${MiscUtils.formatNumber(ping[shardId])}ms`) + }) + + + message.channel.send(new MessageEmbed().setFooter(`Shard #${message.guild.shardID}`).setDescription(`\`\`\`${table.toString()}\`\`\``).setColor(message.guild.me.displayHexColor)); + } +}; \ No newline at end of file diff --git a/commands/information/stats.js b/commands/information/stats.js new file mode 100644 index 00000000..20c69039 --- /dev/null +++ b/commands/information/stats.js @@ -0,0 +1,115 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed, version: djsversion } = require('discord.js'); +const { mem, cpu, os } = require('node-os-utils'); +const { oneLine, stripIndent } = require('common-tags'); +const moment = require('moment'); +const ms = require("parse-ms") +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'stats', + aliases: ['s', 'botinfo'], + description: 'Displays Pogy\s Statistics', + category: 'Information', + cooldown: 3 + }); + } + + async run(message, client) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + let uptime = this.client.shard ? await this.client.shard.broadcastEval('this.uptime') : this.client.uptime; + if (uptime instanceof Array) { + uptime = uptime.reduce((max, cur) => Math.max(max, cur), -Infinity); + } + let seconds = uptime / 1000; + let days = parseInt(seconds / 86400); + seconds = seconds % 86400; + let hours = parseInt(seconds / 3600); + seconds = seconds % 3600; + let minutes = parseInt(seconds / 60); + seconds = parseInt(seconds % 60); + + uptime = `${seconds}s`; + if (days) { + uptime = `${days}d ${hours}h ${minutes}m ${seconds}s`; + } + else if (hours) { + uptime = `${hours}h ${minutes}m ${seconds}s`; + } + else if (minutes) { + uptime = `${minutes}m ${seconds}s`; + } + + const shardGuildCounts = await this.client.shard.fetchClientValues('guilds.cache.size') + const totalGuildCount = shardGuildCounts.reduce((total, current) => total + current) + const shardUserCounts = await this.client.shard.fetchClientValues('users.cache.size') + const totalUserCount = shardUserCounts.reduce((total, current) => total + current) + const shardChannelCounts = await this.client.shard.fetchClientValues('users.cache.size') + const totalChannelCount = shardUserCounts.reduce((total, current) => total + current) + + let rss = client.shard ? await client.shard.broadcastEval('process.memoryUsage().rss') : process.memoryUsage().rss; + if (rss instanceof Array) { + rss = rss.reduce((sum, val) => sum + val, 0); + } + let heapUsed = client.shard ? await client.shard.broadcastEval('process.memoryUsage().heapUsed') : process.memoryUsage().heapUsed; + if (heapUsed instanceof Array) { + heapUsed = heapUsed.reduce((sum, val) => sum + val, 0); + } + + const { totalMemMb, usedMemMb } = await mem.info(); + const serverStats = stripIndent` + OS -- ${await os.oos()} + CPU -- ${cpu.model()} + Cores -- ${cpu.count()} + CPU Usage -- ${await cpu.usage()} % + RAM -- ${totalMemMb} MB + RAM Usage -- ${(heapUsed / 1024 / 1024).toFixed(2)} MB + + `; + + + const tech = stripIndent` + Ping -- ${Math.round(message.client.ws.ping)}ms + Uptime -- ${uptime} + ${language.pogyVersion} -- 2.0 + Library -- Discord.js v12.5.1 + Environment -- Node.js v12.18.4 + Servers -- ${totalGuildCount} + ${language.users} -- ${this.client.guilds.cache.reduce((a, b) => a + b.memberCount, 0)} + ${language.channels} -- ${totalChannelCount} + Shards -- ${this.client.shard ? `${this.client.shard.count}` : 'None'} + ${language.pogyCommands} -- ${message.client.commands.size} + Aliases -- ${message.client.aliases.size} + `; + + const devs= stripIndent` + ${language.pogyOwners} + • Peter_#4444 + • W-Legit 🎄#7884 + + ${language.pogyDevelopers} + • Peter_#4444 + • W-Legit 🎄#7884 + + ${language.pogyContributor} + • #2245 + • MKE*FRMDAO#4444 + `; + const embed = new MessageEmbed() + .setAuthor(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${language.pogyInfo}`) + .addField(`${language.pogyGeneral}`, `\`\`\`css\n${tech}\`\`\``, true) + .addField(`${language.pogyTeam}`, `\`\`\`css\n${devs}\`\`\``, true) + .addField(`${language.pogyStats}`, `\`\`\`css\n${serverStats}\`\`\``) + .setFooter(`Shard #${message.guild.shardID}`) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed); + + } +}; \ No newline at end of file diff --git a/commands/information/uptime.js b/commands/information/uptime.js new file mode 100644 index 00000000..55d3b242 --- /dev/null +++ b/commands/information/uptime.js @@ -0,0 +1,60 @@ +const Command = require('../../structures/Command'); +const ms = require('ms') +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'uptime', + aliases: [ 'ut', 'uptime'], + cooldown: 2, + description: 'Sends you Pogy\'s Uptime!', + category: 'Information', + }); + } + + async run(message, client) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let uptime = this.client.shard ? await this.client.shard.broadcastEval('this.uptime') : this.client.uptime; + if (uptime instanceof Array) { + uptime = uptime.reduce((max, cur) => Math.max(max, cur), -Infinity); + } + let seconds = uptime / 1000; + let days = parseInt(seconds / 86400); + seconds = seconds % 86400; + let hours = parseInt(seconds / 3600); + seconds = seconds % 3600; + let minutes = parseInt(seconds / 60); + seconds = parseInt(seconds % 60); + + uptime = `${seconds}s`; + if (days) { + uptime = `${days} days, ${hours} hours, ${minutes} minutes, ${seconds} seconds`; + } + else if (hours) { + uptime = `${hours} hours, ${minutes} minutes and ${seconds} seconds`; + } + else if (minutes) { + uptime = `${minutes} minutes and ${seconds} seconds`; + } + else if (seconds) { + uptime = `${seconds} seconds`; + } + // const date = moment().subtract(days, 'ms').format('dddd, MMMM Do YYYY'); + const embed = new MessageEmbed() + + .setDescription(`${language.uptime1} \`${uptime}\`.`) +.setFooter(`Shard #${message.guild.shardID}`) + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed); + + } +}; \ No newline at end of file diff --git a/commands/information/userinfo.js b/commands/information/userinfo.js new file mode 100644 index 00000000..7d44162d --- /dev/null +++ b/commands/information/userinfo.js @@ -0,0 +1,208 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const User = require('../../database/schemas/User'); +const Nickname = require('../../database/schemas/nicknames'); + +const Usernames = require('../../database/schemas/usernames'); +const moment = require('moment'); +const emojis = require('../../assets/emojis.json'); +const statuses = { + online: `${emojis.online} \`Online\``, + idle: `${emojis.idle} \`AFK\``, + offline: `${emojis.offline} \`Offline\``, + dnd: `${emojis.dnd} \`Do Not Disturb\`` +}; +const flags = { + DISCORD_EMPLOYEE: `${emojis.discord_employee} \`Discord Employee\``, + DISCORD_PARTNER: `${emojis.discord_partner} \`Partnered Server Owner\``, + BUGHUNTER_LEVEL_1: `${emojis.bughunter_level_1} \`Bug Hunter (Level 1)\``, + BUGHUNTER_LEVEL_2: `${emojis.bughunter_level_2} \`Bug Hunter (Level 2)\``, + HYPESQUAD_EVENTS: `${emojis.hypesquad_events} \`HypeSquad Events\``, + HOUSE_BRAVERY: `${emojis.house_bravery} \`House of Bravery\``, + HOUSE_BRILLIANCE: `${emojis.house_brilliance} \`House of Brilliance\``, + HOUSE_BALANCE: `${emojis.house_balance} \`House of Balance\``, + EARLY_SUPPORTER: `${emojis.early_supporter} \`Early Supporter\``, + TEAM_USER: 'Team User', + SYSTEM: 'System', + VERIFIED_BOT: `${emojis.verified_bot} \`Verified Bot\``, + VERIFIED_DEVELOPER: `${emojis.verified_developer} \`Early Verified Bot Developer\`` +}; + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'userinfo', + aliases: ['ui', 'user', 'whois'], + description: 'Displays information about a provided user.', + category: 'Information', + usage: '[user]', + examples: [ 'userinfo', 'userinfo 267386908382855169' ], + guildOnly: true, + cooldown: 3 + }); + } + + async run(message, args) { + const client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + + +let member = message.mentions.members.last() || message.member; + + + if(!member) { + + try { + + member = await message.guild.members.fetch(args[0]) + + } catch { + +member = message.member; + + } + + + + } + + + let userFind = await User.findOne({ + discordId: member.id + }); + + if(!userFind){ + const newUser = new User({ + discordId: member.id + }) + + newUser.save() + userFind = await User.findOne({ + discordId: member.id + }); + + } +let badge; +if(userFind && userFind.badges){ +badge = userFind.badges.join(" ") +if(!badge || !badge.length) badge = `\`None\`` +} else { + badge = `\`None\`` +} + +let usernames = [] + +// user tags +let userName = await Usernames.findOne({ + discordId: member.id +}) +if(!userName){ + +const newUser = new Usernames({ + discordId: member.id +}) + +newUser.save() + + +usernames = `No Tags Tracked`; + +} else { + + +usernames = userName.usernames.join(' - ') +if(!userName.usernames.length) usernames = `No Tags Tracked` + + +} + + + + +let nickname = [] + +// user nicknames +const nicknames = await Nickname.findOne({ +discordId: member.id, +guildId: message.guild.id +}) +if(!nicknames){ + +const newUser = new Nickname({ + discordId: member.id, + guildId: message.guild.id +}) + +newUser.save() + + +nickname = `No Nicknames Tracked` +} else { + + nickname = nicknames.nicknames.join(" - ") + if(!nicknames.nicknames.length) nickname = `No Nicknames Tracked` + +} + + + const userFlags = (await member.user.fetchFlags()).toArray(); + const activities = []; + let customStatus; + for (const activity of member.presence.activities.values()) { + switch (activity.type) { + case 'PLAYING': + activities.push(`Playing **${activity.name}**`); + break; + case 'LISTENING': + if (member.user.bot) activities.push(`Listening to **${activity.name}**`); + else activities.push(`Listening to **${activity.details}** by **${activity.state}**`); + break; + case 'WATCHING': + activities.push(`Watching **${activity.name}**`); + break; + case 'STREAMING': + activities.push(`Streaming **${activity.name}**`); + break; + case 'CUSTOM_STATUS': + customStatus = activity.state; + break; + } + } + + // Trim roles +let rolesNoob; +let roles = member.roles.cache + .sort((a, b) => b.position - a.position) + .map(role => role.toString()) + .slice(0, -1); + +rolesNoob = roles.join(" ") +if(member.roles.cache.size < 1) rolesNoob = "No Roles" + + +if(!member.roles.cache.size || member.roles.cache.size - 1 < 1) roles = `\`None\`` + const embed = new MessageEmbed() + + + .setAuthor(`${member.user.tag}`, member.user.displayAvatarURL({ dynamic : true })) + .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + .setFooter(`ID: ${member.id}`) + .setTimestamp() + .setColor(member.displayHexColor) + .setDescription(`**• ${language.userh}** \`${member.user.username}\` | \`#${member.user.discriminator}\`\n** • ID:** \`${member.id}\`\n**• ${language.joinedDiscord}** \`${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}\`\n**• ${language.joinedServer}** \`${moment(member.joinedAt).format('MMMM Do YYYY, h:mm:ss a')}\`\n**• Roles [${roles.length || '0'}]: ** ${rolesNoob || `\`${language.noRoles}\``}\n\n**• ${language.badgeslmao}** ${userFlags.map(flag => flags[flag]).join('\n') || `\`${language.noBadge}\``}\n**• ${language.botBadges}** ${badge ||`\`None\``}\n**• Last 5 Nicknames:**\n\`\`\`${nickname || `No Nicknames Tracked`}\`\`\`**• Last 5 Tags:**\n\`\`\`${usernames || `No Tags Tracked`}\`\`\` `) + + + + + message.channel.send(embed); + + } +}; \ No newline at end of file diff --git a/commands/moderation/addrole.js b/commands/moderation/addrole.js new file mode 100644 index 00000000..8929081b --- /dev/null +++ b/commands/moderation/addrole.js @@ -0,0 +1,177 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'addrole', + aliases: [ 'addr' ], + description: 'Adds the specified role to the mentioned user', + category: 'Moderation', + usage: '', + examples: [ 'addrole @peter' ], + guildOnly: true, + botPermission: ['MANAGE_ROLES'], + userPermission: ['MANAGE_ROLES'], + + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + +const client = message.client; +const fail = client.emoji.fail; +const success = client.emoji.success; + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + const member = message.mentions.members.first() + || message.guild.members.cache.get(args[0]) + + if (!member) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Invalid User`) + .setDescription(`Please Mention a Valid user mention / user ID`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + if (member.roles.highest.position >= message.member.roles.highest.position) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Role Error`) + .setDescription(`The Provided Role has an equal or higher role than you.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + const role = getRoleFromMention(message, args[1]) || message.guild.roles.cache.get(args[1]) || message.guild.roles.cache.find(rl => rl.name.toLowerCase() === args.slice(1).join(' ').toLowerCase()) + + let reason = `The current Feature doesnt need a reason` + if (!reason) reason = `No Reason Provided`; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + if (!role) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Invalid Role`) + .setDescription(`Please Provide a Valid Role / Role ID`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + else if (member.roles.cache.has(role.id)) // If member already has role + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Role Error`) + .setDescription(`The user already has that role.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + else { + try { + + + await member.roles.add(role, [`Role Add / Responsible User: ${message.author.tag}`]); + const embed = new MessageEmbed() + + .setDescription(`${success} | Added** ${role.name}** to **${member.user.tag}**`) + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + + if(logging){ + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.role == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Add Role\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + + } catch { + return message.channel.send(`Seems like my role is below, please rearrange the roles!`) + } + } + + } +}; + + function getRoleFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<@&(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.roles.cache.get(id); + } \ No newline at end of file diff --git a/commands/moderation/ban.js b/commands/moderation/ban.js new file mode 100644 index 00000000..ffea6562 --- /dev/null +++ b/commands/moderation/ban.js @@ -0,0 +1,256 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const Logging = require('../../database/schemas/logging.js') +const mongoose = require("mongoose") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'ban', + aliases: [ 'b' ], + description: 'Bans the specified user from your Discord server.', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'ban @Peter Breaking the rules!' ], + guildOnly: true, + botPermission: ['BAN_MEMBERS'], + userPermission: ['BAN_MEMBERS'], + }); + } + + async run(message, args) { + + const logging = await Logging.findOne({ guildId: message.guild.id }) + + /*------ Guild Data ------*/ + const client = message.client + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + +const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + +if (!member) { + await client.users.fetch(args[0]) + .then(async u => { + let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + await message.guild.members.ban(u.id, { reason: `${reason} / Responsible user: ${message.author.tag}` }) + + const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | **${u.tag}** ${language.banBan} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green); + +message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + +//LOGGING HERE +if(logging){ + +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Ban\` | ${u.tag} | Case #${logcase}`, u.displayAvatarURL({ format: 'png' })) +.addField('User', u, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${u.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + }) + .catch(err => { +console.log(err) + return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banUserValid}`) +.setColor(client.color.red)); + }) + return +} + + +if (member.id === message.author.id) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banYourselfError}`) +.setColor(client.color.red)); + +if (member.roles.highest.position >= message.member.roles.highest.position) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banHigherRole}`) +.setColor(client.color.red)); + +if (!member.bannable) +return message.channel.send(new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banBannable}`) +.setColor(client.color.red)); + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +await member.ban({ reason: `${reason} / Responsible user: ${message.author.tag}` }).catch(err => message.channel.send(new MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} | An error occured: ${err}`))) + +let dmEmbed; +if(logging && logging.moderation.ban_action && logging.moderation.ban_message.toggle === "false" && logging.moderation.ban_action !== "1"){ + + if(logging.moderation.ban_action === "2"){ +dmEmbed = `${message.client.emoji.fail} You've been banned in **${message.guild.name}**` + } else if(logging.moderation.ban_action === "3"){ +dmEmbed = `${message.client.emoji.fail} You've been banned in **${message.guild.name}**\n\n__**Reason:**__ ${reason}` + } else if(logging.moderation.ban_action === "4"){ +dmEmbed = `${message.client.emoji.fail} You've been banned in **${message.guild.name}**\n\n__**Moderator:**__ ${message.author} **(${message.author.tag})**\n__**Reason:**__ ${reason}` + } + +member.send(new MessageEmbed().setColor(message.client.color.red) +.setDescription(dmEmbed) +).catch(()=>{}) +} + +if(logging && logging.moderation.ban_message.toggle === "true" && logging.moderation.ban_message.message){ + member.send(logging.moderation.ban_message.message.replace(/{user}/g, `${message.author}`) + + + .replace(/{guildName}/g, `${message.guild.name}`) + + .replace(/{reason}/g, `${reason}`) + + .replace(/{userTag}/g, `${message.author.tag}`) + + .replace(/{userUsername}/g, `${message.author.username}`) + + .replace(/{userTag}/g, `${message.author.tag}`) + + .replace(/{userID}/g, `${message.author.id}`) + + .replace(/{guildID}/g, `${message.guild.id}`) + + .replace(/{guild}/g, `${message.guild.name}`) + + .replace(/{memberCount}/g, `${message.guild.memberCount}`)).catch(()=>{}) +} +const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | **${member.user.tag}** ${language.banBan} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green); + + +message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + +// Update mod log +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Ban\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + +}; + +}; \ No newline at end of file diff --git a/commands/moderation/clear.js b/commands/moderation/clear.js new file mode 100644 index 00000000..d497038f --- /dev/null +++ b/commands/moderation/clear.js @@ -0,0 +1,233 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const Logging = require('../../database/schemas/logging.js') +const mongoose = require("mongoose") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'clear', + aliases: [ 'clear', 'c', 'purge'], + description: ' Delete the specified amount of messages', + category: 'Moderation', + usage: 'purge [channel] [user] [reason]', + examples: ['purge 20', 'purge #general 10', 'purge @peter 50', 'purge #general @peter 5'], + guildOnly: true, + botPermission: ['MANAGE_MESSAGES'], + userPermission: ['MANAGE_MESSAGES'], + }); + } + + async run(message, args) { + +try { + + + const logging = await Logging.findOne({ guildId: message.guild.id }) + + /*------ Guild Data ------*/ + const client = message.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + + let channel = getChannelFromMention(message, args[0]) || message.guild.channels.cache.get(args[0]); + if (channel) { + args.shift(); + } else channel = message.channel; + + if (channel.type != 'text' || !channel.viewable) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Clear Error`) + .setDescription(`Please make sure I can view that channel`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + const member = message.mentions.members.first() || getMemberFromMention(message, args[0]) || message.guild.members.cache.get(args[0]); + + if (member) { + args.shift(); + } + + + const amount = parseInt(args[0]); + if (isNaN(amount) === true || !amount || amount < 0 || amount > 100) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Clear Error`) + .setDescription(`I can only purge between 1 - 100 messages.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + if (!channel.permissionsFor(message.guild.me).has(['MANAGE_MESSAGES'])) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Clear Error`) + .setDescription(`Please make sure I have the **Manage Messages** Permission!`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + let reason = args.slice(1).join(' '); + if (!reason) reason = 'None'; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + await message.delete(); + + let messages; + if (member) { + messages = (await channel.messages.fetch({ limit: amount })).filter(m => m.member.id === member.id); + } else messages = amount; + + if (messages.size === 0) { + + message.channel.send( + new MessageEmbed() + .setDescription(` + ${fail} Unable to find any messages from ${member}. + `) + .setColor(message.guild.me.displayHexColor) + ).then(msg => msg.delete({ timeout: 10000 })).catch(()=>{}) + + } else { + + + channel.bulkDelete(messages, true).then(messages => { + const embed = new MessageEmbed() + + .setDescription(` + ${success} Successfully deleted **${messages.size}** message(s) ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``} + `) + + .setColor(message.guild.me.displayHexColor); + + if (member) { + embed + .spliceFields(1, 1, { name: 'Found Messages', value: `\`${messages.size}\``, inline: true}) + .spliceFields(1, 0, { name: 'Member', value: member, inline: true}); + } + + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + }); + } + + + const fields = { + Channel: channel + }; + + if (member) { + fields['Member'] = member; + fields['Messages'] = `\`${messages.size}\``; + } else fields['Message Count'] = `\`${amount}\``; + + + if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.purge == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Purge\` | Case #${logcase}`, message.author.displayAvatarURL({ format: 'png' })) +.addField('Moderator', message.member, true) +.setTimestamp() +.setFooter(`Responsible ID: ${message.author.id}`) +.setColor(color) + +for (const field in fields) { + logEmbed.addField(field, fields[field], true); +} + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + + } + } + } + } +} + +} catch { + return message.channel.send(`${message.client.emoji.fail} | Could not purge messages`) +} + + } +}; + + +function getMemberFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<@!?(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.members.cache.get(id); + } + +function getChannelFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<#(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.channels.cache.get(id); + } \ No newline at end of file diff --git a/commands/moderation/kick.js b/commands/moderation/kick.js new file mode 100644 index 00000000..c2718c54 --- /dev/null +++ b/commands/moderation/kick.js @@ -0,0 +1,157 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'kick', + aliases: [ 'k' ], + description: 'Kicks the specified user from your Discord server.', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'kick @Peter Breaking the rules' ], + guildOnly: true, + botPermission: ['KICK_MEMBERS'], + userPermission: ['KICK_MEMBERS'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + +const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + +if (!member) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banUserValid}`) +.setColor(client.color.red)); + +if (member.id === message.author.id) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.kickYourself}`) +.setColor(client.color.red)); + +if (member.roles.highest.position >= message.member.roles.highest.position) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.banHigherRole}`) +.setColor(client.color.red)); + +if (!member.kickable) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.kickKickable}`) +.setColor(client.color.red)); + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +await member.kick(`${reason} / Responsible user: ${message.author.tag}`).catch(err => message.channel.send(new MessageEmbed().setColor(client.color.red).setDescription(`${client.emoji.fail} | An error occured: ${err}`))) + +const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | **${member.user.tag}** ${language.kickKick} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green); + +message.channel.send(embed) + + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); +let dmEmbed; +if(logging && logging.moderation.kick_action && logging.moderation.kick_action !== "1"){ + + if(logging.moderation.kick_action === "2"){ +dmEmbed = `${message.client.emoji.fail} You've been kicked in **${message.guild.name}**` + } else if(logging.moderation.kick_action === "3"){ +dmEmbed = `${message.client.emoji.fail} You've been kicked in **${message.guild.name}**\n\n__**Reason:**__ ${reason}` + } else if(logging.moderation.kick_action === "4"){ +dmEmbed = `${message.client.emoji.fail} You've been kicked in **${message.guild.name}**\n\n__**Moderator:**__ ${message.author} **(${message.author.tag})**\n__**Reason:**__ ${reason}` + } + +member.send(new MessageEmbed().setColor(message.client.color.red) +.setDescription(dmEmbed) +).catch(()=>{}) +} + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.kick == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Kick\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } +}; \ No newline at end of file diff --git a/commands/moderation/lock.js b/commands/moderation/lock.js new file mode 100644 index 00000000..65da7c19 --- /dev/null +++ b/commands/moderation/lock.js @@ -0,0 +1,166 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'lock', + aliases: [ 'lc' ], + description: 'Locks the current / mentioned channel.', + category: 'Moderation', + usage: ' [time]', + examples: [ 'lock #general' ], + guildOnly: true, + botPermission: ['MANAGE_CHANNELS'], + userPermission: ['MANAGE_CHANNELS'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client + const fail = message.client.emoji.fail + const success = message.client.emoji.success + + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + + + let channel = message.mentions.channels.first(); + let reason = args.join(" ") || '`none`' + +let member = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'member'); +let memberr = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'members'); +let verified = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'verified'); + if(channel) { + reason = args.join(" ").slice(22) || '`none`' + } else ( + channel = message.channel + ) + + if(channel.permissionsFor(message.guild.id).has('SEND_MESSAGES') === false) { + const lockchannelError2 = new MessageEmbed() + .setDescription(`${fail} | ${channel} is already locked`) + .setColor(client.color.red) + + return message.channel.send(lockchannelError2) + } + + channel.updateOverwrite(message.guild.me, { SEND_MESSAGES: true }).catch(()=>{}) + + channel.updateOverwrite(message.guild.id, { SEND_MESSAGES: false }).catch(()=>{}) + + channel.updateOverwrite(message.author.id, { SEND_MESSAGES: true }).catch(()=>{}) + + if(member){ + channel.updateOverwrite(member, { SEND_MESSAGES: false }).catch(()=>{}) + } + + if(memberr){ + channel.updateOverwrite(memberr, { SEND_MESSAGES: false }).catch(()=>{}) + } + + if(verified){ + channel.updateOverwrite(verified, { SEND_MESSAGES: false }).catch(()=>{}) + + } + + + const embed = new MessageEmbed() + .setDescription(`${success} | successfully Locked **${channel}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(client.color.green) + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + + + +if(logging){ +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.lock == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Lock\` | ${message.author.tag} | Case #${logcase}`, message.author.displayAvatarURL({ format: 'png' })) +.addField('Channel', channel, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${message.author.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } catch (err) { + + message.channel.send(`Error, Please try again later`) + } + +}; \ No newline at end of file diff --git a/commands/moderation/mute.js b/commands/moderation/mute.js new file mode 100644 index 00000000..ca8c4e8f --- /dev/null +++ b/commands/moderation/mute.js @@ -0,0 +1,279 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const ms = require("ms") +const muteModel = require("../../models/mute.js") +const Discord = require("discord.js"); +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'mute', + aliases: [ 'm','tempmute' ], + description: 'Mute the specified user from the guild', + category: 'Moderation', + usage: ' [time]', + examples: [ 'mute @Peter 1h Stop spamming' ], + guildOnly: true, + botPermission: ['MANAGE_ROLES', 'MANAGE_CHANNELS'], + userPermission: ['MANAGE_ROLES'], + + }); + } + + async run(message, args) { + let client = message.client + const settings = await Guild.findOne({ + guildId: message.guild.id + }, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } + }); + const logging = await Logging.findOne({ guildId: message.guild.id }) + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + const mentionedMember = message.mentions.members.first() + || message.guild.members.cache.get(args[0]) + + const msRegex = RegExp(/(\d+(s|m|h|w))/) + let muteRole = await message.guild.roles.cache.get(logging.moderation.mute_role); + + if (!mentionedMember) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.banUserValid}`) + .setColor(client.color.red)) + } + else if (!msRegex.test(args[1])) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.muteTime}`) + .setColor(client.color.red)) + } + + if (!muteRole) { + muteRole = await message.guild.roles.create({ + data: { + name: 'Muted', + color: 'BLACK', + } + }).catch(()=>{}) + + logging.moderation.mute_role = muteRole.id; + await logging.save().catch(()=>{}) + } + + if (mentionedMember.roles.highest.position >= message.guild.me.roles.highest.position) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.muteRolePosition}`) + .setColor(client.color.red)) + } + else if (muteRole.position >= message.guild.me.roles.highest.position) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.muteRolePositionBot}`) + .setColor(client.color.red)) + } + + const isMuted = await muteModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.user.id, + }) + + if (isMuted) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.muteMuted}`) + .setColor(client.color.red)) + } +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + let dmEmbed; +if(logging && logging.moderation.mute_action && logging.moderation.mute_action !== "1"){ + + if(logging.moderation.mute_action === "2"){ +dmEmbed = `${message.client.emoji.fail} You've been muted in **${message.guild.name}** for **${msRegex.exec(args[1])[1]}**` + } else if(logging.moderation.mute_action === "3"){ +dmEmbed = `${message.client.emoji.fail} You've been muted in **${message.guild.name} ** for **${msRegex.exec(args[1])[1]}**\n\n__**Reason:**__ ${reason}` + } else if(logging.moderation.mute_action === "4"){ +dmEmbed = `${message.client.emoji.fail} You've been muted in **${message.guild.name}** for **${msRegex.exec(args[1])[1]}**\n\n__**Moderator:**__ ${message.author} **(${message.author.tag})**\n__**Reason:**__ ${reason}` + } + +mentionedMember.send(new MessageEmbed().setColor(message.client.color.red) +.setDescription(dmEmbed) +).catch(()=>{}) +} + message.channel.send(new Discord.MessageEmbed().setColor(message.client.color.green).setDescription(`${message.client.emoji.success} | Muted **${mentionedMember.user.tag}** for **${msRegex.exec(args[1])[1]}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`)).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + for (const channel of message.guild.channels.cache) { + channel[1].updateOverwrite(muteRole, { + SEND_MESSAGES: false, + CONNECT: false, + }).catch(()=>{}) + } + + const noEveryone = mentionedMember.roles.cache.filter(r => r.name !== '@everyone' && !r.managed && r.id !== muteRole.id) + + let delaynumber = 750; + if(mentionedMember.roles.cache.size - 1 > 10) delaynumber = 3000; + + if(logging && logging.moderation.remove_roles === "true"){ + for (const role of noEveryone) { + + await mentionedMember.roles.remove(role, [`Reason: Mute Command - ${reason} | Responsible User: ${message.author.tag}`]).catch(()=>{}) + await delay(delaynumber); + + + } + } + + await mentionedMember.roles.add(muteRole.id, [`Mute Command - ${reason} / Responsible User: ${message.author.tag}`]).catch(()=>{}) + + const muteDoc = new muteModel({ + guildID: message.guild.id, + memberID: mentionedMember.user.id, + length: Date.now() + ms(msRegex.exec(args[1])[1]), + memberRoles: noEveryone.map(r => r) + }) + + await muteDoc.save().catch(()=>{}) + + + + if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.mute == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Mute\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.addField('Length', msRegex.exec(args[1])[1], true) +.setFooter(`ID: ${mentionedMember.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + setTimeout(async () => { + const isMuted = await muteModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.user.id, + }) + + + let muteRole = await message.guild.roles.cache.get(logging.moderation.mute_role); + + + await mentionedMember.roles.remove(muteRole.id, [`Mute Command / Responsible User: ${message.author.tag}`]).catch(()=>{}) + + + if(logging && logging.moderation.remove_roles === "true"){ + for (const role of isMuted.memberRoles) { + const roleM = await message.guild.roles.cache.get(role); +if(roleM){ + await mentionedMember.roles.add(roleM, ["Mute Command, mute duration expired."]).catch(()=>{}) + await delay(750); +} + + } + } + + await isMuted.deleteOne().catch(()=>{}) + + + + + + if(logging){ + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)) { + +if(logging.moderation.mute == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbedm = new MessageEmbed() +.setAuthor(`Action: \`Un Mute\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Reason', 'Mute Duration Expired', true) +.setFooter(`ID: ${mentionedMember.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbedm).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + }, ms(msRegex.exec(args[1])[1])) + } +}; +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/commands/moderation/removerole.js b/commands/moderation/removerole.js new file mode 100644 index 00000000..4522ba83 --- /dev/null +++ b/commands/moderation/removerole.js @@ -0,0 +1,177 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'removerole', + aliases: [ 'remrole' ], + description: 'Removes the specified role from the mentioned user', + category: 'Moderation', + usage: '', + examples: [ 'removerole @peter' ], + guildOnly: true, + botPermission: ['MANAGE_ROLES'], + userPermission: ['MANAGE_ROLES'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client; +const fail = client.emoji.fail; +const success = client.emoji.success; + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + + const member = message.mentions.members.first() + || message.guild.members.cache.get(args[0]) + + if (!member) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Remove Role Error`) + .setDescription('Please provide a valid role') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + if (member.roles.highest.position >= message.member.roles.highest.position) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Remove Role Error`) + .setDescription('The Provided user has an equal or higher role.') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + const role = getRoleFromMention(message, args[1]) || message.guild.roles.cache.get(args[1]) || message.guild.roles.cache.find(rl => rl.name.toLowerCase() === args.slice(1).join(' ').toLowerCase()); + + let reason = `The current feature doesn't need reasons` + if (!reason) reason = 'No Reason Provided'; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + if (!role) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Remove Role Error`) + .setDescription('Please provide a valid role') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + else if (!member.roles.cache.has(role.id)) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Remove Role Error`) + .setDescription(`The provided user does not have the role.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + else { + try { + + await member.roles.remove(role, [`Role Remove / Responsible User: ${message.author.tag}`]); + const embed = new MessageEmbed() + + .setDescription(` ${success} | Removed **${role.name}** from **${member.user.tag}**`) + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.role == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.c; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Remove Role\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + } catch (err) { + + message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Remove Role Error`) + .setDescription(`Unable to remove the User's Role, please check the role hiarchy and make sure My role is above the provided user.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + } + } + } +}; + function getRoleFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<@&(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.roles.cache.get(id); + } \ No newline at end of file diff --git a/commands/moderation/removewarn.js b/commands/moderation/removewarn.js new file mode 100644 index 00000000..898dee18 --- /dev/null +++ b/commands/moderation/removewarn.js @@ -0,0 +1,191 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const warnModel = require("../../models/moderation.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') +const discord = require("discord.js") +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'removewarn', + aliases: [ 'rw', 'removewarns'], + description: 'Remove a certain users warn', + category: 'Moderation', + usage: ' [ID]', + examples: [ 'rw @peter iasdjas' ], + guildOnly: true, + userPermission: ['MANAGE_ROLES'], + }); + } + + async run(message, args) { +let client = message.client + +const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + +const mentionedMember = message.mentions.members.first() +|| message.guild.members.cache.get(args[0]) + + + + if (!mentionedMember) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.banUserValid}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} + +const mentionedPotision = mentionedMember.roles.highest.position +const memberPotision = message.member.roles.highest.position + +if (memberPotision <= mentionedPotision) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmPosition}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} + +let reason = args.slice(2).join(' '); +if (!reason) reason = language.softbanNoReason; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const warnDoc = await warnModel.findOne({ +guildID: message.guild.id, +memberID: mentionedMember.id, +}).catch(err => console.log(err)) + +if (!warnDoc || !warnDoc.warnings.length) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmNoWarning}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} + +let warningID = args[1] +if(!warningID) return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid} `) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + +let check = warnDoc.warningID.filter(word => args[1] === word); + +if(!warnDoc.warningID.includes(warningID)) return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid} `) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + +if(!check) return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid} `) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + +if (check.length < 0) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid} `) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} +let toReset = warnDoc.warningID.length + +//warnDoc.memberID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +//warnDoc.guildID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +warnDoc.warnings.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +warnDoc.warningID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +warnDoc.modType.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +warnDoc.moderator.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) +warnDoc.date.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) + + + +await warnDoc.save().catch(err => console.log(err)) + +const removeEmbed = new discord.MessageEmbed() +.setDescription(`${message.client.emoji.success} | Cleared Warn **#${warningID}** from **${mentionedMember.user.tag}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(message.client.color.green) + +message.channel.send(removeEmbed) +.then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.warns == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Remove Warn\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${mentionedMember.id} | Warn ID: ${warningID}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } +}; \ No newline at end of file diff --git a/commands/moderation/resetwarn.js b/commands/moderation/resetwarn.js new file mode 100644 index 00000000..87fd32ca --- /dev/null +++ b/commands/moderation/resetwarn.js @@ -0,0 +1,157 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const warnModel = require("../../models/moderation.js") +const mongoose = require("mongoose") +const discord = require("discord.js") +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'resetwarn', + aliases: [ 'clearwarn', 'resetwarns','clearwarns','cw'], + description: 'Clear all the users warns', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'kick @Peter Breaking the rules' ], + guildOnly: true, + userPermission: ['MANAGE_ROLES'], + }); + } + + async run(message, args) { +let client = message.client +/*------ Guild Data ------*/ + +const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + const logging = await Logging.findOne({ guildId: message.guild.id }) + +const mentionedMember = message.mentions.members.first() +|| message.guild.members.cache.get(args[0]) + + + if (!mentionedMember) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.banUserValid}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} + +const mentionedPotision = mentionedMember.roles.highest.position +const memberPotision = message.member.roles.highest.position + +if (memberPotision <= mentionedPotision) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmPosition}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} + +let reason = args.slice(1).join(' '); +if (!reason) reason = language.softbanNoReason; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const warnDoc = await warnModel.findOne({ +guildID: message.guild.id, +memberID: mentionedMember.id, +}).catch(err => console.log(err)) + +if (!warnDoc || !warnDoc.warnings.length) { +return message.channel.send(new discord.MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${client.emoji.fail} | ${language.rmNoWarning}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) +} +await warnDoc.updateOne({ +modType: [], +warnings: [], +warningID: [], +moderator: [], +date: [], +}) + +const removeEmbed = new discord.MessageEmbed() +.setDescription(`${message.client.emoji.success} | Cleared all Warn of **${mentionedMember.user.tag}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(message.client.color.green) + +message.channel.send(removeEmbed) +.then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ +if(logging.moderation.warns == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.yellow; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Clear Warn\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${mentionedMember.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + } +}; \ No newline at end of file diff --git a/commands/moderation/setnickname.js b/commands/moderation/setnickname.js new file mode 100644 index 00000000..0865efb9 --- /dev/null +++ b/commands/moderation/setnickname.js @@ -0,0 +1,219 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'setnickname', + aliases: [ 'nickname', 'nick', 'nn' ], + description: "Changes the provided user's nickname to the one specified.", + category: 'Moderation', + usage: ' [reason]', + examples: [ 'setnickname @peter Pogger', 'setnickname @peter "this is a nickname" ' ], + guildOnly: true, + botPermission: ['SEND_MESSAGES', 'EMBED_LINKS', 'MANAGE_NICKNAMES'], + userPermission: ['MANAGE_NICKNAMES'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client + const fail = client.emoji.fail + const success = client.emoji.success + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + const member = getMemberFromMention(message, args[0]) || message.guild.members.cache.get(args[0]); + + if (!member) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription('Please provide a valid user mention / user ID') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + if (member.roles.highest.position >= message.member.roles.highest.position && member != message.member) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription('The provided user has either an equal or higher role.') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + if (!args[1]) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription('Please provide a new Nickname') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + let nickname = args[1]; + if (nickname.startsWith('"')) { + nickname = message.content.slice(message.content.indexOf(args[1]) + 1); + if (!nickname.includes('"')) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription(`Make sure the nickname is surrounded in Quotes, **"text"**`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + nickname = nickname.slice(0, nickname.indexOf('"')); + if (!nickname.replace(/\s/g, '').length) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription('Provide a Nickname') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + } + + if (nickname.length > 32) { + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription('Make sure that nickname is below 32 characters') + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + } else { + + let reason; + if (args[1].startsWith('"')) + reason = message.content.slice(message.content.indexOf(nickname) + nickname.length + 1); + else reason = message.content.slice(message.content.indexOf(nickname) + nickname.length); + if (!reason) reason = 'No reason Provided'; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + try { + + + const oldNickname = member.nickname || 'None'; + const nicknameStatus = `${oldNickname} ➔ ${nickname}`; + await member.setNickname(nickname); + const embed = new MessageEmbed() + + .setDescription(`${success} | **${oldNickname}**'s nickname was set to **${nickname}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + +if(logging){ +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.nicknames == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.yellow; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + + let reason; + +if (args[1].startsWith('"')) { + reason = message.content.slice(message.content.indexOf(nickname) + nickname.length + 1); +} else { + reason = message.content.slice(message.content.indexOf(nickname) + nickname.length); + +} +if (!reason) reason = 'No reason Provided'; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`set Nickname\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } catch (err) { + message.client.logger.error(err.stack); + message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Set Nickname Error`) + .setDescription(`Please ensure my role is above the provided user's role.`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + } + } + + + + } + + +}; function getMemberFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<@!?(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.members.cache.get(id); + } \ No newline at end of file diff --git a/commands/moderation/slowmode.js b/commands/moderation/slowmode.js new file mode 100644 index 00000000..3061a222 --- /dev/null +++ b/commands/moderation/slowmode.js @@ -0,0 +1,202 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'slowmode', + aliases: [ 'sm' ], + description: 'Enables slowmode in a channel with the specified rate', + category: 'Moderation', + usage: 'slowmode [channel mention/ID] [reason]', + examples: [ 'slowmode #general 10' ], + guildOnly: true, + botPermission: ['SEND_MESSAGES', 'EMBED_LINKS', 'MANAGE_CHANNELS'], + userPermission: ['MANAGE_CHANNELS'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client; + const fail = client.emoji.fail + const success = client.emoji.success; + + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + let index = 1; + let channel = getChannelFromMention(message, args[0]) || message.guild.channels.cache.get(args[0]); + if (!channel) { + channel = message.channel; + index--; + } + + if (channel.type != 'text' || !channel.viewable) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Slow Mode Error`) + .setDescription(`I can't view the provided channel`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + const rate = args[index]; + if (!rate || rate < 0 || rate > 59) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Slow Mode Error`) + .setDescription(` Please provide a rate limit between 0 and 59 seconds`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + + const number = parseInt(rate); + if(isNaN(number)){ + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Slow Mode Error`) + .setDescription(` Please provide a rate limit between 0 and 59 seconds`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + }; + + + + if (!channel.permissionsFor(message.guild.me).has(['MANAGE_CHANNELS'])) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Slow Mode Error`) + .setDescription(` Please make sure I have the **Manage Channels** Permission`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + let reason = args.slice(index + 1).join(' '); + if (!reason) reason = 'No Reason was Provided'; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + + await channel.setRateLimitPerUser(rate, reason); // set channel rate + const status = (channel.rateLimitPerUser) ? 'enabled' : 'disabled'; + const embed = new MessageEmbed() + .setTitle('Slowmode') + .setFooter(`To disable set the rate to 0`) + .setTimestamp() + .setColor('GREEN'); + + if (rate === '0') { + message.channel.send(new MessageEmbed() + .setDescription(`${success} Slow Mode was successfuly disabled${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(message.guild.me.displayHexColor) + ).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + + } else { + + message.channel.send(new MessageEmbed() + .setDescription(`${success} | Slow Mode was successfuly enabled to **1 msg /${rate}s** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(message.guild.me.displayHexColor) + ).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + } + + + +if(logging){ +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.slowmode == "true"){ + if(channel){ + + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.kick == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.yellow; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Slow Mode\` | ${message.author.tag} | Case #${logcase}`, message.author.displayAvatarURL({ format: 'png' })) +.addField('User', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${message.author.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } +}; + + + function getChannelFromMention(message, mention) { + if (!mention) return; + const matches = mention.match(/^<#(\d+)>$/); + if (!matches) return; + const id = matches[1]; + return message.guild.channels.cache.get(id); + } diff --git a/commands/moderation/softban.js b/commands/moderation/softban.js new file mode 100644 index 00000000..a0b51d0c --- /dev/null +++ b/commands/moderation/softban.js @@ -0,0 +1,146 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") + const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'softban', + aliases: [ 'sb', 'sban'], + description: 'Softban the specified user from the guild', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'softban @Peter Breaking the rules' ], + guildOnly: true, + botPermission: ['BAN_MEMBERS'], + userPermission: ['BAN_MEMBERS'], + }); + } + + async run(message, args) { +let client = message.client +/*------ Guild Data ------*/ + const logging = await Logging.findOne({ guildId: message.guild.id }) +const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + +const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]); + +if (!member) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.softbanNoUser}`) +.setColor(client.color.red)); + +if (member === message.member) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.softbanSelfUser}`) +.setColor(client.color.red)); + +if (member.roles.highest.position >= message.member.roles.highest.position) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.softbanEqualRole}`) +.setColor(client.color.red)); + +if (!member.bannable) +return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.softbanNotBannable}`) +.setColor(client.color.red)); + +let reason = args.slice(1).join(' '); +if (!reason) reason = language.softbanNoReason; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +await member.ban({ reason:`${reason} / ${language.softbanResponsible}: ${message.author.tag}`, days: 7 }); +await message.guild.members.unban(member.user, `${reason} / ${language.softbanResponsible}: ${message.author.tag}`); + +const embed = new MessageEmbed() + +.setDescription(`${client.emoji.success} | ${language.softbanSuccess} **${member.user.tag}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green) + +message.channel.send(embed) +.then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + +// Update mod log +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Soft Ban\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + + } +}; \ No newline at end of file diff --git a/commands/moderation/unban.js b/commands/moderation/unban.js new file mode 100644 index 00000000..bce41a6f --- /dev/null +++ b/commands/moderation/unban.js @@ -0,0 +1,325 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Discord = require("discord.js") + +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'unban', + aliases: [ 'ub', 'uban'], + description: 'unban the specified user from the guild', + category: 'Moderation', + usage: '', + examples: [ 'unban 710465231779790849' ], + guildOnly: true, + botPermission: ['BAN_MEMBERS'], + userPermission: ['BAN_MEMBERS'], + }); + } + + async run(message, args) { +let client = message.client + +/*------ Guild Data ------*/ + const logging = await Logging.findOne({ guildId: message.guild.id }) +const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + +const rgx = /^(?:<@!?)?(\d+)>?$/; + + + + + +const id = args[0]; +if(!id) { + +const embed = new MessageEmbed() +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`**Proper Usage:**\n\n\`1-\` unban peter_#4444 appealed\n\`2-\` unban 710465231779790849 appealed\n\`3-\` unban all`) +.setColor(message.client.color.red) +.setFooter('https://pogy.xyz') + +message.channel.send(embed) + return +} + +if(id.toString().toLowerCase() == "all"){ + const bannedUsers = await message.guild.fetchBans(); + const users = await message.guild.fetchBans(); + const array = []; + +let reason = `Unban All` + + + for (const user of users.array()) { + await message.guild.members.unban(user.user, `${reason} / ${language.unbanResponsible}: ${message.author.tag}`); + array.push(user.user.tag) + } + +if(!array || !array.length){ +const embed = new MessageEmbed() +.setDescription(`${client.emoji.fail} | The current guild has no banned users.`) +.setColor(client.color.green) + +message.channel.send(embed).catch(()=>{}) +} else { +const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | ${language.unbanSuccess} **${array.length}** Users from the guild. \n\n**Users:**\n${array.join(" - ")} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green) + +message.channel.send(embed) +.then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); +} + + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.yellow; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let bannedUsersLength = `${array.length} users` +if(!array || !array.length) bannedUsersLength = 'No users' +if(array.length === 1) bannedUsersLength = '1 User' +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`UnBan All\` | ${bannedUsersLength} | Case #${logcase}`, message.author.displayAvatarURL({ format: 'png' })) +.addField('Unbanned Users', `${bannedUsersLength}`, true) +.addField('Moderator', message.member, true) +.setTimestamp() +.setColor(color) + +if(array.length) logEmbed.addField('**Users:**', array.join(" - ")) +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + +} else { + + +if (!rgx.test(id)) { + +let members = client.users.cache.filter(user => user.tag === args[0]).map(user => user.id).toString(); + + +const bannedUsers1 = await message.guild.fetchBans(); +const user1 = bannedUsers1.get(members); + + + +if(user1){ +let reason = args.slice(1).join(' '); +if (!reason) reason = language.unbanNoReason; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const userrz = bannedUsers1.get(members).user; +if(userrz){ +const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | ${language.unbanSuccess} ${userrz.tag} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green) + +message.channel.send(embed).catch(()=>{}) +await message.guild.members.unban(userrz, `${reason} / ${language.unbanResponsible}: ${message.author.tag}`).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + +//log +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)) { + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.guild.me.displayHexColor; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`UnBan\` | ${userrz.tag} | Case #${logcase}`, userrz.displayAvatarURL({ format: 'png' })) +.addField('User', userrz, true) +.addField('Moderator', message.member, true) +.setFooter(`ID: ${userrz.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} +} else { + +message.channel.send(new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.unbanInvalidID}`) +.setColor(client.color.red)); + +} + + +} else { + + +message.channel.send(new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.unbanInvalidID}`) +.setColor(client.color.red)); + +} + + + return; +} + +const bannedUsers = await message.guild.fetchBans(); +const user = bannedUsers.get(id); +if (!user) return message.channel.send( new MessageEmbed() +.setDescription(`${client.emoji.fail} | ${language.unbanInvalidID}`) +.setColor(client.color.red)); + +let reason = args.slice(1).join(' '); +if (!reason) reason = language.unbanNoReason; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const userr = bannedUsers.get(id).user; +await message.guild.members.unban(user.user, `${reason} / ${language.unbanResponsible}: ${message.author.tag}`); + +const embed = new MessageEmbed() +.setDescription(`${client.emoji.success} | ${language.unbanSuccess} ${userr.tag} ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) +.setColor(client.color.green) + +message.channel.send(embed).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)) { + +if(logging.moderation.ban == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.guild.me.displayHexColor; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`UnBan\` | ${userr.tag} | Case #${logcase}`, userr.displayAvatarURL({ format: 'png' })) +.addField('User', userr, true) +.addField('Moderator', message.member, true) +.setFooter(`ID: ${userr.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + } + + } +}; \ No newline at end of file diff --git a/commands/moderation/unlock.js b/commands/moderation/unlock.js new file mode 100644 index 00000000..e7433d2c --- /dev/null +++ b/commands/moderation/unlock.js @@ -0,0 +1,164 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose") +const Logging = require('../../database/schemas/logging.js') + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'unlock', + aliases: [ 'unlc' ], + description: 'unLocks the current / mentioned channel.', + category: 'Moderation', + usage: ' [time]', + examples: [ 'unlock #general' ], + guildOnly: true, + botPermission: ['MANAGE_CHANNELS'], + userPermission: ['MANAGE_CHANNELS'], + }); + } + + async run(message, args) { + /*------ Guild Data ------*/ + const client = message.client + const fail = message.client.emoji.fail + const success = message.client.emoji.success + + + const settings = await Guild.findOne({ + guildId: message.guild.id +}, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } +}); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ +guildId: message.guild.id +}); +const language = require(`../../data/language/${guildDB.language}.json`) + + + + + let channel = message.mentions.channels.first(); + let reason = args.join(" ") || '`none`' + +let member = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'member'); +let memberr = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'members'); +let verified = message.guild.roles.cache.find(r => r.name.toLowerCase() === 'verified'); + if(channel) { + reason = args.join(" ").slice(22) || '`none`' + } else ( + channel = message.channel + ) + + if(channel.permissionsFor(message.guild.id).has('SEND_MESSAGES') === true) { + const lockchannelError2 = new MessageEmbed() + .setDescription(`${fail} | ${channel} is already unlocked`) + .setColor(client.color.red) + + return message.channel.send(lockchannelError2) + } + + channel.updateOverwrite(message.guild.me, { SEND_MESSAGES: true }).catch(()=>{}) + + channel.updateOverwrite(message.guild.id, { SEND_MESSAGES: true }).catch(()=>{}) + + channel.updateOverwrite(message.author.id, { SEND_MESSAGES: true }).catch(()=>{}) + + if(member){ + channel.updateOverwrite(member, { SEND_MESSAGES: true }).catch(()=>{}) + } + + if(memberr){ + channel.updateOverwrite(memberr, { SEND_MESSAGES: true }).catch(()=>{}) + } + + if(verified){ + channel.updateOverwrite(verified, { SEND_MESSAGES: true }).catch(()=>{}) + + } + + + const embed = new MessageEmbed() + .setDescription(`${success} | successfully Unlocked **${channel}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(client.color.green) + message.channel.send(embed).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + + + +if(logging){ +if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.lock == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +let reason = args.slice(1).join(' '); +if (!reason) reason = `${language.noReasonProvided}`; +if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`UnLock\` | ${message.author.tag} | Case #${logcase}`, message.author.displayAvatarURL({ format: 'png' })) +.addField('Channel', channel, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${message.author.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + } catch (err) { + + message.channel.send(`Error, Please try again later`) + } + +}; \ No newline at end of file diff --git a/commands/moderation/unmute.js b/commands/moderation/unmute.js new file mode 100644 index 00000000..c4193132 --- /dev/null +++ b/commands/moderation/unmute.js @@ -0,0 +1,171 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require("../../models/economy.js") +const mongoose = require("mongoose"); +const ms = require("ms") +const muteModel = require('../../models/mute'); +const Discord = require("discord.js") +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'unmute', + aliases: [ 'unm','um' ], + description: 'UnMute the specified user from the guild', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'unmute @Peter ' ], + guildOnly: true, + botPermission: ['MANAGE_ROLES'], + userPermission: ['MANAGE_ROLES'], + }); + } + + async run(message, args) { + let client = message.client + const settings = await Guild.findOne({ + guildId: message.guild.id + }, (err, guild) => { + if (err) console.error(err) + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: "english" + }) + + newGuild.save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel.send('This server was not in our database! We have added it, please retype this command.').then(m => m.delete({timeout: 10000})); + } + }); + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + const logging = await Logging.findOne({ guildId: message.guild.id }) + const mentionedMember = message.mentions.members.first() + || message.guild.members.cache.get(args[0]) + +const muteRole = message.guild.roles.cache.find(r => r.name == 'Muted') + + if (!mentionedMember) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.unmuteNoUser}`) + .setColor(client.color.red)) +} +else if (!muteRole) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.unmuteNoMutedRole}`) + .setColor(client.color.red)) +} + +const muteDoc = await muteModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.user.id, +}) + +if (!muteDoc) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.unmuteNotMuted}`) + .setColor(client.color.red)) +} +else if (mentionedMember.roles.highest.potision >= message.guild.me.roles.highest.potision) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.unmuteUserRoleHigher}`) + .setColor(client.color.red)) +} +else if (muteRole.potision >= message.guild.me.roles.highest.potision) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.unmuteRolePosition}`) + .setColor(client.color.red)) +} + +mentionedMember.roles.remove(muteRole.id, [`UnMute Command / Responsible User: ${message.author.tag}`]).catch(()=>{}) + +/*for (const role of muteDoc.memberRoles) { + mentionedMember.roles.add(role).catch(err => console.log(err)) +}*/ +let delaynumber = 2000; + if(muteDoc.memberRoles.length > 10) delaynumber = 4000; + if(muteDoc.memberRoles.length > 20) delaynumber = 8000; + if(muteDoc.memberRoles.length > 30) delaynumber = 10000; + if(muteDoc.memberRoles.length > 40) delaynumber = 12000; + + if(logging && logging.moderation.remove_roles === "true"){ + for (const role of muteDoc.memberRoles) { + const roleM = await message.guild.roles.cache.get(role); +if(roleM){ + await mentionedMember.roles.add(roleM, [`Unmute Command / Responsible user: ${message.author.tag}`]).catch(()=>{}) + + await delay(delaynumber); +} + + } + } + +await muteDoc.deleteOne() + +const reason = args.slice(1).join(' ') || language.unbanNoReason + + message.channel.send(new Discord.MessageEmbed().setColor(message.client.color.green).setDescription(`${message.client.emoji.success} | Unmuted **${mentionedMember.user.tag}** ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`)).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.mute == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`UnMute\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.setFooter(`ID: ${mentionedMember.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + } +}; + + function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/commands/moderation/warn.js b/commands/moderation/warn.js new file mode 100644 index 00000000..d88d3de3 --- /dev/null +++ b/commands/moderation/warn.js @@ -0,0 +1,249 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const warnModel = require('../../models/moderation.js'); +const mongoose = require('mongoose'); +const Discord = require("discord.js") +const randoStrings = require("randostrings") +const random = new randoStrings +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'warn', + aliases: ['w'], + description: 'Gives a warning to the specified user from your Discord server.', + category: 'Moderation', + usage: ' [reason]', + examples: [ 'warn @Peter Please do not swear.' ], + guildOnly: true, + userPermission: ['KICK_MEMBERS'], + }); + } + + async run(message, args) { +/*------ Guild Data ------*/ +const client = message.client +const settings = await Guild.findOne( + { + guildId: message.guild.id + }, + (err, guild) => { + if (err) console.error(err); + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: 'english' + }); + + newGuild + .save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel + .send( + 'This server was not in our database! We have added it, please retype this command.' + ) + .then(m => m.delete({ timeout: 10000 })); + } + } +); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ + guildId: message.guild.id +}); +let language = require(`../../data/language/${guildDB.language}.json`) + + const mentionedMember = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + + if (!mentionedMember) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.warnMissingUser}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + + const mentionedPotision = mentionedMember.roles.highest.position + const memberPotision = message.member.roles.highest.position + + if (memberPotision <= mentionedPotision) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(client.emoji.fail + " | " + language.warnHigherRole) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + + const reason = args.slice(1).join(' ') || 'Not Specified' + + let warnID = random.password({ + length: 8, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + }) + + let warnDoc = await warnModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.id, + }).catch(err => console.log(err)) + + if (!warnDoc) { + warnDoc = new warnModel({ + guildID: message.guild.id, + memberID: mentionedMember.id, + modAction: [], + warnings: [], + warningID: [], + moderator: [], + date: [], + }) + + await warnDoc.save().catch(err => console.log(err)); + + warnDoc = await warnModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.id, + }) + + } + warnDoc.modType.push("warn") + warnDoc.warnings.push(reason) + warnDoc.warningID.push(warnID) + warnDoc.moderator.push(message.member.id) + warnDoc.date.push(Date.now()) + + await warnDoc.save().catch(err => console.log(err)) + let dmEmbed; +if(logging && logging.moderation.warn_action && logging.moderation.warn_action !== "1"){ + + if(logging.moderation.warn_action === "2"){ +dmEmbed = `${message.client.emoji.fail} You've been warned in **${message.guild.name}**` + } else if(logging.moderation.warn_action === "3"){ +dmEmbed = `${message.client.emoji.fail} You've been warned in **${message.guild.name}**\n\n__**Reason:**__ ${reason}` + } else if(logging.moderation.warn_action === "4"){ +dmEmbed = `${message.client.emoji.fail} You've been warned in **${message.guild.name}**\n\n__**Moderator:**__ ${message.author} **(${message.author.tag})**\n__**Reason:**__ ${reason}` + } + +mentionedMember.send(new MessageEmbed().setColor(message.client.color.red) +.setDescription(dmEmbed) +).catch(()=>{}) +} + message.channel.send(new Discord.MessageEmbed().setColor(client.color.green).setDescription(`${language.warnSuccessful + + .replace("{emoji}", client.emoji.success) + .replace("{user}", `**${mentionedMember.user.tag}** `)} + ${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`)).then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + if(logging && logging.moderation.auto_punish.toggle === "true"){ + if(Number(logging.moderation.auto_punish.amount) <= Number(warnDoc.warnings.length)){ + + const punishment = logging.moderation.auto_punish.punishment; + let action; + + if(punishment === "1"){ + action = `banned`; + + await mentionedMember.ban({ reason: `Auto Punish / Responsible user: ${message.author.tag}` }).catch(()=>{}) + + } else if (punishment === "2"){ + action = `kicked`; + +await mentionedMember.kick({ reason: `Auto Punish / Responsible user: ${message.author.tag}` }).catch(()=>{}) + + + } else if (punishment === "3"){ + action = `softbanned`; + +await mentionedMember.ban({ reason:`Auto Punish / ${language.softbanResponsible}: ${message.author.tag}`, days: 7 }); +await message.guild.members.unban(mentionedMember.user, `Auto Punish / ${language.softbanResponsible}: ${message.author.tag}`); + + } + + message.channel.send(new Discord.MessageEmbed().setColor(message.client.color.green).setDescription(`Auto Punish triggered, ${action} **${mentionedMember.user.tag}** ${message.client.emoji.success}`)) + + const auto = logging.moderation.auto_punish; + if(auto.dm && auto.dm !== "1"){ + let dmEmbed; + if(auto.dm === "2"){ + dmEmbed = `${message.client.emoji.fail} You've been ${action} from **${message.guild.name}**\n__(Auto Punish Triggered)__` + } else if(auto.dm === "3"){ + dmEmbed = `${message.client.emoji.fail} You've been ${action} from **${message.guild.name}**\n__(Auto Punish Triggered)__\n\n**Warn Count:** ${warnDoc.warnings.length}` + }; + + mentionedMember.send(new MessageEmbed() + .setColor(message.client.color.red) + .setDescription(dmEmbed) + ) + } + + } + } +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.warns == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.red; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Warn\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.setFooter(`ID: ${mentionedMember.id} | Warn ID: ${warnID}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + + +function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; +} +}; +}; \ No newline at end of file diff --git a/commands/moderation/warnings.js b/commands/moderation/warnings.js new file mode 100644 index 00000000..93215273 --- /dev/null +++ b/commands/moderation/warnings.js @@ -0,0 +1,187 @@ +const Command = require('../../structures/Command'); +const Discord = require("discord.js") +const moment = require("moment") +const Guild = require("../../database/schemas/Guild.js"); +const Economy = require('../../models/economy.js'); +const { MessageEmbed } = require('discord.js'); +const warnModel = require('../../models/moderation.js'); +const mongoose = require('mongoose'); +const ReactionMenu = require('../../data/ReactionMenu.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'warns', + aliases: ['ws', 'warnings'], + description: 'Check a certain users warnings', + category: 'Moderation', + usage: '', + examples: [ 'warnings @Peter' ], + guildOnly: true, + botPermission: ['ADD_REACTIONS'], + userPermissions: ['KICK_MEMBERS'], + }); + } + + async run(message, args) { + + let client = message.client + const settings = await Guild.findOne( + { + guildId: message.guild.id + }, + (err, guild) => { + if (err) console.error(err); + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: 'english' + }); + + newGuild + .save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel + .send( + 'This server was not in our database! We have added it, please retype this command.' + ) + .then(m => m.delete({ timeout: 10000 })); + } + } + ); + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + let language = require(`../../data/language/${guildDB.language}.json`) + + const mentionedMember = message.mentions.members.first() + || message.guild.members.cache.get(args[0]) + || message.member + + const warnDoc = await warnModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.id, + }).catch(err => console.log(err)) + + if (!warnDoc || !warnDoc.warnings.length) { + return message.channel.send(new Discord.MessageEmbed() + .setAuthor(message.author.tag, message.author.avatarURL()) + .setDescription(`${message.client.emoji.fail} | **${mentionedMember.user.tag}** ${language.warningsNoError}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + + const data = [] + + + for (let i = 0; warnDoc.warnings.length > i; i++) { + data.push(`**Moderator:** ${await message.client.users.fetch(warnDoc.moderator[i])}\n**Reason:** ${warnDoc.warnings[i]}\n**Date:** ${moment(warnDoc.date[i]).format("dddd, MMMM Do YYYY")}\n**Warning ID:** ${i + 1}\n`) + } + + const count = warnDoc.warnings.length; + + + const embed = new MessageEmbed() + .setAuthor(mentionedMember.user.tag, mentionedMember.user.displayAvatarURL({ dynamic: true })) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(client.color.blue); + + const buildEmbed = (current, embed) => { + const max = (count > current + 4) ? current + 4 : count; + let amount = 0; + for (let i = current; i < max; i++) { + + + if (warnDoc.warnings[i].length > 1000) warnDoc.warnings[i] = warnDoc.warnings[i].slice(0, 1000) + '...'; + embed // Build warning list + .addField('\u200b', `**${language.warnName || 'unknown'} \`#${i + 1}\`**`) + .addField(`${language.warnModerator || 'unknown' }`, message.guild.members.cache.get(warnDoc.moderator[i]), true) + + .addField(`${language.warnAction || 'unknown'}`, warnDoc.modType[i], true) //it says if its mute or warn or ban etc + + .addField(`${language.warnReason || 'unknown'}`, warnDoc.warnings[i], true) + .addField(`${language.warnID || 'unknown'}`, `${warnDoc.warningID[i]}`, true) + .addField(`${language.warnDateIssued || 'unknown'}`, `${moment(warnDoc.date[i]).format("dddd, MMMM Do YYYY")}`); + amount += 1; + } + + + return embed + .setTitle(`${language.warnList} [${current} - ${max}]`) + .setDescription(`Showing \`${amount}\` of ${mentionedMember}'s \`${count}\` total warns.`); + }; + + + + if (count < 4) return message.channel.send(buildEmbed(0, embed)); + else { + + let n = 0; + const json = embed.setFooter( + `${language.warnExpire}\n` + message.member.displayName, + message.author.displayAvatarURL({ dynamic: true }) + ).toJSON(); + + const first = () => { + if (n === 0) return; + n = 0; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const previous = () => { + if (n === 0) return; + n -= 4; + if (n < 0) n = 0; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const next = () => { + const cap = count - (count % 4); + if (n === cap || n + 4 === count) return; + n += 4; + if (n >= count) n = cap; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const last = () => { + const cap = count - (count % 4); + if (n === cap || n + 4 === count) return; + n = cap; + if (n === count) n -= 4; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const reactions = { + '⏪': first, + '◀️': previous, + '⏹️': null, + '▶️': next, + '⏩': last, + }; + + const menu = new ReactionMenu( + message.client, + message.channel, + message.member, + buildEmbed(n, new MessageEmbed(json)), + null, + null, + reactions, + 180000 + ) + + menu.reactions['⏹️'] = menu.stop.bind(menu) + + + + }; + +}; +}; \ No newline at end of file diff --git a/commands/moderation/warnpurge.js b/commands/moderation/warnpurge.js new file mode 100644 index 00000000..743c1fc4 --- /dev/null +++ b/commands/moderation/warnpurge.js @@ -0,0 +1,268 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require("../../database/schemas/Guild.js"); +const warnModel = require('../../models/moderation.js'); +const mongoose = require('mongoose'); +const Discord = require("discord.js") +const randoStrings = require("randostrings") +const random = new randoStrings; +const moment = require('moment'); +const Logging = require('../../database/schemas/logging.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'warnpurge', + aliases: ['wp'], + description: 'Warns a member purge their specified messages', + category: 'Moderation', + usage: ' [reason]', + examples: ['warnpurge @pogy 10.'], + guildOnly: true, + botPermission: ['SEND_MESSAGES', 'EMBED_LINKS', 'KICK_MEMBERS', 'MANAGE_MESSAGES'], + userPermission: ['KICK_MEMBERS', 'MANAGE_MESSAGES'], + }); + } + + async run(message, args) { +/*------ Guild Data ------*/ +const client = message.client +const settings = await Guild.findOne( + { + guildId: message.guild.id + }, + (err, guild) => { + if (err) console.error(err); + if (!guild) { + const newGuild = new Guild({ + _id: mongoose.Types.ObjectId(), + guildId: message.guild.id, + guildName: message.guild.name, + prefix: client.config.prefix, + language: 'english' + }); + + newGuild + .save() + .then(result => console.log(result)) + .catch(err => console.error(err)); + + return message.channel + .send( + 'This server was not in our database! We have added it, please retype this command.' + ) + .then(m => m.delete({ timeout: 10000 })); + } + } +); + const logging = await Logging.findOne({ guildId: message.guild.id }) +const guildDB = await Guild.findOne({ + guildId: message.guild.id +}); +let language = require(`../../data/language/${guildDB.language}.json`) + +const fail = client.emoji.fail; +const success = client.emoji.success; + const mentionedMember = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + + if (!message.member.hasPermission('MANAGE_ROLES')) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} ${language.warnMissingPermission}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + else if (!mentionedMember) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.warnMissingUser}`) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + + const mentionedPotision = mentionedMember.roles.highest.position + const memberPotision = message.member.roles.highest.position + + if (memberPotision <= mentionedPotision) { + return message.channel.send(new Discord.MessageEmbed() + .setDescription(client.emoji.fail + " | " + language.warnHigherRole) + .setTimestamp(message.createdAt) + .setColor(client.color.red)) + } + + const amount = parseInt(args[1]); + if (isNaN(amount) === true || !amount || amount < 0 || amount > 100) + return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} Warn Purge Error`) + .setDescription(`Please Provide a message count between 1 - 100 messages`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + let reason = args.slice(2).join(' '); + if (!reason) reason = 'No Reason Provided'; + if (reason.length > 1024) reason = reason.slice(0, 1021) + '...'; + +let warnID = random.password({ + length: 8, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + }) + + let warnDoc = await warnModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.id, + }).catch(err => console.log(err)) + + if (!warnDoc) { + warnDoc = new warnModel({ + guildID: message.guild.id, + memberID: mentionedMember.id, + modAction: [], + warnings: [], + warningID: [], + moderator: [], + date: [], + }) + + await warnDoc.save().catch(err => console.log(err)); + + warnDoc = await warnModel.findOne({ + guildID: message.guild.id, + memberID: mentionedMember.id, + }) + + } + warnDoc.modType.push("warn purge") + warnDoc.warnings.push(reason) + warnDoc.warningID.push(warnID) + warnDoc.moderator.push(message.member.id) + warnDoc.date.push(Date.now()) + + await warnDoc.save().catch(err => console.log(err)) + + + // Purge + const messages = (await message.channel.messages.fetch({ limit: amount })).filter(m => m.member.id === mentionedMember.id); + if (messages.size > 0) await message.channel.bulkDelete(messages, true); + + const embed = new MessageEmbed() + + .setDescription(`**${mentionedMember.user.tag}** has been warned, with **${messages.size}** messages purged ${success}${logging && logging.moderation.include_reason === "true" ?`\n\n**Reason:** ${reason}`:``}`) + .setColor(message.guild.me.displayHexColor) + message.channel.send(embed) + .then(async(s)=>{ + if(logging && logging.moderation.delete_reply === "true"){ + setTimeout(()=>{ + s.delete().catch(()=>{}) + }, 5000) + } + }) + .catch(()=>{}); + + + if(logging && logging.moderation.auto_punish.toggle === "true"){ + if(Number(logging.moderation.auto_punish.amount) <= Number(warnDoc.warnings.length)){ + + const punishment = logging.moderation.auto_punish.punishment; + let action; + + if(punishment === "1"){ + action = `banned`; + + await mentionedMember.ban({ reason: `Auto Punish / Responsible user: ${message.author.tag}` }).catch(()=>{}) + + } else if (punishment === "2"){ + action = `kicked`; + +await mentionedMember.kick({ reason: `Auto Punish / Responsible user: ${message.author.tag}` }).catch(()=>{}) + + + } else if (punishment === "3"){ + action = `softbanned`; + +await mentionedMember.ban({ reason:`Auto Punish / ${language.softbanResponsible}: ${message.author.tag}`, days: 7 }); +await message.guild.members.unban(mentionedMember.user, `Auto Punish / ${language.softbanResponsible}: ${message.author.tag}`); + + } + + message.channel.send(new Discord.MessageEmbed().setColor(message.client.color.green).setDescription(`Auto Punish triggered, ${action} **${mentionedMember.user.tag}** ${message.client.emoji.success}`)) + + const auto = logging.moderation.auto_punish; + if(auto.dm && auto.dm !== "1"){ + let dmEmbed; + if(auto.dm === "2"){ + dmEmbed = `${message.client.emoji.fail} You've been ${action} from **${message.guild.name}**\n__(Auto Punish Triggered)__` + } else if(auto.dm === "3"){ + dmEmbed = `${message.client.emoji.fail} You've been ${action} from **${message.guild.name}**\n__(Auto Punish Triggered)__\n\n**Warn Count:** ${warnDoc.warnings.length}` + }; + + mentionedMember.send(new MessageEmbed() + .setColor(message.client.color.red) + .setDescription(dmEmbed) + ) + } + + } + } + +if(logging){ + if(logging.moderation.delete_after_executed === "true"){ + message.delete().catch(()=>{}) +} + +const role = message.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = message.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + if(message.channel.id !== logging.moderation.ignore_channel){ + if(!role || role && !message.member.roles.cache.find(r => r.name.toLowerCase() === role.name)){ + +if(logging.moderation.warns == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = message.client.color.yellow; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbed = new MessageEmbed() +.setAuthor(`Action: \`Warn\` | ${mentionedMember.user.tag} | Case #${logcase}`, mentionedMember.user.displayAvatarURL({ format: 'png' })) +.addField('User', mentionedMember, true) +.addField('Moderator', message.member, true) +.addField('Reason', reason, true) +.addField('Message Count', messages.size) +.setFooter(`ID: ${mentionedMember.id} | Warn ID: ${warnID}`) +.setTimestamp() +.setColor(color) + + + +channel.send(logEmbed).catch((e)=>{console.log(e)}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + } + } + } + } +} + + + +function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; +} +}; +}; \ No newline at end of file diff --git a/commands/nsfw/ass.js b/commands/nsfw/ass.js new file mode 100644 index 00000000..618531bb --- /dev/null +++ b/commands/nsfw/ass.js @@ -0,0 +1,54 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'ass', + aliases: [ 'butt', 'butts', 'booty' ], + description: 'Sends you but Pictures 🍑', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'asstastic', + 'pawg', + 'facedownassup', + 'ass', + 'brunetteass', + 'CheekyBottoms', + 'datgap', + 'underbun', + 'pawgtastic', + 'BestBooties', + 'CuteLittleButts' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/bikini.js b/commands/nsfw/bikini.js new file mode 100644 index 00000000..ba92c2d6 --- /dev/null +++ b/commands/nsfw/bikini.js @@ -0,0 +1,45 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'bikini', + aliases: [ 'bikinis' ], + description: 'Photos of girls in bikinis! 👙', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'bikinis', + 'bikinibodies' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/boobs.js b/commands/nsfw/boobs.js new file mode 100644 index 00000000..6b044548 --- /dev/null +++ b/commands/nsfw/boobs.js @@ -0,0 +1,51 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'boobs', + aliases: ['boob', 'boobies'], + description: 'Sends you a random boob image 🍒.', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'boobs', + 'Boobies', + 'Stacked', + 'BustyPetite', + 'Cleavage', + 'bustyasians', + 'boltedontits', + 'burstingout' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/cum.js b/commands/nsfw/cum.js new file mode 100644 index 00000000..b0456861 --- /dev/null +++ b/commands/nsfw/cum.js @@ -0,0 +1,46 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'cum', + description: 'Uh, yes 👍', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'buttloads', + 'CumOnAss', + 'bodyshots', + 'cumsluts' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/feet.js b/commands/nsfw/feet.js new file mode 100644 index 00000000..9ceaabc5 --- /dev/null +++ b/commands/nsfw/feet.js @@ -0,0 +1,63 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'feet', + description: 'Sends you a random feet fetish image. (not always nsfw)', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'CelebrityFeet', + 'FFSocks', + 'Feet_NSFW', + 'FootFetish', + 'FFNBPS', + 'feetish', + 'scent_of_women_feet', + 'AsianFeet', + 'gayfootfetish', + 'HighHeels', + 'Soles', + 'CosplayFeet', + 'dirtyfeet', + 'DesiFeet', + 'ebonyfeet', + 'rule34feet', + 'girlsinanklesocks', + 'Porn_Star_Feet', + 'FeetVideos', + 'Soles_And_Holes', + 'Footjobs' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/gay.js b/commands/nsfw/gay.js new file mode 100644 index 00000000..0c1e9b28 --- /dev/null +++ b/commands/nsfw/gay.js @@ -0,0 +1,53 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'gay', + aliases: ['dick', 'dicks', 'cock', 'cocks', 'penis', 'penises'], + description: 'yes', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'cockrating', + 'BonersInPublic', + 'curved_cock', + 'MassiveCock', + 'ratemycock', + 'RedditorCum', + 'NSFW_DICK_and_Cock', + 'TotallyStraight', + 'CockOutline', + 'lovegaymale' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/hentai.js b/commands/nsfw/hentai.js new file mode 100644 index 00000000..6776aeb9 --- /dev/null +++ b/commands/nsfw/hentai.js @@ -0,0 +1,45 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'hentai', + description: 'Returns a random hentai image/gif', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'hentai', + 'rule34', + 'rule34feet' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/nsfw.js b/commands/nsfw/nsfw.js new file mode 100644 index 00000000..5ca58ac4 --- /dev/null +++ b/commands/nsfw/nsfw.js @@ -0,0 +1,98 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'nsfw', + description: 'Shows random nsfw posts 👀', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'asstastic', + 'pawg', + 'facedownassup', + 'ass', + 'brunetteass', + 'CheekyBottoms', + 'datgap', + 'underbun', + 'pawgtastic', + 'BestBooties', + 'CuteLittleButts', + 'bikinis', + 'bikinibodies', + 'boobs', + 'Boobies', + 'Stacked', + 'BustyPetite', + 'Cleavage', + 'bustyasians', + 'boltedontits', + 'burstingout', + 'CelebrityFeet', + 'FFSocks', + 'Feet_NSFW', + 'FootFetish', + 'FFNBPS', + 'feetish', + 'scent_of_women_feet', + 'AsianFeet', + 'gayfootfetish', + 'HighHeels', + 'Soles', + 'CosplayFeet', + 'dirtyfeet', + 'DesiFeet', + 'ebonyfeet', + 'rule34feet', + 'girlsinanklesocks', + 'Porn_Star_Feet', + 'FeetVideos', + 'Soles_And_Holes', + 'Footjobs', + 'pussy', + 'vagina', + 'PerfectPussies', + 'rearpussy', + 'nnlegalteens', + 'Barelylegal', + 'barelylegalteens', + 'LegalTeens', + 'thighs', + 'PerfectThighs', + 'thickthighs', + 'girlsinyogapants', + 'YogaPants', + + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/pussy.js b/commands/nsfw/pussy.js new file mode 100644 index 00000000..0f040645 --- /dev/null +++ b/commands/nsfw/pussy.js @@ -0,0 +1,48 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'pussy', + description: 'Sends you 😺Images', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'pussy', + 'vagina', + 'PerfectPussies', + 'rearpussy', + 'GirlsInSocks', + 'girlsinanklesocks' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/socks.js b/commands/nsfw/socks.js new file mode 100644 index 00000000..d7f0dea5 --- /dev/null +++ b/commands/nsfw/socks.js @@ -0,0 +1,44 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'socks', + description: '🧦 Pics', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'GirlsInSocks', + 'girlsinanklesocks' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/tattoo.js b/commands/nsfw/tattoo.js new file mode 100644 index 00000000..7e6ac83b --- /dev/null +++ b/commands/nsfw/tattoo.js @@ -0,0 +1,46 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'tattoo', + description: 'Sends a random nsfw tattoo\'d female', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'HotChicksWithTattoos', + 'SuicideGirls', + 'SceneGirls', + 'PrettyAltGirls' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/teen.js b/commands/nsfw/teen.js new file mode 100644 index 00000000..5e3ce90a --- /dev/null +++ b/commands/nsfw/teen.js @@ -0,0 +1,46 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'teen', + description: 'Sends you random teen nude pics.', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'nnlegalteens', + 'Barelylegal', + 'barelylegalteens', + 'LegalTeens' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/thighs.js b/commands/nsfw/thighs.js new file mode 100644 index 00000000..6996500e --- /dev/null +++ b/commands/nsfw/thighs.js @@ -0,0 +1,45 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'thighs', + description: 'Thighs. Yes', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'thighs', + 'PerfectThighs', + 'thickthighs' + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/nsfw/yogapants.js b/commands/nsfw/yogapants.js new file mode 100644 index 00000000..a9a9cae6 --- /dev/null +++ b/commands/nsfw/yogapants.js @@ -0,0 +1,44 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'yogapants', + description: 'Sends you yogapant pictures.', + category: 'NSFW', + nsfwOnly: true + }); + } + + async run(message, args) { + try { + var subreddits = [ + 'girlsinyogapants', + 'YogaPants', + ] + + var reddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; + + const data = await fetch(`https://meme-api.herokuapp.com/gimme/${reddit}`).then(res => res.json()) + + if (!data) return message.channel.send(`Sorry, seems like i can't connect to API.`); + + const { title, postLink, url, subreddit } = data + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `${title}`, + url: `${postLink}`, + image: { + url: url + }, + footer: { text: `/reddit/${subreddit}` } + } + }); + } catch(error) { + this.client.emit("apiError", error, message); + } + } +}; \ No newline at end of file diff --git a/commands/owner/addbadge.js b/commands/owner/addbadge.js new file mode 100644 index 00000000..dd486d4d --- /dev/null +++ b/commands/owner/addbadge.js @@ -0,0 +1,65 @@ +const Command = require('../../structures/Command'); +const User = require('../../database/schemas/User') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'addbadge', + aliases: [ 'ab' ], + description: 'Add a certain badge to a user.', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + const client = message.client; + + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + + if(!user) return message.channel.send('Provide me with a user.'); + + + const badge = args[1] + if(!badge) return message.channel.send('Provide me with a badge'); + + let userFind = await User.findOne({ + discordId: user.id + }); + + if(!userFind){ + const newUser = new User({ + discordId: message.author.id + }) + + newUser.save() + userFind = await User.findOne({ + discordId: user.id + }); + + } + + if(userFind.badges.includes(badge)) return message.channel.send(`He already has that badge.`) + + userFind.badges.push(badge) + await userFind.save().catch(()=>{}) + message.channel.send(`Added ${badge} to the user! `) + + } +}; + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } \ No newline at end of file diff --git a/commands/owner/addcode.js b/commands/owner/addcode.js new file mode 100644 index 00000000..c79520ee --- /dev/null +++ b/commands/owner/addcode.js @@ -0,0 +1,96 @@ +const Command = require('../../structures/Command'); +const Premium = require('../../database/schemas/GuildPremium'); +const Discord = require('discord.js'); +const moment = require('moment'); + +var voucher_codes = require('voucher-code-generator'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'addpremium', + aliases: [ 'apremium' ], + description: 'Add a premium code.', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + const client = message.client; + + + +const plans = ["month", "year"] + +if(!args[0]) return message.channel.send(`Provide a Plan!\n${plans.join(" - ")}`) + +if(!plans.includes(args[0])) return message.channel.send(`Provide a Plan!\n${plans.join(" - ")}`) + +let expiresAt; + + +if(args[0] === "month"){ + +expiresAt = Date.now() + 2592000000; + + +} else if(args[0] === "year"){ + +expiresAt = Date.now() + (2592000000 * 12); + +} + + +let amount = args[1]; +if(!amount) amount = 1 + +const array = [] + for (var i = 0; i < amount; i++) { + + const codePremium = voucher_codes.generate({ + pattern: "####-####-####", +}); + +const code = codePremium.toString().toUpperCase(); + + +const find = await Premium.findOne({ + code: code + }); + +if(!find){ + +Premium.create({ + code: code, + expiresAt: expiresAt, + plan: args[0] +}); + +array.push(`\`${i + 1}-\` ${code}`) +} + } + + message.channel.send(new Discord.MessageEmbed() + .setColor(message.client.color.green) + .setDescription(`**Generated ${array.length} Premium Code(s)**\n\n${array.join("\n")}\n\n**Type:** ${args[0]}\n**Expires:** ${moment(expiresAt).format("dddd, MMMM Do YYYY")}`) + ) + + } +} + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } \ No newline at end of file diff --git a/commands/owner/blacklist.js b/commands/owner/blacklist.js new file mode 100644 index 00000000..ccc9fcfd --- /dev/null +++ b/commands/owner/blacklist.js @@ -0,0 +1,143 @@ +const Command = require('../../structures/Command'); +const { WebhookClient, MessageEmbed } = require('discord.js'); +const webhookClient = new WebhookClient('', ''); + + +const logger = require('../../utils/logger'); +const Blacklist = require('../../database/schemas/blacklist'); +const Guild = require("../../database/schemas/Guild.js"); +const mongoose = require("mongoose") +const ms = require("ms") + const msRegex = RegExp(/(\d+(s|m|h|w))/) +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'blacklist', + aliases: ['bl'], + description: 'Adds a user to the blacklist.', + category: 'Owner', + usage: [ ' ' ], + ownerOnly: true + }); + } + + async run(message, args) { + const match = message.content.match(/\d{18}/); + + let member = match ? message.guild.members.cache.get(args[1]) : null; + let guild = this.client.guilds.cache.get(args[1]); + let reason = args.slice(3).join(' ') || 'Not Specified'; + + if (args.length < 1) return message.channel.send(`Please provide me with a user or guild blacklist`) + if (args.length < 2) return message.channel.send(`Provide me with a user`) + if (args.length < 4) return message.channel.send(`Provide me with a reason`) + if (args.length < 3) return message.channel.send(`Provide me with a time duration`) + + if (!msRegex.test(args[2])) return message.channel.send(`Provide me with a valid time`) + + if (args[0] === 'user') { + await Blacklist.findOne({ + discordId: member.id, + }, (err, user) => { + if (!user) { + const blacklist = new Blacklist({ discordId: member.id, length: Date.now() + ms(msRegex.exec(args[2])[1]), type: 'user', isBlacklisted: true, reason }) + blacklist.save() + } else { + user.updateOne({ type: 'user', isBlacklisted: true, reason,length: Date.now() + ms(msRegex.exec(args[2])[1]), }) + } + }); + + setTimeout(async () => { + const isMuted = await Blacklist.findOne({ + discordId: member.id, + }) + + await isMuted.deleteOne().catch(err => console.log(err)) + + const embedd = new MessageEmbed() + .setDescription(`${member.user.tag} Got unblacklisted!`) + webhookClient.send({ + username: 'Pogy', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embedd] + }); + }, ms(msRegex.exec(args[2])[1])) + + message.channel.send({ + embed: { + color: "BLURPLE", + title: `User added to the blacklist! `, + description: `${member.user.tag} - \`${reason}\`\ntime: ${msRegex.exec(args[2])[1]}`, + } + }); + + const embed = new MessageEmbed() + .setColor('BLURPLE') + .setTitle(`Blacklist Report`) + .setURL('https://docs.google.com/forms/d/e/1FAIpQLSedBS6JYEqxzXGcs1T9vb7dugZiBxftVrY3CFfk-aP1rFnnrw/viewform?usp=sf_link') + .addField('Status', 'Added to the blacklist.') + .addField('User', `${member.user.tag} (${member.id})`) + .addField('Responsible', `${message.author} (${message.author.id})`) + .addField('Reason', reason) + + return webhookClient.send({ + username: 'Pogy', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embed] + }); + } + + +// guild blacklist + if (args[0] === 'guild') { + await Blacklist.findOne({ + guildId: guild, + }, (err, server) => { + if (!server) { + const blacklist = new Blacklist({ guildId: guild.id, length: Date.now() + ms(msRegex.exec(args[2])[1]), type: 'guild', isBlacklisted: true, reason }) + blacklist.save() + } else { + server.updateOne({ type: 'guild', isBlacklisted: true, reason, length: Date.now() + ms(msRegex.exec(args[2])[1]), }) + } + }); + + setTimeout(async () => { + const isMuted = await Blacklist.findOne({ + guildId: guild, + }) + + await isMuted.deleteOne().catch(err => console.log(err)) + + const embedd = new MessageEmbed() + .setDescription(`Guild ${guild.name} Got unblacklisted!`) + webhookClient.send({ + username: 'Pogy Blacklists', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embedd] + }); + }, ms(msRegex.exec(args[2])[1])); + + message.channel.send({ + embed: { + color: "BLURPLE", + title: 'Server added to the blacklist!', + description: `${guild.name} - \`${reason}\``, + } + }); + + const embed = new MessageEmbed() + .setColor('BLURPLE') + .setTitle(`Blacklist Report`) + .addField('Status', 'Added to the blacklist.') + .addField('Server', `${guild.name} (${guild.id})`) + .addField('Responsible', `${message.author} (${message.author.id})`) + .addField('Reason', reason) + + return webhookClient.send({ + username: 'Pogy Blacklists', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embed] + }); + } + } +}; diff --git a/commands/owner/databaseadd.js b/commands/owner/databaseadd.js new file mode 100644 index 00000000..76e2abb0 --- /dev/null +++ b/commands/owner/databaseadd.js @@ -0,0 +1,42 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/logging') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'databaseadd', + aliases: [ 'adatabase' ], + description: 'Add database', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + message.client.guilds.cache.forEach(async(guild)=>{ + + const check = await Guild.findOne({ + guildId: guild.id + }) + + if(!check){ + + + const newGuild = await Guild.create({ + guildId: guild.id, + }); + + await newGuild.save().catch(()=>{}) + + + + + + } + }) + + message.channel.send(`Done!`) + + } +}; + diff --git a/commands/owner/eval.js b/commands/owner/eval.js new file mode 100644 index 00000000..bd90241b --- /dev/null +++ b/commands/owner/eval.js @@ -0,0 +1,39 @@ +const Command = require('../../structures/Command'); +const util = require('util'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'eval', + aliases: ['ev'], + description: 'This is for the developers.', + category: 'Owner', + usage: [ '' ], + ownerOnly: true + }); + } + + async run(message, args) { + const input = args.join(' '); + if (!input) return message.channel.send(`What do I evaluate?`) + if(!input.toLowerCase().includes('token')) { + + let embed = ``; + + try { + let output = eval(input); + if (typeof output !== 'string') output = require('util').inspect(output, { depth: 0 }); + + embed = `\`\`\`js\n${output.length > 1024 ? 'Too large to display.' : output}\`\`\`` + + } catch(err) { + embed = `\`\`\`js\n${err.length > 1024 ? 'Too large to display.' : err}\`\`\`` + } + + message.channel.send(embed); + + } else { + message.channel.send('Bruh you tryina steal my token huh?'); + } + } +}; diff --git a/commands/owner/exec.js b/commands/owner/exec.js new file mode 100644 index 00000000..f3e83d65 --- /dev/null +++ b/commands/owner/exec.js @@ -0,0 +1,26 @@ +const Command = require('../../structures/Command'); +const { exec } = require('child_process'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'exec', + aliases: ['execute'], + description: 'This is for the developers.', + category: 'Owner', + usage: [ '' ], + ownerOnly: true + }); + } + + async run(message, args) { + if (message.content.includes('config.json')) return message.channel.send('<:sbdeny:736927045522817106> Due to privacy reasons, we can\'t show the config.json file.'); + + if (args.length < 1) return message.channel.send('<:sbdeny:736927045522817106> You have to give me some text to execute!') + + exec(args.join(' '), (error, stdout) => { + const response = stdout || error; + message.channel.send(response, { split: true, code: true }); + }); + } +}; diff --git a/commands/owner/fetchinvite.js b/commands/owner/fetchinvite.js new file mode 100644 index 00000000..25766001 --- /dev/null +++ b/commands/owner/fetchinvite.js @@ -0,0 +1,54 @@ +const Command = require('../../structures/Command'); +const rgx = /^(?:<@!?)?(\d+)>?$/; +const { MessageEmbed } = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'fetchinvite', + aliases: ['finvite', 'finv'], + description: 'Fetch an invite!', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + const guildId = args[0]; + if (!rgx.test(guildId)) + return message.channel.send(`Provide a guild`) + const guild = message.client.guilds.cache.get(guildId); + if (!guild) return message.channel.send(`Invalid guild ID`) + + const array = [] + var textChats = guild.channels.cache + .find(ch => ch.type === 'text' && ch.permissionsFor(guild.me).has('CREATE_INSTANT_INVITE')) + + if(!textChats) message.channel.send(`No channel`) + + await textChats.createInvite({ +maxAge: 0, + maxUses: 0 +}).then(inv => { + + console.log(`${guild.name} | ${inv.url}`); + message.channel.send(`${guild.name} | ${inv.url}`); +}) +.catch(err => { + message.channel.send("Don't have permission"); +}); + + + + + + + + + + + + +} +}; diff --git a/commands/owner/leaveguild.js b/commands/owner/leaveguild.js new file mode 100644 index 00000000..61634725 --- /dev/null +++ b/commands/owner/leaveguild.js @@ -0,0 +1,33 @@ +const Command = require('../../structures/Command'); +const rgx = /^(?:<@!?)?(\d+)>?$/; +const { MessageEmbed } = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'leaveguild', + aliases: ['lg'], + description: 'Leave a guild!', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + const guildId = args[0]; + if (!rgx.test(guildId)) + return message.channel.send(`Provide a guild`) + const guild = message.client.guilds.cache.get(guildId); + if (!guild) return message.channel.send(`Invalid guild ID`) + await guild.leave(); + const embed = new MessageEmbed() + .setTitle('Leave Guild') + .setDescription(`I have successfully left **${guild.name}**.`) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + message.channel.send(embed); + + } +}; diff --git a/commands/owner/maintenance.js b/commands/owner/maintenance.js new file mode 100644 index 00000000..1eb54e61 --- /dev/null +++ b/commands/owner/maintenance.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'maintenance', + aliases: [ 'maintenance' ], + description: 'Sets the bot to maintenance', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + if(!args[0]) return message.channel.send('Would you like to enable or disable maintenance mode?') + + const maintenance = await Maintenance.findOne({maintenance: 'maintenance'}) + + if(args[0].toLowerCase() == "enable"){ + if(maintenance){ + + maintenance.toggle = "true" + await maintenance.save(); + + } else { + const newMain = new Maintenance({ + toggle: "true" + }) + newMain.save().catch(()=>{}) + } + await message.channel.send('Enabling maintenance Mode') + process.exit(1) + + } else if(args[0].toLowerCase() == "disable"){ + + if(maintenance){ + maintenance.toggle = "false" + await maintenance.save(); + + } else { + const newMain = new Maintenance({ + toggle: "false" + }) + newMain.save().catch(()=>{}) + } + await message.channel.send('Disabling maintenance Mode') + process.exit(1) + + } else { + message.channel.send('Invalid Response') + } + + } +}; diff --git a/commands/owner/removebadge.js b/commands/owner/removebadge.js new file mode 100644 index 00000000..46486e54 --- /dev/null +++ b/commands/owner/removebadge.js @@ -0,0 +1,87 @@ +const Command = require('../../structures/Command'); +const User = require('../../database/schemas/User') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'removebadge', + aliases: [ ], + description: 'Remove a certain badge to a user.', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + const client = message.client; + + let user = message.mentions.users.first() || client.users.cache.get(args[0]) || match(args.join(" ").toLowerCase(), message.guild) || message.author; + + if(!user) return message.channel.send('Provide me with a user.'); + + + const badge = args[1] + if(!badge) return message.channel.send('Provide me with a badge'); + + let userFind = await User.findOne({ + discordId: user.id + }); + + if(!userFind){ + const newUser = new User({ + discordId: message.author.id + }) + + newUser.save() + userFind = await User.findOne({ + discordId: user.id + }); + + } + + if(userFind.badges.includes(badge)) { + + let arr = userFind.badges + let newArr = removeA(arr, badge) + + await userFind.updateOne({ + badges: newArr + }) + message.channel.send(`Removed ${badge} from the user!`) + + + } else { + message.channel.send(`He doesn't have that badge`) + } + + + + } +}; + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + function removeA(arr) { + var what, a = arguments, L = a.length, ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} \ No newline at end of file diff --git a/commands/owner/restart.js b/commands/owner/restart.js new file mode 100644 index 00000000..447c9d3a --- /dev/null +++ b/commands/owner/restart.js @@ -0,0 +1,18 @@ +const Command = require('../../structures/Command'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'restart', + aliases: [ 'reboot' ], + description: 'Restart the bot!', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message) { + await message.channel.send("Restarting!").catch(err => this.client.console.error(err)); + process.exit(1) + } +}; diff --git a/commands/owner/server.js b/commands/owner/server.js new file mode 100644 index 00000000..5ef910be --- /dev/null +++ b/commands/owner/server.js @@ -0,0 +1,80 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment'); +const { stripIndent } = require('common-tags'); + +const verificationLevels = { + NONE: '`None`', + LOW: '`Low`', + MEDIUM: '`Medium`', + HIGH: '`High`', + VERY_HIGH: '`Highest`' +}; +const notifications = { + ALL: '`All`', + MENTIONS: '`Mentions`' +}; + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'server', + aliases: [], + description: 'Check the server', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message, args) { + + function checkDays(date) { + let now = new Date(); + let diff = now.getTime() - date.getTime(); + let days = Math.floor(diff / 86400000); + return days + (days == 1 ? " day" : " days") + " ago"; + }; + let verifLevels = ["None", "Low", "Medium", "(╯°□°)╯︵ ┻━┻", "┻━┻ミヽ(ಠ益ಠ)ノ彡┻━┻"]; + let region = { + "eu-central": ":flag_eu: Central Europe", + "singapore": ":flag_sg: Singapore", + "us-central": ":flag_us: U.S. Central", + "sydney": ":flag_au: Sydney", + "us-east": ":flag_us: U.S. East", + "us-south": ":flag_us: U.S. South", + "us-west": ":flag_us: U.S. West", + "eu-west": ":flag_eu: Western Europe", + "vip-us-east": ":flag_us: VIP U.S. East", + "london": ":flag_gb: London", + "amsterdam": ":flag_nl: Amsterdam", + "hongkong": ":flag_hk: Hong Kong", + "russia": ":flag_ru: Russia", + "southafrica": ":flag_za: South Africa", + "brazil": ":flag_br: Brazil" +}; +const guildId = args[0]; +const guild = message.client.guilds.cache.get(guildId); +if (!guild) return message.channel.send(`Invalid guild ID`) + +const embed = new MessageEmbed() +.setAuthor(guild.name, guild.iconURL()) +.addField("Server ID", guild.id, true) +.addField("Owner", `${guild.owner.user.username}#${guild.owner.user.discriminator}`, true) +.addField("Owner ID", `${guild.owner.user.id}`, true) +.addField('Owner Joined Discord on', `\`${moment(guild.owner.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}\``, true) +.addField("Region", guild.region, true) +.addField("Total | Humans | Bots", `${guild.members.cache.size} | ${guild.members.cache.filter(member => !member.user.bot).size} | ${guild.members.cache.filter(member => member.user.bot).size}`, true) +.addField("Verification Level", guild.verificationLevel, true) +.addField("Channels", guild.channels.cache.size, true) +.addField("Roles", guild.roles.cache.size, true) +.addField("Creation Date", `${guild.createdAt.toUTCString().substr(0, 16)} (${checkDays(guild.createdAt)})`, true) +.setThumbnail(guild.iconURL()) +.setColor(message.guild.me.displayHexColor); + message.channel.send({embed}).catch(error => { + message.channel.send(`Error: ${error}`) + + }); + + + } +}; diff --git a/commands/owner/servers.js b/commands/owner/servers.js new file mode 100644 index 00000000..6d90f508 --- /dev/null +++ b/commands/owner/servers.js @@ -0,0 +1,35 @@ +const Command = require('../../structures/Command'); +const ReactionMenu = require('../../data/ReactionMenu.js'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'servers', + aliases: [], + description: 'Check the servers!', + category: 'Owner', + ownerOnly: true + }); + } + + async run(message) { + + const servers = message.client.guilds.cache.array().map(guild => { + return `\`${guild.id}\` - **${guild.name}** - \`${guild.memberCount}\` members`; + }); + + const embed = new MessageEmbed() + .setTitle('Server List') + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(message.guild.me.displayHexColor); + + if (servers.length <= 10) { + const range = (servers.length == 1) ? '[1]' : `[1 - ${servers.length}]`; + message.channel.send(embed.setTitle(`Server List ${range}`).setDescription(servers.join('\n'))); + } else { + new ReactionMenu(message.client, message.channel, message.member, embed, servers); + } + + } +}; diff --git a/commands/owner/setNews.js b/commands/owner/setNews.js new file mode 100644 index 00000000..0b4061ec --- /dev/null +++ b/commands/owner/setNews.js @@ -0,0 +1,21 @@ +const Command = require('../../structures/Command'); +const SlayBotDB = require('../../database/schemas/Pogy'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'setnews', + description: 'This is for the developers.', + category: 'Owner', + usage: [ '' ], + ownerOnly: true + }); + } + + async run(message, args) { + let news = args.join(' ').split('').join('') + if(!SlayBotDB.news) return await SlayBotDB.create({ news: news, tag: '710465231779790849', time: new Date() }) + await SlayBotDB.updateOne({ news: news, tag: '710465231779790849', time: new Date()}) + message.channel.send(' Updated News!') + await SlayBotDB.updateOne({ news: news, tag: '710465231779790849', time: new Date() }) + message.channel.send(' Updated News!') + } +}; diff --git a/commands/owner/unblacklist.js b/commands/owner/unblacklist.js new file mode 100644 index 00000000..04d153a2 --- /dev/null +++ b/commands/owner/unblacklist.js @@ -0,0 +1,108 @@ +const Command = require('../../structures/Command'); +const { WebhookClient, MessageEmbed } = require('discord.js'); +const webhookClient = new WebhookClient('', ''); +const logger = require('../../utils/logger'); +const Blacklist = require('../../database/schemas/blacklist'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'unblacklist', + description: 'Removes a user from the blacklist.', + category: 'Owner', + usage: [ '' ], + ownerOnly: true + }); + } + + async run(message, args) { + const match = message.content.match(/\d{18}/); + + let member = match ? message.guild.members.cache.get(args[1]) : null; + let guild = this.client.guilds.cache.get(args[1]); + let reason = args.slice(2).join(' ') || 'Not Specified'; + + if (args.length < 1) return message.channel.send('<:sbdeny:736927045522817106> You have to give me the blacklist type: `user` or `guild`') + if (args.length < 2) return message.channel.send('<:sbdeny:736927045522817106> You have to give me a user to blacklist!') + if (args.length < 3) return message.channel.send('<:sbdeny:736927045522817106> You have to give me a reason for blacklist!') + + //.then(logger.info(`I have added ${member.user.tag} to the blacklist!`, { label: 'Blacklist' })) + + if (args[0].includes('user')) { + await Blacklist.findOne({ + discordId: member.id, + }, (err, user) => { + user.deleteOne() + }) + message.channel.send({ + embed: { + color: "BLURPLE", + title: 'User removed from the blacklist!', + description: `${member.user.tag} - \`${reason}\``, + } + }); + + const embed = new MessageEmbed() + .setColor('BLURPLE') + .setTitle(`Blacklist Report`) + .setURL('https://docs.google.com/forms/d/e/1FAIpQLSedBS6JYEqxzXGcs1T9vb7dugZiBxftVrY3CFfk-aP1rFnnrw/viewform?usp=sf_link') + .addField('Status', 'Removed from the blacklist.') + .addField('User', `${member.user.tag} (${member.id})`) + .addField('Responsible', `${message.author} (${message.author.id})`) + .addField('Reason', reason) + + webhookClient.send({ + username: 'Pogy', + avatarURL: 'https://cdn.slaybot.xyz/assets/logos/slaybotlogo.png', + embeds: [embed] + }); + + return; + } + + if (args[0].includes('guild')) { + await Blacklist.findOne({ + guildId: guild.id, + }, (err, server) => { + server.deleteOne() + }) + + message.channel.send({ + embed: { + color: "BLURPLE", + title: 'Server removed from the blacklist!', + description: `${guild.name} - \`${reason}\``, + } + }); + + const embed = new MessageEmbed() + .setColor('BLURPLE') + .setTitle(`Blacklist Report`) + .setURL('https://docs.google.com/forms/d/e/1FAIpQLSedBS6JYEqxzXGcs1T9vb7dugZiBxftVrY3CFfk-aP1rFnnrw/viewform?usp=sf_link') + .addField('Status', 'Removed from the blacklist.') + .addField('Server', `${guild.name} (${guild.id})`) + .addField('Responsible', `${message.author} (${message.author.id})`) + .addField('Reason', reason) + + webhookClient.send({ + username: 'SlayBot', + avatarURL: 'https://cdn.slaybot.xyz/assets/logos/slaybotlogo.png', + embeds: [embed] + }); + } +/* + const embed = new MessageEmbed() + .setTitle(`Blacklist Report`) + .setURL('https://docs.google.com/forms/d/e/1FAIpQLSedBS6JYEqxzXGcs1T9vb7dugZiBxftVrY3CFfk-aP1rFnnrw/viewform?usp=sf_link') + .addField('Status', 'Removed from the blacklist.') + .addField('User', `${member} (${member.id})`) + .addField('Responsible', `${message.author} (${message.author.id})`) + .addField('Reason', reason || 'Not Specified') + + webhookClient.send({ + username: 'SlayBot', + avatarURL: 'https://cdn.slaybot.xyz/assets/logos/slaybotlogo.png', + embeds: [embed] + });*/ + } +}; diff --git a/commands/reactionrole/addreaction.js b/commands/reactionrole/addreaction.js new file mode 100644 index 00000000..5e35349a --- /dev/null +++ b/commands/reactionrole/addreaction.js @@ -0,0 +1,129 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'addreaction', + aliases: ["reactionrole", "rr", "createrr","crr", "addrr", "arr", "rradd"], + description: 'Create a reaction role', + category: 'Reaction Role', + cooldown: 3, + usage: ' (option)', + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let fail = message.client.emoji.fail + let success = message.client.emoji.success + const missingPermEmbed = new MessageEmbed() + .setAuthor(`Missing User Permissions`, message.author.displayAvatarURL()) + .setDescription(`${fail} The following command the **Administrator** Permission`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + + + + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.guild.channels.cache.find(ch => ch.name === args[0]) + if (!channel) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Channel`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + let ID = args[1] + if(!ID) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid message ID`) + .setFooter(`https://pogy.xyz`) + ); + let messageID = await channel.messages.fetch(ID).catch(() => { return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} I could not find the following ID`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); }) + + let role = message.mentions.roles.first() || message.guild.roles.cache.get(args[2]) || message.guild.roles.cache.find(rl => rl.name === args[2]) + if (!role) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Role`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + if(role.managed){ + return message.channel.send(`${message.client.emoji.fail} Please do not use a integration role.`) + } + + let emoji = args[3] + + if (!emoji) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Emoji`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + if (isCustomEmoji(args[3])) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Do Not use custom Emojis!`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + +try { + +await messageID.react(emoji) + +} catch(err){ + return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Please Provide a valid Emoji.`) + .setColor(client.color.red) + .setFooter(`https://pogy.xyz`)); +} + + + let option = args[4] + if(!option) option = 1 + if(isNaN(option)) option = 1 + if(option > 6) option = 1 + + + await react.reactionCreate(client, message.guild.id , ID, role.id, emoji, "false", option); + + message.channel.send(new MessageEmbed() + .setAuthor('Reaction Roles', message.guild.iconURL(),messageID.url) + .setColor(client.color.green) + .addField('Channel', channel, true) + .addField('Emoji', emoji, true) + .addField('Type', option, true) + .addField('Message ID', ID, true) + .addField('Message', `[Jump To Message](${messageID.url})`, true) + .addField('Role', role, true) + .setFooter('https://pogy.xyz')) + + function isCustomEmoji(emoji) { + return emoji.split(":").length == 1 ? false : true; + } + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/editreactionrole.js b/commands/reactionrole/editreactionrole.js new file mode 100644 index 00000000..a7daf796 --- /dev/null +++ b/commands/reactionrole/editreactionrole.js @@ -0,0 +1,100 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'editreaction', + aliases: ["editreactionrole", "err"], + description: 'Edit the role which a certain reaction give', + category: 'Reaction Role', + cooldown: 3, + usage: ' ', + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let fail = message.client.emoji.fail + let success = message.client.emoji.success + const missingPermEmbed = new MessageEmbed() + .setAuthor(`Missing User Permissions`, message.author.displayAvatarURL()) + .setDescription(`${fail} The following command the **Administrator** Permission`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + + + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.guild.channels.cache.find(ch => ch.name === args[0]) + if (!channel) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Channel`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + let ID = args[1] + if(!ID) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid message ID`) + .setFooter(`https://pogy.xyz`) + ); + let messageID = await channel.messages.fetch(ID).catch(() => { return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} I could not find the following ID`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); }) + + + let role = message.mentions.roles.first() || message.guild.roles.cache.get(args[2]) || message.guild.roles.cache.find(rl => rl.name === args[2]) + if (!role) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Role`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + if(role.managed){ + return message.channel.send(`${message.client.emoji.fail} Please do not use a integration role.`) + } + + + let emoji = message.guild.emojis.cache.find(emoji => emoji.name.toLowerCase() === args[3].toLowerCase()); + + + + await react.reactionEdit(client, message.guild.id , ID, role.id, emoji); + + message.channel.send(new MessageEmbed() + .setAuthor('Reaction Roles Edit', message.guild.iconURL(),messageID.url) + .setColor(client.color.green) + .addField('Channel', channel, true) + .addField('Emoji', emoji, true) + .addField('Type', option, true) + .addField('Message ID', ID, true) + .addField('Message', `[Jump To Message](${messageID.url})`, true) + .addField('Role', role, true) + .setFooter('https://pogy.xyz')) + + + function isCustomEmoji(emoji) { + return emoji.split(":").length == 1 ? false : true; + } + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/reactionrolebuilder.js b/commands/reactionrole/reactionrolebuilder.js new file mode 100644 index 00000000..b7464095 --- /dev/null +++ b/commands/reactionrole/reactionrolebuilder.js @@ -0,0 +1,164 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rrbuilder', + aliases: ["rrb", "reactionrolebuilder", "reactionbuilder", "rolebuilder"], + description: 'Start a prompt and create your reaction role', + category: 'Reaction Role', + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let fail = message.client.emoji.fail + let success = message.client.emoji.success + const missingPermEmbed = new MessageEmbed() + .setAuthor(`Missing User Permissions`, message.author.displayAvatarURL()) + .setDescription(`${fail} The following command the **Administrator** Permission`) + .setFooter(`https://pogy.xyz`) + + + + const cancelledEmbed = new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${success} Reaction Builder Cancelled!`) + .setFooter(`https://pogy.xyz`) + + const cancelledEmbed2 = new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Wrong Response, Reaction Builder Cancelled!`) + .setFooter(`https://pogy.xyz`) + + const timeEnd = new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Time has Ended, Reaction Builder Cancelled!`) + .setFooter(`https://pogy.xyz`) +const filter = m => m.author.id === message.author.id + +message.channel.send("Please specify a channel! **[channel / ID]**\n\n**Type Cancel to cancel**").then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"] }).then(async collected => { + let channel = collected.first().content + let channelMention = collected.first().mentions + let channelToSend = channelMention.channels.first() || message.guild.channels.cache.get(channel.toLowerCase()) || message.guild.channels.cache.find(ch => ch.name === channel.toLowerCase()) + + if(channel.toLowerCase() === 'cancel'){ + message.channel.send(cancelledEmbed) + return; + } + + if(!channelToSend) return message.channel.send(cancelledEmbed2) + + message.channel.send(`Provide me with a message ID\n\nMake sure the message is in ${channelToSend}\n\n**Type Cancel to Cancel**`).then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"] }).then(async collected1 => { + let ID = collected1.first().content + if(ID.toLowerCase() === 'cancel'){ + message.channel.send(cancelledEmbed) + return; + } + let messageID = await channelToSend.messages.fetch(ID).catch(() => { return message.channel.send(cancelledEmbed2) }) + + message.channel.send("Please provide me with a role **[Role / ID]**\n\nThe following Role will be given when the user reacts!\n\n**Type Cancel to cancel**").then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"] }).then(collected2 => { + let roleName = collected2.first().content + let roleMention = collected2.first().mentions + let role = roleMention.roles.first() || message.guild.roles.cache.find(rl => rl.name === roleName) || message.guild.roles.cache.get(roleName) + if(roleName.toLowerCase() === 'cancel'){ + message.channel.send(cancelledEmbed) + return; + } + if(!role) return message.channel.send(cancelledEmbed2) + if(role.managed){ + return message.channel.send(`${message.client.emoji.fail} Please do not use a integration role.`) + } + //wtf + + message.channel.send("Now Please Provide me with an Emoji, make sure its not a custom One!\n\nThe Following Emoji will be the emoji that the user will react to!\n\n**Type Cancel to cancel**").then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"] }).then(async (collected3) => { + let emoji = collected3.first().content + + + + if (!emoji) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Emoji`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + + if (isCustomEmoji(emoji)) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Do Not use custom Emojis!`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + +try { + +await messageID.react(emoji) + +} catch(err){ + return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Please Provide a valid Emoji.`) + .setColor(client.color.red) + .setFooter(`https://pogy.xyz`)); +} + + message.channel.send("__**Finally Pick:**__\n\n`1` - React adds the role, unreacting removes the role\n`2`- Reacting will give the role but unreaction won't remove the role\n`3` - Reacting will remove the user's role and unreacting won't give it back\n`4` - When reacting it will remove the role, unreacting will add the role\n`5` - Same concept as number 3 but removes the user's reaction\n`6` - React to recieve the role and react again to remove the role").then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"] }).then(collected4 => { + let option = collected4.first().content + let numbers = ["1", "2", "3", "4", "5", "6"] + if(!numbers.includes(option)) return message.channel.send("You must specify between 1, 2, 3, 4 or 5") + + message.channel.send(new MessageEmbed() + .setAuthor('Reaction Roles - Setup Done', message.guild.iconURL(),messageID.url) + .setColor(client.color.green) + .addField('Channel', channelToSend, true) + .addField('Emoji', emoji, true) + .addField('Type', option, true) + .addField('Message ID', ID, true) + .addField('Message', `[Jump To Message](${messageID.url})`, true) + .addField('Role', role, true) + .setFooter('https://pogy.xyz') + ).then(async () => { + messageID.react(emoji) + + await react.reactionCreate(client, message.guild.id , ID, role.id, emoji, "false", option);//ID is MessageID, ignore "false" + + }) + }).catch(err => { message.channel.send(timeEnd) }) + }) + }).catch(err => { message.channel.send(timeEnd) }) + }) + }).catch(err => { message.channel.send(timeEnd) }) + }) + }).catch(err => { message.channel.send(timeEnd) + console.log(err)}) + }) + }).catch(err => { message.channel.send(timeEnd) }) +}) + + function isCustomEmoji(emoji) { + return emoji.split(":").length == 1 ? false : true; + } + } +} diff --git a/commands/reactionrole/removereactionrole.js b/commands/reactionrole/removereactionrole.js new file mode 100644 index 00000000..fd52655b --- /dev/null +++ b/commands/reactionrole/removereactionrole.js @@ -0,0 +1,97 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'removerr', + aliases: ["removereactionrole", "rreactionrole", "deletereactionrole", "delreactionrole", "remrr", "delrr", 'delreaction', 'deletereaction'], + description: 'Create a reaction role', + category: 'Reaction Role', + cooldown: 3, + usage: ' ', + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let fail = message.client.emoji.fail + let success = message.client.emoji.success + const missingPermEmbed = new MessageEmbed() + .setAuthor(`Missing User Permissions`, message.author.displayAvatarURL()) + .setDescription(`${fail} The following command the **Administrator** Permission`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + + let channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.guild.channels.cache.find(ch => ch.name === args[0]) + if (!channel) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Channel`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + let ID = args[1] + if(!ID) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid message ID`) + .setFooter(`https://pogy.xyz`) + ); + let messageID = await channel.messages.fetch(ID).catch(() => { return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} I could not find the following ID`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); }) + + let emoji = args[2] + + if (!emoji) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Provide me with a valid Emoji`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + + + if (isCustomEmoji(args[2])) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} Do Not use custom Emojis!`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ); + + + + await react.reactionDelete(client, message.guild.id , ID, emoji); + + message.channel.send(new MessageEmbed() + .setColor(client.color.green) + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${success} Deleted The [Reaction Role](${messageID.url})`) + .setFooter(`https://pogy.xyz`)) + + + + function isCustomEmoji(emoji) { + return emoji.split(":").length == 1 ? false : true; + } + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/rrdirectmessages.js b/commands/reactionrole/rrdirectmessages.js new file mode 100644 index 00000000..4d5546dd --- /dev/null +++ b/commands/reactionrole/rrdirectmessages.js @@ -0,0 +1,115 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rrdm', + aliases: ["reactionrolesdm", "rrdirectmessages"], + description: 'Enable / Disable Reaction Role DMs', + category: 'Reaction Role', + cooldown: 3, + usage: 'on / off', + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let fail = message.client.emoji.fail + let success = message.client.emoji.success + const prefix = guildDB.prefix; + + if(guildDB.isPremium == "false"){ + return message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${fail} Slow down here, the current command is only for premium guilds.\n\n[Check Premium Here](https://pogy.xyz/premium)`))} + + const missingPermEmbed = new MessageEmbed() + .setAuthor(`Missing User Permissions`, message.author.displayAvatarURL()) + .setDescription(`${fail} The following command the **Administrator** Permission`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + + let properUsage = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`__**Proper Usage**__\n\n\`1-\` ${prefix}rrdm on\n\`2-\` ${prefix}rrdm off`) + .setFooter('https://pogy.xyz') + + if (args.length < 1) { + return message.channel.send(properUsage); + } + + + if (args.includes('disable') || args.includes('off')) { + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + if(guild.reactionDM === false) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} DMs are already disabled`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ) + guild.updateOne({ + reactionDM: false + }) + .catch(err => console.error(err)); + +message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${success} Reaction Role DMs have been disabled!`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ) + }) + } else if (args.includes('enable') || args.includes('on')) { + + + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + + if(guild.reactionDM === true) return message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${fail} DMs are already enabled`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red)) + guild.updateOne({ + reactionDM: true + }) + .catch(err => console.error(err)); + + +message.channel.send(new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`${success} Reaction Role DMs have been enabled!`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + ) + + }) + + } else if(args[0]) { + message.channel.send(properUsage) + } else { + message.channel.send(properUsage) + + } + + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/rrlogs.js b/commands/reactionrole/rrlogs.js new file mode 100644 index 00000000..c541b6ca --- /dev/null +++ b/commands/reactionrole/rrlogs.js @@ -0,0 +1,36 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rrlog', + aliases: ["reactionrolelog", "rrlogs"], + description: 'Set reaction role Logs in the guild.', + category: 'Reaction Role', + cooldown: 3, + usage: 'enable ', + disabled: true, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + // not finished + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/rrtypes.js b/commands/reactionrole/rrtypes.js new file mode 100644 index 00000000..92917a66 --- /dev/null +++ b/commands/reactionrole/rrtypes.js @@ -0,0 +1,45 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/index.js") +const react = new ReactionRole() +const config = require("../../config.json"); +react.setURL(config.mongodb_url) + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rrtypes', + aliases: ["rrtype", "reactionroletypes"], + description: 'Enable / Disable Reaction Role DMs', + category: 'Reaction Role', + cooldown: 3, + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + let fail = message.client.emoji.fail; + let success = message.client.emoji.success; + + + const embedType = new MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + .setDescription(`\`Type 1\` - React adds the role, unreacting removes the role\n\`Type 2\` - Reacting will give the role but unreaction won't remove the role\n\`Type 3\` - Reacting will remove the user's role and unreacting won't give it back\n\`Type 4\` - When reacting it will remove the role, unreacting will add the role\n\`Type 5\` - Same concept as number 3 but removes the user's reaction\n\`Type 6\` - React to recieve the role and react again to remove the role`) + .setFooter(`https://pogy.xyz`) + .setColor(client.color.red) + +message.channel.send(embedType) + + + } +}; \ No newline at end of file diff --git a/commands/reactionrole/rrwipe.js b/commands/reactionrole/rrwipe.js new file mode 100644 index 00000000..f657783f --- /dev/null +++ b/commands/reactionrole/rrwipe.js @@ -0,0 +1,78 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); + +const ReactionRole = require("../../packages/reactionrole/models/schema") +const config = require("../../config.json"); + + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'rrwipe', + aliases: ["reactionrolewipe", "reactionroleswipe"], + description: 'Wipe all reaction Roles from the current guild', + category: 'Reaction Role', + cooldown: 3, + userPermission: ['MANAGE_GUILD'], + }); + } + + async run(message, args) { + let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + +const conditional = { + guildid: message.guild.id +} +const results = await ReactionRole.find(conditional) + +if (results && results.length) { + for (const result of results) { + const { guildid } = result + + try { + await ReactionRole.deleteOne(conditional) + } catch (e) { + console.log(e) + } + + } + +} + + +let resultsHeheLol = results.length +let resultsHehe = `reaction roles` +if (resultsHeheLol == '1') resultsHehe = 'reaction role'; + +if (resultsHeheLol === '0' || !results || !results.length){ + +let wipeEmbed3 = new MessageEmbed() +.setColor(message.client.color.green) +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`The Current Guild has no Existing Reaction Roles!`) +.setFooter(`https://pogy.xyz`) + +message.channel.send(wipeEmbed3) + + return; +} + +let wipeEmbed = new MessageEmbed() +.setColor(message.client.color.green) +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`Successfuly deleted **${results.length}** ${resultsHehe}`) +.setFooter(`https://pogy.xyz`) + + +message.channel.send(wipeEmbed) + } +}; \ No newline at end of file diff --git a/commands/ticket/add.js b/commands/ticket/add.js new file mode 100644 index 00000000..e4dd90b3 --- /dev/null +++ b/commands/ticket/add.js @@ -0,0 +1,67 @@ +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "tadd", + aliases: ["ticketadd"], + description: "Add a member to the current ticket", + usage: "", + category: "Tickets" + }) + } + + async run (message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + let userToMention = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + if(!userToMention) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addNotSpecifyUser)) + + await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) return + + try { + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID); + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID); + + if(!message.member.roles.cache.has(ticketRole.id)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.claimNotHaveRole.replace("{roleName}", ticketRole.name))) + + if(!message.channel.name.startsWith("ticket-")) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addNotValidChannel)) + + let pogy = message.guild.me + let everyone = message.guild.roles.everyone; + let author = message.author + + message.channel.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + message.channel.updateOverwrite(everyone, { VIEW_CHANNEL: false }); + + message.channel.updateOverwrite(author, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + message.channel.updateOverwrite(userToMention.id, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + if(ticketRole) { + message.channel.updateOverwrite(ticketRole, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + + message.react(client.emoji.check) + + + + } catch (e) { + message.channel.send(`An error has occured: ${e}\nSend this in the support server.`) + + } + }) + } +} \ No newline at end of file diff --git a/commands/ticket/claim.js b/commands/ticket/claim.js new file mode 100644 index 00000000..01506e8e --- /dev/null +++ b/commands/ticket/claim.js @@ -0,0 +1,56 @@ +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "claim", + description: "Claim a ticket to assist the user.", + aliases: [], + cooldown: 3, + usage: ' ', + category: "Tickets" + }) + } + + async run(message, args) { + const client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + const ticketFetch = await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) return + + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID); + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID); + + if(!message.member.roles.cache.has(ticketRole.id)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.claimNotHaveRole.replace("{roleName}", ticketRole.name))) + + if(!message.channel.name.startsWith("ticket-")) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.claimNotValidChannel)) + + message.channel.updateOverwrite(message.author, { + VIEW_CHANNEL: true + }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + message.channel.updateOverwrite(ticketRole.id, { + VIEW_CHANNEL: false + }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + + let pogy = message.guild.me; + let everyone = message.guild.roles.everyone; + + message.channel.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + message.channel.updateOverwrite(everyone, { VIEW_CHANNEL: false }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.claimSuccess.replace("{userName}", message.author.username))) + }) + } +} \ No newline at end of file diff --git a/commands/ticket/close.js b/commands/ticket/close.js new file mode 100644 index 00000000..0f12db6b --- /dev/null +++ b/commands/ticket/close.js @@ -0,0 +1,129 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") +const reactionTicket = require("../../models/tickets.js") +const date = require('date-and-time') +const transcriptSchema = require("../../models/transcript.js"); +const randoStrings = require("randostrings") +const random = new randoStrings +const moment = require('moment') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "closeticket", + aliases: ["close", "ticketclose", "tclose"], + description: "Close an Opened Ticket!", + category: "Tickets", + cooldown: 3, + botPermission: ['MANAGE_CHANNELS'] + }) + } + + async run(message, args) { + const client = message.client; + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + if (!message.channel.name.startsWith('ticket-')) return message.channel.send(new MessageEmbed().setColor('PURPLE').setTitle('Close a ticket').setDescription(`Unable to close ticket, it seems like you aren't in any ticket channel.`) + .setFooter('https://pogy.xyz') + .setTimestamp()).then(m => { + message.delete().catch(()=>{}) + setTimeout(() => { + m.delete().catch(()=>{}) + }, 10000); + }); + + await reactionTicket.findOne({ + guildID: message.guild.id, + }, async(err, db) => { + + + if(!db) return; + + let channelReact = message.guild.channels.cache.get(db.ticketModlogID) + + + + + let reason = args.slice(0).join(" ") + if(!reason) reason = "No reason Was Provided" + +const role = message.guild.roles.cache.get(db.supportRoleID); +if(db.ticketClose == "false"){ +if(role){ +if(!message.member.roles.cache.find(r => r.name.toLowerCase() === role.name.toLowerCase())) return message.channel.send(new discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} Only users with the support team role Can Close this Ticket`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); +} +}; + + +if(!message.channel) return; + +await message.channel.messages.fetch() +.then(async (messages) => { + + + let text = ""; + +let ticketID = random.password({ + length: 8, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + }) + + const paste = new transcriptSchema({ + _id: ticketID, + type: "ticket", + by: message.author.id, + expiresAt: new Date(Date.now() + (1036800000)) + }); + + for (const message of messages.array().reverse()) { + + + + if(message && message.content && message.author.id){ + paste.paste.push(`${message.content}`) + paste.paste2.push(message.author.id) + } else if(message && message.embeds && message.author.id){ + paste.paste.push(`(embed sent)`) + paste.paste2.push(message.author.id) + } + + + } + + + + if(channelReact){ +let color2 = db.ticketLogColor + if(color2 == "#000000") color2 = `#36393f`; + +let closeEmbed = new MessageEmbed() + .setColor(color2) + .setTitle("Ticket Closed") + .addField("Information" , `**User:** ${message.author}\n**Ticket Channel:** #${message.channel.name}\n**Reason:** ${reason}\n**Date:** ${moment(new Date()).format("dddd, MMMM Do YYYY")}\n**Transcript:** [here](https://pogy.xyz/paste/${ticketID})`) + + channelReact.send(closeEmbed).catch(()=>{}) + message.author.send(closeEmbed).catch(()=>{}) + } + + + await paste.save().catch(()=>{}) + + + + +}).catch(()=>{}) + + message.channel.delete({timeout: 2000}).catch(()=>{}) + + + + + }); + + } + +} \ No newline at end of file diff --git a/commands/ticket/ticket.js b/commands/ticket/ticket.js new file mode 100644 index 00000000..b2e3a706 --- /dev/null +++ b/commands/ticket/ticket.js @@ -0,0 +1,150 @@ +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const moment = require("moment") +const Discord = require('discord.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "ticket", + aliases: ["create"], + description: "Create a ticket via a command if option is message", + usage: ' ', + category: "Tickets", + botPermission: ["MANAGE_CHANNELS"] + }) + } + + async run(message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + + const ticketFetch = await ticketSchema.findOne({ + guildID: message.guild.id, + }, async (err, db) => { + if(!db) return; + if(db.ticketType !== "message") return message.channel.send(new Discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} This Feature is disabled in the current guild`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + if(db.ticketToggle == "false") return message.channel.send(new Discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} This Feature is disabled in the current guild`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID) + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID) + + let pogy = message.guild.me; + let everyone = message.guild.roles.everyone + + let user = message.author + + + let reason = args.slice(0).join(" "); + + if(db.requireReason == "true"){ + if (!reason) return message.channel.send(new Discord.MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${message.client.emoji.fail} Please provide a reason`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + } + + + + try { + let id = user.id.toString().substr(0, 4) + user.discriminator; + let chann = `ticket-${id}`; + +let array = [] + + message.guild.channels.cache.forEach(channel => { + if(channel.name == chann) array.push(channel.id) + }) + + +let ticketlimit = db.maxTicket +if(!ticketlimit) ticketlimit = 1 + +let arraylength = array.length + + + if(arraylength > ticketlimit || arraylength == ticketlimit) { + + message.react(client.emoji.fail) + return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`You already have ${arraylength} open tickets, as the current guild's ticket limit is ${ticketlimit} `).setAuthor(message.author.tag, message.author.displayAvatarURL()).setFooter('https://pogy.xyz')).then(m => m.delete({timeout: 5000})) + } + + message.react(client.emoji.check) + +message.guild.channels.create(chann, { type: "text" }) + .then(async (chan) => { + if(pogy) { + chan.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + chan.updateOverwrite(message.guild.me, { SEND_MESSAGES: true }).catch(()=>{}) + chan.updateOverwrite(everyone, { VIEW_CHANNEL: false }); + + chan.updateOverwrite(user, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + if(ticketRole) { + chan.updateOverwrite(ticketRole, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + let serverCase = db.ticketCase + if(serverCase === null) serverCase = 1 + await db.updateOne({ticketCase: serverCase + 1}); + + let member = message.author; + let color = db.ticketWelcomeColor + if(color == "#000000") color = message.guild.me.displayHexColor + + if(db.ticketPing == "true"){ + + chan.send(`${member} ${ticketRole}`).catch(()=>{}) + + } + let reasonx = args.slice(0).join(" ") + if(!reasonx) reasonx = `No reason Provided`; + if(reasonx.length > 1024 ) reasonx = `Reason Too Long`; + if(reason.length > 1024 ) reasonx = `Reason Too Long`; + + chan.send(new discord.MessageEmbed() + .setAuthor(message.author.tag, message.author.displayAvatarURL()) + + .setDescription(db.ticketWelcomeMessage + .replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.tag}`) + .replace(/{user_name}/g, `${member.username}`) + .replace(/{reason}/g, reasonx) + .replace(/{user_ID}/g, `${member.id}`) || language.ticketNewTicketWaitForAssistant) + + .setColor(color) + ).catch(()=>{}) + + if(ticketCategory){ + chan.setParent(ticketCategory.id) + } + + chan.setTopic(`${language.ticketOpenedBy} ${user.tag} (${user.id})`).catch(() => {}) + + let color2 = db.ticketLogColor + if(color2 == "#000000") color2 = `#36393f`; + + const embedLog = new discord.MessageEmbed() + .setColor(color2) + .setFooter('https://pogy.xyz') + .setTitle(language.ticketNewTicketTitle) + .setTimestamp() + //.addField("Information" , `**User:** ${user}\n**Ticket Channel: **${chan.name}\n**Ticket:** #${serverCase}\n**Date:** ${moment(new Date()).format("dddd, MMMM Do YYYY")} `) + .addField(language.ticketEmbedTitleInfo, language.ticketEmbedValueInfo.replace("{user}", `${user}`).replace("{chanName}", chan.name).replace("{serverCase}", serverCase).replace("{ticketDate}", moment(new Date()).format("dddd, MMMM Do YYYY"))) + + if(ticketLog) { + ticketLog.send(embedLog).catch(() => {}) + } +}) + } catch (e) { + message.channel.send(`An error has occured: ${e}\nSend this in the support server.`) + } + }) + + } +} \ No newline at end of file diff --git a/commands/ticket/tremove.js b/commands/ticket/tremove.js new file mode 100644 index 00000000..a78fd949 --- /dev/null +++ b/commands/ticket/tremove.js @@ -0,0 +1,66 @@ +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "trem", + aliases: ["ticketrem", "tremove", "ticketremove"], + description: "remove a member from the current ticket", + usage: "", + category: "Tickets" + }) + } + + async run (message, args) { + const client = message.client + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + let userToMention = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + if(!userToMention) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addNotSpecifyUser)) + + await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) return + + try { + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID); + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID); + + if(!message.member.roles.cache.has(ticketRole.id)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.claimNotHaveRole.replace("{roleName}", ticketRole.name))) + + if(!message.channel.name.startsWith("ticket-")) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.addNotValidChannel)) + + let pogy = message.guild.me + let everyone = message.guild.roles.everyone; + let author = message.author + + message.channel.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + message.channel.updateOverwrite(everyone, { VIEW_CHANNEL: false }); + + message.channel.updateOverwrite(author, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + message.channel.updateOverwrite(userToMention.id, { VIEW_CHANNEL: null, READ_MESSAGES: null, SEND_MESSAGES: null, READ_MESSAGE_HISTORY: null, ATTACH_FILES: null }); + + if(ticketRole) { + message.channel.updateOverwrite(ticketRole, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + + message.react(client.emoji.check) + + + } catch (e) { + message.channel.send(`An error has occured: ${e}\nSend this in the support server.`) + + } + }) + } +} \ No newline at end of file diff --git a/commands/ticket/tsetup.js b/commands/ticket/tsetup.js new file mode 100644 index 00000000..47742491 --- /dev/null +++ b/commands/ticket/tsetup.js @@ -0,0 +1,376 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "ticketsetup", + aliases: ["tsetup", "t-setup", "ticket-setup"], + description: "Setup a ticket system in your discord server with alot of option", + category: "Tickets", + cooldown: 3, + botPermission: ["ADD_REACTIONS"] + }) + } + + async run(message, args) { + const client = message.client; + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + if(!message.member.hasPermission("ADMINISTRATOR")) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupNoPerms)) + + let filter = m => m.author.id === message.author.id; + + + + + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.ticketsetupToChooseFrom)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected => { + let choice = collected.first().content + let toChooseFrom = ["reaction", "message"] + + + if(choice.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(`${language.ticketPromptseggs}`)) + + if(!toChooseFrom.includes(choice.toLowerCase())){ + +message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupInvalidChoice.replace("{toChooseFrom}", toChooseFrom.join(", ")))) + + +return; + + } + + //Reaction ticket + if(choice.toLowerCase() === "reaction") { + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(`${language.ticketsetupReaction}`).setDescription(language.ticketsetupReactionChannelID)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected2 => { + let channel = collected2.first().content + let channelMention = collected2.first().mentions + let channelToSend = channelMention.channels.first() || message.guild.channels.cache.get(channel) || message.guild.channels.cache.find(ch => ch.name === channel.toLowerCase()) + if (channel.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + if(!channelToSend) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionInvalidChannel)) + + message.channel.send(new discord.MessageEmbed().setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomChoice).setColor(client.color.green)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected3 => { + let choice = collected3.first().content + let choices = ["custom", "bot"] + if(!choices.includes(choice.toLowerCase())) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupInvalidChoice.replace("{toChooseFrom}", toChooseFrom.join(", ")))) + + //custom message from user + if(choice.toLowerCase() === "custom") { + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomMessageID)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(async collected4 => { + + let ID = collected4.first().content + if (ID.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + let messageID = await channelToSend.messages.fetch(ID).catch(() => { return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidMessageID)); + }) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomCategory)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected5 => { + let categoryChannelName = collected5.first().content + let categoryChannel = message.guild.channels.cache.find(ch => ch.name.toLowerCase().includes(categoryChannelName.toLowerCase())) || message.guild.channels.cache.get(categoryChannelName) + + if (categoryChannelName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!categoryChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidCategory)) + + if(categoryChannel.type !== "category") return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomNotCategory)) + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomRole)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected6 => { + let roleName = collected6.first().content + let roleMention = collected6.first().mentions + let role = message.guild.roles.cache.get(roleName) || message.guild.roles.cache.find(rl => rl.name.toLowerCase().includes(roleName.toLowerCase())) || roleMention.roles.first() + + if (roleName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!role) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidRole)) + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomModLogs)).then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected7 => { + let modlog = collected7.first().content + let modlogMention = collected7.first().mentions + let modlogChannel = modlogMention.channels.first() || message.guild.channels.cache.get(modlog) || message.guild.channels.cache.find(ch => ch.name === modlog.toLowerCase()) + if (modlog.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!modlogChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionInvalidChannel)) + + + + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomSuccess.replace("{option}", choice.toLowerCase()))) + .then(async () => { + messageID.react("🎫"); + await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, guild) => { + if(!guild){ + const newGuild = await ticketSchema.create({ + guildID: message.guild.id, + ticketReactChannel: channelToSend.id, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketCustom: "true", + ticketType: "reaction", + ticketToggle: "true" + }); + newGuild.messageID.push(ID) + newGuild.save() + return; + } + let newTicketSchema = await ticketSchema.findOne({ + guildID: message.guild.id + }) + + +const array = guild.messageID +array.push(ID) + await ticketSchema.updateOne({ + guildID: message.guild.id, + ticketReactChannel: channelToSend.id, + messageID: array, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketType: "reaction", + ticketCustom: "true", + ticketToggle: "true" + }) + + }); + + }) + }).catch(err => { + + message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + + + }) + + }) + }).catch(err => { + + message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); }) + }) + + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + + }) + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + }) + }) + } + + //message from bot + if(choice.toLowerCase() === "bot") { + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomCategory)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected5 => { + let categoryChannelName = collected5.first().content + let categoryChannel = message.guild.channels.cache.find(ch => ch.name.toLowerCase().includes(categoryChannelName.toLowerCase())) || message.guild.channels.cache.get(categoryChannelName) + + if (categoryChannelName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + if(!categoryChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidCategory)) + if(categoryChannel.type !== "category") return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomNotCategory)) + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomRole)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected6 => { + let roleName = collected6.first().content + let roleMention = collected6.first().mentions + let role = message.guild.roles.cache.get(roleName) || message.guild.roles.cache.find(rl => rl.name.toLowerCase().includes(roleName.toLowerCase())) || roleMention.roles.first() + + if (roleName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!role) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidRole)) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomModLogs)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected7 => { + let modlog = collected7.first().content + let modlogMention = collected7.first().mentions + let modlogChannel = modlogMention.channels.first() || message.guild.channels.cache.get(modlog) || message.guild.channels.cache.find(ch => ch.name === modlog.toLowerCase()) + + if (modlog.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!modlogChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionInvalidChannel)) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomSuccess.replace("{option}", choice.toLowerCase()))) + .then(async () => { + let m = await channelToSend.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketTicketWord).setDescription(language.ticketHowToCreate).setFooter('https://pogy.xyz')) + m.react("🎫"); + + await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, guild) => { + if(!guild){ + const newGuild = await ticketSchema.create({ + guildID: message.guild.id, + ticketReactChannel: channelToSend.id, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketType: "reaction", + ticketCustom: "false", + ticketToggle: "true" + }); + newGuild.messageID.push(m.id); + + newGuild.save() + return; + } + let newTicketSchema = await ticketSchema.findOne({ + guildID: message.guild.id + }) + + + +const array = guild.messageID; +array.push(m.id) + await ticketSchema.updateOne({ + guildID: message.guild.id, + ticketReactChannel: channelToSend.id, + messageID: array, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketType: "reaction", + ticketCustom: "false", + ticketToggle: "true" + }) + + }); + + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + }) + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + }) + }) + + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + }) + }) + } + + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)); + }) + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)) + +}) + }) + } + + if(choice.toLowerCase() === "message") { + //return message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupMessage).setDescription("Coming soon")).then(m => m.delete({timeout: 5000})) + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupMessage).setDescription(language.ticketsetupReactionCustomCategory)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(async collected5 => { + let categoryChannelName = collected5.first().content + let categoryChannel = message.guild.channels.cache.find(ch => ch.name.toLowerCase().includes(categoryChannelName.toLowerCase())) || message.guild.channels.cache.get(categoryChannelName) + if (categoryChannelName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + + if(!categoryChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidCategory)) + if(categoryChannel.type !== "category") return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomNotCategory)) + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupMessage).setDescription(language.ticketsetupReactionCustomRole)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected6 => { + let roleName = collected6.first().content + let roleMention = collected6.first().mentions + let role = message.guild.roles.cache.get(roleName) || message.guild.roles.cache.find(rl => rl.name.toLowerCase().includes(roleName.toLowerCase())) || roleMention.roles.first() + if (roleName.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + if(!role) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupReactionCustomInvalidRole)) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupMessage).setDescription(language.ticketsetupReactionCustomModLogs)) + .then(() => { + message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ["time"]}) + .then(collected7 => { + let modlog = collected7.first().content + let modlogMention = collected7.first().mentions + let modlogChannel = modlogMention.channels.first() || message.guild.channels.cache.get(modlog) || message.guild.channels.cache.find(ch => ch.name === modlog.toLowerCase()) + + if (modlog.toLowerCase() === 'cancel') return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupReaction).setDescription(`${language.ticketPromptseggs}`)) + if(!modlogChannel) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setTitle(language.ticketsetupMessage).setDescription(language.ticketsetupReactionInvalidChannel)) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setTitle(language.ticketsetupReaction).setDescription(language.ticketsetupReactionCustomSuccess.replace("{option}", choice.toLowerCase()))) + .then(async () => { + await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, guild) => { + if(!guild){ + const newGuild = await ticketSchema.create({ + guildID: message.guild.id, + ticketReactChannel: null, + messageID: null, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketType: "message" + }); + newGuild.save() + return; + } + let newTicketSchema = await ticketSchema.findOne({ + guildID: message.guild.id + }) + + + await ticketSchema.updateOne({ + guildID: message.guild.id, + ticketReactChannel: null, + messageID: null, + supportRoleID: role.id, + categoryID: categoryChannel.id, + ticketModlogID: modlogChannel.id, + ticketType: "message", + ticketToggle: "true" + }) + }); + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded)) +console.log(err) + }) + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded))}) + }) + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded))}) + }) + } + }).catch(err => { message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.ticketsetupTimeEnded))}) + }) + } + +} \ No newline at end of file diff --git a/commands/ticket/unclaim.js b/commands/ticket/unclaim.js new file mode 100644 index 00000000..ab5272f0 --- /dev/null +++ b/commands/ticket/unclaim.js @@ -0,0 +1,57 @@ +const discord = require("discord.js") +const ticketSchema = require("../../models/tickets.js") +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "unclaim", + description: "Unclaim a ticket so another ticket support or staff claims it again", + aliases: [], + cooldown: 3, + usage: ' ', + category: 'Tickets' + }) + } + + async run(message, args) { + const client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`) + + + const ticketFetch = await ticketSchema.findOne({ + guildID: message.guild.id + }, async (err, db) => { + if(!db) return + + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID); + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID); + + if(!message.member.roles.cache.has(ticketRole.id)) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.unclaimNotHaveRole.replace("{roleName}", ticketRole.name))) + + if(!message.channel.name.startsWith("ticket-")) return message.channel.send(new discord.MessageEmbed().setColor(client.color.red).setDescription(language.unclaimNotValidChannel)) + + + message.channel.updateOverwrite(message.author, { + VIEW_CHANNEL: null + }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + message.channel.updateOverwrite(ticketRole.id, { + VIEW_CHANNEL: true + }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + + let pogy = message.guild.me; + let everyone = message.guild.roles.everyone; + + message.channel.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + message.channel.updateOverwrite(everyone, { VIEW_CHANNEL: false }).catch(err => { message.channel.send(new discord.MessagEmbed().setColor(client.color.red).setDescription(language.unclaimDontHavePerms))}) + + message.channel.send(new discord.MessageEmbed().setColor(client.color.green).setDescription(language.unclaimSuccess.replace("{userName}", message.author.username))) + }) + } +} \ No newline at end of file diff --git a/commands/utility/bug.js b/commands/utility/bug.js new file mode 100644 index 00000000..0f46e945 --- /dev/null +++ b/commands/utility/bug.js @@ -0,0 +1,85 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Discord = require('discord.js'); +const webhookClient = new Discord.WebhookClient('', ''); +const Guild = require('../../database/schemas/Guild'); +const crypto = require("crypto"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'reportbug', + aliases: ['bugreport', 'bug'], + description: 'Report bugs to Pogy!', + category: 'Utility', + usage: [ '' ], + cooldown: 60 + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + var id = crypto.randomBytes(4).toString('hex'); + + if (args.length < 1) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.report1}`)); + } + + if (args.length < 3) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.report2}`)); + } + +let invite = await message.channel.createInvite({ + maxAge: 0, + maxUses: 0 +}).catch(() => {}); + +let report = args.join(' ').split('').join('') + const embed = new MessageEmbed() + .setTitle('Bug Report') + .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) + .setDescription(report) + .addField('User', message.member, true) + .addField('User username', message.member.user.username, true) + .addField('User ID', message.member.id, true) + .addField('User Tag', message.member.user.tag, true) + .addField('Server', `[${message.guild.name}](${invite ||'none '})`, true) + .addField('Bug Report ID:', `#${id}`, true) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor('GREEN'); + + const confirmation = new MessageEmbed() + .setTitle('Bug Report') + .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.report3} Support [**Server**](https://discord.gg/FqdH4sfKBg)`) + .addField('Member', message.member, true) + .addField('Message', report, true) + .addField('Bug Report ID:', `#${id}`, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor('GREEN'); + + + + webhookClient.send({ + username: 'Pogy Bug Report', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embed], + }); + + message.author.send(confirmation).catch(()=>{}) + message.delete().catch(()=>{}) + + } +}; \ No newline at end of file diff --git a/commands/utility/chat.js b/commands/utility/chat.js new file mode 100644 index 00000000..f6d7c1ad --- /dev/null +++ b/commands/utility/chat.js @@ -0,0 +1,22 @@ +const Command = require('../../structures/Command'); +const chatcord = require('chatcord'); +const chat = new chatcord.Client(); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'chat', + description: `Chat with the bot!`, + category: 'Utility', + usage: '', + guildOnly: true, + cooldown: 5, + }); + } + + async run(message, args) { + chat.chat(args).then(reply => { + message.channel.send(reply) + }) + } +}; \ No newline at end of file diff --git a/commands/utility/discrim.js b/commands/utility/discrim.js new file mode 100644 index 00000000..b3135df6 --- /dev/null +++ b/commands/utility/discrim.js @@ -0,0 +1,55 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const PROTOCOL_REGEX = /^[a-zA-Z]+:\/\// +const PATH_REGEX = /(\/(.+)?)/g + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'discrim', + aliases: [ 'discriminator', 'discrims', 'discrim-search', 'discriminator-search' ], + description: 'Shows a list of members with the same discriminator.', + category: 'Utility', + usage: '[discriminator]', + examples: [ 'discriminator 0001' ], + guildOnly: true, + cooldown: 10 + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + if (!/^\d{4}$/.test(args[0])) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.discrim1}`)); + } + + let members = this.client.users.cache.filter(user => user.discriminator === args[0]).map(user => user.tag); + let total = members.length; + members = members.length > 0 ? members.slice(0, 10).join('\n') : `${language.none}`; + + await message.channel.send({ + embed: { + color: 'BLURPLE', + title: `${language.discrim2}`, + description: `${language.discrim3} **${total}** ${language.discrim4} **${args[0] || message.author.discriminator}**`, + fields: [ + { + name: 'Users', + value: total > 10 ? `${members} and ${total - 10} more.` : members + } + ] + } + }); + } +}; \ No newline at end of file diff --git a/commands/utility/editsnipe.js b/commands/utility/editsnipe.js new file mode 100644 index 00000000..a8ec8ada --- /dev/null +++ b/commands/utility/editsnipe.js @@ -0,0 +1,77 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment') +const Snipe = require('../../database/schemas/editsnipe') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'editsnipe', + description: 'Snipe Edited Messages in the channel', + category: 'Utility', + usage: [ 'editsnipe' ], + cooldown: 10, + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix; +let fail = message.client.emoji.fail; +let client = message.client + +let channel = message.mentions.channels.first(); +if(!channel) channel = message.channel + +const snipe = await Snipe.findOne({ guildId: message.guild.id, channel: channel.id}) + +const no = new MessageEmbed() +.setAuthor(`#${channel.name} | ${message.guild.name}`, message.guild.iconURL()) + .setFooter(message.guild.name) + .setTimestamp() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} | Couldn't find any edited message in **${channel.name}**`) + +if(!snipe){ + return message.channel.send(no) +} + +if(snipe.oldmessage.length < 1){ + return message.channel.send(no) +} +if(snipe.newmessage.length < 1){ + return message.channel.send(no) +} + +const data = [] + + const embed = new MessageEmbed() + .setAuthor(`#${channel.name} | ${message.guild.name}`, message.guild.iconURL()) + .setFooter(message.guild.name) + .setTimestamp() + .setColor(message.guild.me.displayHexColor) + +for (let i = 0; snipe.oldmessage.length > i; i++) { + data.push(`**${i + 1}**`) + + embed.addField(`Message #${i + 1}`, `**User:** ${await message.client.users.fetch(snipe.id[i]) || 'Unknown'}\n**Message:** ${snipe.oldmessage[i] || 'None'} ➜ ${snipe.newmessage[i]}\n[Jump To Message](${snipe.url[i]})\n`) + + }; + + if(data.length < 1) return message.channel.send(no); + + + + message.channel.send(embed).catch(async(err)=>{ + await snipe.deleteOne().catch(()=>{}) + message.channel.send(`The embed contained a huge field that couldn't fit as this is the reason i failed to send the embed. I have resetted the database as you can try rerunning the command again.`) + }) + } +}; diff --git a/commands/utility/embed.js b/commands/utility/embed.js new file mode 100644 index 00000000..b0aaa507 --- /dev/null +++ b/commands/utility/embed.js @@ -0,0 +1,1006 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const customCommand = require('../../database/schemas/customCommand.js'); +let rgx = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; +let embedstarted = new Set(); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'embed', + aliases: ['embedify', 'embedbuilder'], + description: `Make a custom embed builder with Pogy!`, + category: 'Utility', + guildOnly: true, + cooldown: 5, + userPermission: ["MANAGE_MESSAGES"] + }); + } + + async run(message, args) { + let channel = message.mentions.channels.first(); + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + const prefix = guildDB.prefix; + if (embedstarted.has(message.author.id)) + return message.channel + .send( + new MessageEmbed() + .setDescription(`${message.client.emoji.fail} ${language.embedd1} `) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.success} ${language.embedd2} ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + + message.channel + .awaitMessages(m => m.author.id == message.author.id, { + max: 1, + time: 30000 + }) + .then(collected => { + if (collected.first().content.toLowerCase() == 'start') { + embedstarted.add(message.author.id); + message.delete(); + message.channel.send(`${language.embedd3}`).catch(() => {}); + message.channel + .awaitMessages(m => m.author.id == message.author.id, { + max: 1, + time: 30000 + }) + .then(collected => { + let title = collected.first().content; + if (collected.first().content.length < 255) { + if (collected.first().content == 'cancel') + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${language.embed15} ` + ) + .setColor(message.guild.me.displayHexColor) + ) + embedstarted.delete(message.author.id) + ); + message.channel.send(`${language.embedd4}`).catch(() => {}); + message.channel + .awaitMessages(m => m.author.id == message.author.id, { + max: 1, + time: 30000 + }) + .then(collected => { + if (collected.first().content.length < 2048) { + if (collected.first().content == 'cancel') + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor(message.guild.me.displayHexColor) + ) + embedstarted.delete(message.author.id) + ); + + let description = collected.first().content; + message.channel + .send(`${language.embedd5}`) + .catch(() => {}); + message.channel + .awaitMessages(m => m.author.id == message.author.id, { + max: 1, + time: 30000 + }) + .then(collected => { + if ( + collected.first().content.length < 8 || + collected.first().content.toLowerCase() == 'default' + ) { + if (collected.first().content == 'cancel') + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor(message.guild.me.displayHexColor) + ) + embedstarted.delete(message.author.id) + ); + + let color = collected.first().content; + if ( + collected.first().content.toLowerCase() == + 'default' + ) + color = `default`; + + message.channel + .send(`${language.embedd6}`) + .catch(() => {}); + + message.channel + .awaitMessages( + m => m.author.id == message.author.id, + { max: 1, time: 30000 } + ) + .then(collected => { + if ( + rgx.test(collected.first().content) || + collected.first().content.toLowerCase() == + 'none' + ) { + let thumbnail = collected + .first() + .content.toLowerCase(); + message.channel + .send(`${language.embedd7}`) + .catch(() => {}); + + message.channel + .awaitMessages( + m => m.author.id == message.author.id, + { max: 1, time: 30000 } + ) + .then(collected => { + if ( + rgx.test(collected.first().content) || + collected + .first() + .content.toLowerCase() == 'none' + ) { + let image = collected + .first() + .content.toLowerCase(); + + message.channel + .send(`${language.embedd8}`) + .catch(() => {}); + + message.channel + .awaitMessages( + m => + m.author.id == message.author.id, + { max: 1, time: 30000 } + ) + .then(collected => { + if ( + collected.first().content.length < + 2048 || + collected + .first() + .content.toLowerCase() == 'none' + ) { + if ( + collected.first().content == + 'cancel' + ) + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message.client.emoji + .fail + } ${language.embed15} ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + + embedstarted.delete( + message.author.id + ) + ); + + let footer = collected.first() + .content; + let mainfooter = collected.first() + .content; + + if ( + collected + .first() + .content.toLowerCase() == + 'none' + ) + footer = `none`; + + message.channel.send( + `${language.embedd9}` + ); + message.channel + .awaitMessages( + m => + m.author.id == + message.author.id, + { max: 1, time: 30000 } + ) + .then(collected => { + if ( + collected + .first() + .content.toLowerCase() == + 'yes' || + collected + .first() + .content.toLowerCase() == + 'no' + ) { + if ( + collected.first() + .content == 'cancel' + ) + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message.client + .emoji.fail + } ${ + language.embed15 + } ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + + embedstarted.delete( + message.author.id + ) + ); + + let timestamp = `no`; + if ( + collected + .first() + .content.toLowerCase() == + 'yes' + ) + timestamp = `yes`; + + //here + message.channel + .send( + `${language.embedd10}` + ) + .catch(() => {}); + message.channel + .awaitMessages( + m => + m.author.id == + message.author.id, + { max: 1, time: 30000 } + ) + .then(collected => { + if ( + collected + .first() + .content.toLowerCase() == + 'yes' || + collected + .first() + .content.toLowerCase() == + 'no' + ) { + if ( + collected.first() + .content == + 'cancel' + ) + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embed15 + } ` + ) + .setColor( + message + .guild.me + .displayHexColor + ) + ) + + embedstarted.delete( + message.author + .id + ) + ); + + if ( + collected + .first() + .content.toLowerCase() == + 'yes' + ) { + message.channel + .send( + `${ + language.embedd11 + }` + ) + .catch(() => {}); + // do stuff + + message.channel + .awaitMessages( + m => + m.author.id == + message.author + .id, + { + max: 1, + time: 30000 + } + ) + .then( + collected => { + let argword = collected.first() + .content; + var myArray = argword.split( + ' ' + ); + + if ( + myArray.length > + 1 + ) + return ( + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embed15 + } ` + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ) + + embedstarted.delete( + message + .author + .id + ) + ); + if ( + this.client.commands.get( + argword.toLowerCase() + ) || + this.client.aliases.get( + argword.toLowerCase() + ) + ) + return ( + message.channel.send( + `${ + language.embedd12 + }` + ) + + embedstarted.delete( + message + .author + .id + ) + ); + if ( + collected.first() + .content + .length < + 30 + ) { + let name = collected + .first() + .content.toLowerCase(); + let content = `embed`; + customCommand.findOne( + { + guildId: + message + .guild + .id, + name + }, + async ( + err, + data + ) => { + if ( + !data + ) { + customCommand.create( + { + guildId: + message + .guild + .id, + name, + content, + title: title, + description: description, + color: color, + image: image, + thumbnail: thumbnail, + footer: footer, + timestamp: timestamp + } + ); + embedstarted.delete( + message + .author + .id + ); + message.channel.send( + new MessageEmbed() + .setAuthor( + `${ + message + .author + .tag + }`, + message.author.displayAvatarURL( + { + dynamic: true + } + ) + ) + .setDescription( + `${ + language.embedd13 + } \`${prefix}${name}\`` + ) + .setTimestamp() + .setFooter( + 'https://pogy.xyz' + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ); + } else { + return ( + message.channel.send( + `${ + message + .client + .emoji + .fail + } ${ + language.embedd14 + }` + ) + + embedstarted.delete( + message + .author + .id + ) + ); + } + } + ); + + return; + } else + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embed15 + } ` + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ) + + embedstarted.delete( + message + .author + .id + ); + } + ) + .catch(() => { + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embedd16 + } ` + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ) + + embedstarted.delete( + message + .author.id + ); + }); + } else { + message.channel + .send( + `${ + language.embedd17 + }` + ) + .catch(() => {}); + + message.channel + .awaitMessages( + m => + m.author.id == + message.author + .id, + { + max: 1, + time: 30000 + } + ) + .then( + collected => { + let channel = collected + .first() + .mentions.channels.first(); + if (channel) { + let embed = new MessageEmbed() + .setTitle( + title + ) + .setDescription( + description + ) + + .setFooter( + `` + ); + + if ( + image !== + 'none' + ) + embed.setImage( + image + ); + if ( + thumbnail !== + 'none' + ) + embed.setThumbnail( + thumbnail + ); + + if ( + footer !== + 'none' + ) + embed.setFooter( + mainfooter + ); + if ( + timestamp !== + 'no' + ) + embed.setTimestamp(); + if ( + color == + 'default' + ) { + embed.setColor( + message + .guild + .me + .displayHexColor + ); + } else + embed.setColor( + `${color}` + ); + channel.send( + embed + ); + embedstarted.delete( + message + .author + .id + ); + + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embed15 + } ` + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ) + .catch( + () => {} + ); + embedstarted.delete( + message + .author.id + ); + } + ) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embedd16 + } ` + ) + .setColor( + message + .guild + .me + .displayHexColor + ) + ) + .catch( + () => {} + ); + embedstarted.delete( + message.author + .id + ); + }); + } + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message + .client + .emoji + .fail + } ${ + language.embed15 + } ` + ) + .setColor( + message.guild + .me + .displayHexColor + ) + ) + .catch(() => {}); + }) + .catch(() => { + message.channel.send( + new MessageEmbed() + .setDescription( + `${ + message.client + .emoji.fail + } ${ + language.embedd16 + } ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ); + }); + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message.client + .emoji.fail + } ${ + language.embed15 + } ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + .catch(() => {}); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message.client.emoji + .fail + } ${ + language.embedd16 + } ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete( + message.author.id + ); + }); + + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message.client.emoji + .fail + } ${language.embed15}` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete( + message.author.id + ); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${ + message.client.emoji.fail + } ${language.embedd16} ` + ) + .setColor( + message.guild.me + .displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete( + message.author.id + ); + }); + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor( + message.guild.me.displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embedd16 + } ` + ) + .setColor( + message.guild.me.displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }); + + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor( + message.guild.me.displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embedd16 + }` + ) + .setColor( + message.guild.me.displayHexColor + ) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }); + + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embedd16 + } ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }); + + return; + } else + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embed15 + } ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${ + language.embedd16 + }d ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }); + + return; + } else message.reply('stop'); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${language.embedd16} ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }); + + return; + } else message.delete(); + message.channel + .send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${language.embed15} ` + ) + .setColor(message.guild.me.displayHexColor) + ) + .catch(() => {}); + embedstarted.delete(message.author.id); + }) + .catch(() => { + message.channel.send( + new MessageEmbed() + .setDescription( + `${message.client.emoji.fail} ${language.embedd16} ` + ) + .setColor(message.guild.me.displayHexColor) + ); + embedstarted.delete(message.author.id); + }); + } +}; diff --git a/commands/utility/invite.js b/commands/utility/invite.js new file mode 100644 index 00000000..111c830a --- /dev/null +++ b/commands/utility/invite.js @@ -0,0 +1,28 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'invite', + aliases: [ 'inv' ], + description: 'Sends you Pogys invite link', + category: 'Utility', + cooldown: 3 + }); + } + + async run(message) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const embed = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${language.invite}(https://main.pogy.xyz/invite) ${message.client.emoji.success}`); + + await message.channel.send(embed) + } +}; \ No newline at end of file diff --git a/commands/utility/isitup.js b/commands/utility/isitup.js new file mode 100644 index 00000000..983d53e2 --- /dev/null +++ b/commands/utility/isitup.js @@ -0,0 +1,48 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const PROTOCOL_REGEX = /^[a-zA-Z]+:\/\// +const PATH_REGEX = /(\/(.+)?)/g + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'isitup', + aliases: [ 'isitonline' ], + description: 'Checks whether a website is up or down', + category: 'Utility', + usage: '', + cooldown: 3 + }); + } + + async run(message, url) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + if (url.length < 1) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.isitup2}`)); + } + + url = url.toString().replace(PROTOCOL_REGEX, '').replace(PATH_REGEX, '') + const embed = new MessageEmbed() + + const body = await fetch(`https://isitup.org/${url}.json`).then(res => res.json()) + if (body.response_code) { + body.response_time *= 1000 + embed + .setColor('BLURPLE') + .setDescription(`${language.isitup0}\n\n**${body.response_ip}**\n**${body.response_time}ms**\n**${body.response_code}**`) + } else { +embed.setColor(message.client.color.blue) +embed.setDescription(`${message.client.emoji.fail} ${language.isitup3}`) + } + message.channel.send(embed) + } +}; \ No newline at end of file diff --git a/commands/utility/poll.js b/commands/utility/poll.js new file mode 100644 index 00000000..29f71306 --- /dev/null +++ b/commands/utility/poll.js @@ -0,0 +1,125 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const discord = require("discord.js") +const { MessageEmbed } = require('discord.js'); +const Discord = require('discord.js'); + +const emojiArray = require('../../data/structures/optionArray'); +const pollModel = require('../../database/schemas/poll'); +const squigglyRegex = RegExp(/{(.*?)}/); +const squareRegex = RegExp(/\[[^[]+\]/g); +const timeRegex = RegExp(/"(\d+(s|m|h|d|w))"/); +const moment = require('moment'); +const ms = require('ms'); + + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'poll', + description: 'Create a poll within the discord server!', + category: 'Utility', + cooldown: 3, + botPermission: ["ADD_REACTIONS"], + userPermission: ["MANAGE_MESSAGES"] + }); + } + + async run(message, args) { +let client = message.client + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let prefix = guildDB.prefix + + const pollParameters = args.join(' '); + + + const pollTitle = squigglyRegex.test(pollParameters) ? squigglyRegex.exec(pollParameters)[1] : null; + + // console.log(squigglyRegex.exec(pollParameters)); + + +let embedValid = new MessageEmbed() +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`${language.poll1.replace(/{prefix}/g, `${prefix}`)}`) +.setFooter('https://pogy.xyz') +.setColor(message.guild.me.displayHexColor) + +let embedValid2 = new MessageEmbed() +.setAuthor(message.author.tag, message.author.displayAvatarURL()) +.setDescription(`__**${language.poll2}**${language.poll1.replace(/{prefix}/g, `${prefix}`)}`) +.setFooter('https://pogy.xyz') +.setColor(message.guild.me.displayHexColor) + + + if (!pollTitle) { + return message.channel.send(embedValid).catch(err => console.log(err)); + } + + pollParameters.replace(`{${pollTitle}}`, ''); + const pollsArray = pollParameters.match(squareRegex); + + if (!pollsArray) { + return message.channel.send(embedValid).catch(() => {}); + } + else if (pollsArray.length > 20) { + return message.channel.send(embedValid2).catch(() => {}); + } + + let i = 0; + const pollString = pollsArray.map(poll => `${emojiArray()[i++]} ${poll.replace(/\[|\]/g, '')}`).join('\n\n'); + +const text = args.slice(0).join(' ') +//console.log(text) + const timedPoll = timeRegex.test(args[0]) ? timeRegex.exec(args[0])[1] : null; + + + const embed = { + color: 'BLUE', + title: pollTitle, + description: pollString, + footer: { + text: timedPoll ? `${language.poll3} ${moment(Date.now() + ms(timedPoll)).format('LLLL')}` : '', + }, + }; + + +let msg = await message.channel.send({ embed: embed }).catch(() => {}); + + if (timedPoll) { + if(guildDB.isPremium === "false"){ +if(msg){ +msg.delete().catch(()=>{}) +} +message.channel.send(new MessageEmbed().setColor(message.guild.me.displayHexColor).setDescription(`${message.client.emoji.fail} Slow down here, timed polls is only for premium guilds.\n\n[Check Premium Here](https://pogy.xyz/premium)`)) + return; + } + + + const pollDoc = new pollModel({ + guild: message.guild.id, + textChannel: message.channel.id, + message: msg.id, + expiryDate: Date.now() + ms(timedPoll), + title: pollTitle + }); + + await pollDoc.save().catch(err => console.log(`Poll error on pollDoc.save: ${err}`)); + } + + + for (i = 0; i < pollsArray.length; i++) { + await msg.react(emojiArray()[i]).catch(() => {}); + await delay(750); + } + + } +}; +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/commands/utility/redeem.js b/commands/utility/redeem.js new file mode 100644 index 00000000..dc682d6f --- /dev/null +++ b/commands/utility/redeem.js @@ -0,0 +1,90 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const Premium = require('../../database/schemas/GuildPremium'); +const moment = require("moment") +const Discord = require('discord.js'); +const webhookClient = new Discord.WebhookClient('', ''); +let uniqid = require('uniqid'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'redeem', + description: `Redeem a Premium code!`, + category: 'Utility', + cooldown: 3, + userPermission: ["MANAGE_GUILD"] + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let code = args[0] + + if(!code) return message.channel.send(new Discord.MessageEmbed().setColor('RED').setDescription(`${message.client.emoji.fail} Please Specify a code to redeem`)) + + if(guildDB.isPremium === "true") { + + return message.channel.send(new Discord.MessageEmbed().setColor('RED').setDescription(`${message.client.emoji.fail} the current guild is already premium`)) + } + + const premium = await Premium.findOne({ + code: code + }) + + if(premium){ + +const expires = moment(Number(premium.expiresAt)).format("dddd, MMMM Do YYYY HH:mm:ss") + + + guildDB.isPremium = "true"; + guildDB.premium.redeemedBy.id = message.author.id; + guildDB.premium.redeemedBy.tag = message.author.tag; + guildDB.premium.redeemedAt = Date.now() + guildDB.premium.expiresAt = premium.expiresAt; + guildDB.premium.plan = premium.plan; + + await guildDB.save().catch(()=>{}); + + await premium.deleteOne().catch(()=>{}); + +let ID = uniqid(undefined, `-${code}`); +const date = require('date-and-time'); +const now = new Date(); +let DDate = date.format(now, 'YYYY/MM/DD HH:mm:ss'); + + try { +await message.author.send(new Discord.MessageEmbed() + .setDescription(`**Premium Subscription**\n\nYou've recently redeemed a code in **${message.guild.name}** and here is your receipt:\n\n **Reciept ID:** ${ID}\n**Redeem Date:** ${DDate}\n**Guild Name:** ${message.guild.name}\n**Guild ID:** ${message.guild.id}`) + .setColor(message.guild.me.displayHexColor) + .setFooter(message.guild.name)) + } catch (err){ +console.log(err) + message.channel.send(new Discord.MessageEmbed().setDescription(`**Congratulations!**\n\n**${message.guild.name}** Is now a premium guild! Thanks a ton!\n\nIf you have any questions please contact me [here](https://discord.gg/FqdH4sfKBg)\n\n**Could not send your Reciept via dms so here it is:**\n**Reciept ID:** ${ID}\n**Redeem Date:** ${DDate}\n**Guild Name:** ${message.guild.name}\n**Guild ID:** ${message.guild.id}\n\n**Please make sure to keep this information safe, you might need it if you ever wanna refund / transfer servers.**\n\n**Expires At:** ${expires}`).setColor(message.guild.me.displayHexColor).setFooter(message.guild.name)); + + return; + } + + + message.channel.send(new Discord.MessageEmbed().setDescription(`**Congratulations!**\n\n**${message.guild.name}** Is now a premium guild! Thanks a ton!\n\nIf you have any questions please contact me [here](https://discord.gg/FqdH4sfKBg)\n**your receipt has been sent via dms**\n\n**Expires At:** ${expires}`).setColor(message.guild.me.displayHexColor).setFooter(message.guild.name)); + +const embedPremium = new Discord.MessageEmbed() + .setDescription(`**Premium Subscription**\n\n**${message.author.tag}** Redeemed a code in **${message.guild.name}**\n\n **Reciept ID:** ${ID}\n**Redeem Date:** ${DDate}\n**Guild Name:** ${message.guild.name}\n**Guild ID:** ${message.guild.id}\n**Redeemer Tag:** ${message.author.tag}\n**Redeemer ID:** ${message.author.id}\n\n**Expires At:** ${expires}`) + .setColor(message.guild.me.displayHexColor) + +webhookClient.send({ + username: 'Pogy Premium', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embedPremium], + }); + + } else { + return message.channel.send(new Discord.MessageEmbed().setColor('RED').setDescription(`${message.client.emoji.fail} I could not the following Code.`)) + } + + } +}; \ No newline at end of file diff --git a/commands/utility/remind.js b/commands/utility/remind.js new file mode 100644 index 00000000..ed88b694 --- /dev/null +++ b/commands/utility/remind.js @@ -0,0 +1,152 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const Discord = require('discord.js'); +const ms = require('ms'); +const mss = require("parse-ms") +let reminderstarted = new Set(); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'remind', + description: 'Get reminded to do something!', + category: 'Utility', + cooldown: 3 + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + +if (reminderstarted.has(message.author.id)) return message.channel.send(`${language.remind1}`); + + message.channel.send(`${language.remind2}`).catch(() => {}); + + message.channel.awaitMessages(m => m.author.id == message.author.id, + {max: 1, time: 30000}).then(collected => { + + + + if (collected.first().content.toLowerCase() == 'start') { + reminderstarted.add(message.author.id); + + message.channel.send(`${language.remind3}`).catch(() => {}); + + message.channel.awaitMessages(m => m.author.id == message.author.id, + {max: 1, time: 30000}).then(collected => { + + if (collected.first().content.length < 1024) { + let reminder = collected.first().content +message.channel.send(`${language.remind4} **[s/m/h/d]**`) + message.channel.awaitMessages(m => m.author.id == message.author.id, + {max: 1, time: 30000}).then(collected => { + let valid = collected.first().content; + let time = ms(valid); + +if (!isNaN(ms(collected.first().content))) { +if(time > 86400000 ) { + message.channel.send(`${message.client.emoji.fail} Please provide a date less than **1 day**`) + reminderstarted.delete(message.author.id); + return; +} + + let reminderTime = valid +message.channel.send(`${language.remind5}`).catch(() => {}); + + message.channel.awaitMessages(m => m.author.id == message.author.id, + {max: 1, time: 30000}).then(collected => { + + + if (collected.first().content.toLowerCase() == 'yes') { + +let remindEmbed = new Discord.MessageEmbed() + .setColor('0x43f033') + .setAuthor(`${language.remind6}`) + .setDescription(`${language.remind7.replace("${reminder}", `${reminder}`).replace("${reminderTime}", `${reminderTime}`)}`) + .setTimestamp(); + message.channel.send(remindEmbed).catch(() => {}); + + let guild = message.guild + setTimeout(function() { + let remindEmbed = new Discord.MessageEmbed() + .setColor('#00e9ff') + + .setAuthor(`${language.remind8}`) + .setDescription(`${language.remind9}`) + .addField(`${language.remind10}`, guild, true ) + .addField(`${language.remind11}`, reminderTime, true) + .addField(`${language.remind12}`, `"${reminder}"`, true) + .setTimestamp() + reminderstarted.delete(message.author.id); + message.author.send(remindEmbed).catch(() => { + + message.channel.send(`${message.author}, ${language.remind13}`) + }).catch(() => {}); + + }, ms(reminderTime)); + + + return; + } + + else { + message.reply(`${message.client.emoji.fail} ${language.remind14}`); + reminderstarted.delete(message.author.id); + } + + }).catch(() => { + message.reply(`${message.client.emoji.fail} ${language.remind15}`); + reminderstarted.delete(message.author.id); + }); + + + return; + + } else { +message.reply(`${message.client.emoji.fail} ${language.remind14}`); +reminderstarted.delete(message.author.id); + } + + }).catch(() => { + message.reply(`${message.client.emoji.fail} ${language.remind15}`); + reminderstarted.delete(message.author.id); + }); + + + return; + } + + else { + + message.reply(`${message.client.emoji.fail} ${language.remind14}`); + reminderstarted.delete(message.author.id); + } + }).catch(() => { + message.reply(`${message.client.emoji.fail} ${language.remind15}`); + reminderstarted.delete(message.author.id); + }); + + + + + + + + return; + } + + else + message.reply(`${message.client.emoji.fail} ${language.remind14}`); + reminderstarted.delete(message.author.id); + }).catch(() => { + message.reply(`${message.client.emoji.fail} ${language.remind15}`); + reminderstarted.delete(message.author.id); + }); + } +}; \ No newline at end of file diff --git a/commands/utility/report.js b/commands/utility/report.js new file mode 100644 index 00000000..b7c82096 --- /dev/null +++ b/commands/utility/report.js @@ -0,0 +1,297 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment'); +const ms = require('ms'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'report', + description: 'Enable server reports!', + category: 'Utility', + usage: [ ' / report @user / ID ' ], + examples: [ 'report enable #sserver-reports', 'report disable', 'report 232327382392 IP logging' ], + cooldown: 3, + botPermission: ["ADD_REACTIONS"] + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix; +let fail = message.client.emoji.fail; +let serverCase = guildDB.report.reportCase; +if(!serverCase || serverCase === null) serverCase = '1'; +let client = message.client + +let reportColor = guildDB.report.reportcolor +if(reportColor == '#000000') reportColor = message.guild.me.displayHexColor + + let user = message.mentions.users.first() || client.users.cache.get(args[1]) + + let properUsage = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${language.reportt1.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter('https://pogy.xyz') + + if (args.length < 1) { + return message.channel.send(properUsage); + } + + + if (args.includes('disable') || args.includes('off')) { + if(!message.member.hasPermission("MANAGE_MESSAGES")) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} ${language.missingUser}`) + .setDescription(`${language.missingUser1}`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + if(guildDB.report.reportChannelID === null) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} ${language.report4}`) + .setFooter('https://pogy.xyz')); + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.report.reportChannelID = null + await guild.save().catch(()=>{}) + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.report5}`) + .setFooter('https://pogy.xyz')); + }); + return; + } else if (args.includes('enable')) { + if(!message.member.hasPermission("MANAGE_MESSAGES")) return message.channel.send( new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`${fail} ${language.missingUser}`) + .setDescription(`${language.missingUser1}`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor)); + + const channel = await message.mentions.channels.first(); + + if (!channel) return message.channel.send(properUsage) + if(guildDB.report.reportChannelID === channel.id) return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${fail} ${channel} ${language.report6}`) + .setFooter('https://pogy.xyz')); + await Guild.findOne({ + guildId: message.guild.id + }, async (err, guild) => { + guild.report.reportChannelID = channel.id; + await guild.save().catch(()=>{}) + + + return message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.success} ${language.report7} ${channel}`)); + }); + } else if (args.includes('issue')){ + +if(guildDB.report.disableIssue == "true"){ +const embed = new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`Issue Reports are disabled in the current guild ${message.client.emoji.fail}`) + +return message.channel.send(embed); +} +const serverReports = guildDB.report.reportChannelID; +const channel = message.guild.channels.cache.get(serverReports); +if(!channel) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report11}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + + var acceptReason = args.splice(1).join(' '); + if(!acceptReason) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report12}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(acceptReason.length < 5) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report13}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + if(acceptReason.length > 600 || args.join(' ').length > 600) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report14}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + +let dmEmbed = new MessageEmbed() +.setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${language.report15}`) +.setFooter('https://pogy.xyz') +.setTimestamp() +.setColor(message.client.color.green) + +let reportEmbed1 = new MessageEmbed() +.setAuthor(`${language.report16} (Issue)`) +.setDescription(`**${language.report17}**`) +.addField(`${language.report18}`, message.member, true) +.addField(`${language.report19}`, message.member.id, true) +.addField(`${language.report20}`, message.author.tag, true) +.addField(`${language.report24}`, message.channel, true) +.addField(`${language.report25}`, `${moment(new Date()).format("dddd, MMMM Do YYYY")}`, true) +.addField(`${language.report26}`, `${language.report29} #${serverCase}`, true) +.addField(`${language.report27}`, `\`\`\`${acceptReason}\`\`\``) +.setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) +.setTimestamp() +.setColor(reportColor); + + +guildDB.report.reportCase = serverCase + 1; +await guildDB.save().catch(()=>{}) + +channel.send(reportEmbed1).then(async(reportEmbed) => { +if(guildDB.isPremium == "true"){ +if(guildDB.report.upvote == "true"){ + if(guildDB.report.reaction == "1"){ + +reportEmbed.react('⬆️').catch(()=>{}) +await delay(750); +reportEmbed.react('⬇️').catch(()=>{}) + + + } else if(guildDB.report.reaction == "2"){ + +reportEmbed.react('👍').catch(()=>{}) +await delay(750); +reportEmbed.react('👎').catch(()=>{}) + + } else if(guildDB.report.reaction == "3"){ + +reportEmbed.react('✅').catch(()=>{}) +await delay(750); +reportEmbed.react('❌').catch(()=>{}) + + } else { +reportEmbed.react('⬆️').catch(()=>{}) +await delay(750); +reportEmbed.react('⬇️').catch(()=>{}) + + } +} +} + +}).catch(err => {return message.channel.send(`${language.report28}`)}) + + +message.delete().catch(() => {}) +message.author.send(dmEmbed).catch(()=>{}) + + } else if(args.includes('user')){ + if(guildDB.report.disableUser == "true"){ +message.channel.send( new MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`User Reports are disabled in the current guild ${message.client.emoji.fail}`)); + return; +} +if(!user) return message.channel.send(properUsage) +if(user.id === message.author.id) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report8}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(user.bot) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report9}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(!guildDB.report.reportChannelID || !guildDB.report.reportChannelID === null) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report10}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let serverReports = guildDB.report.reportChannelID +let channel = message.guild.channels.cache.get(serverReports) +if(!channel) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report11}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + + var acceptReason = args.splice(2).join(' '); + if(!acceptReason) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report12}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(acceptReason.length < 5) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report13}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + if(acceptReason.length > 600 || args.join(' ').length > 600) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.report14}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + + +let dmEmbed = new MessageEmbed() +.setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${language.report15}`) +.setFooter('https://pogy.xyz') +.setTimestamp() +.setColor(message.client.color.green) + +let reportEmbed1 = new MessageEmbed() +.setAuthor(`${language.report16} (User)`) +.setDescription(`**${language.report17}**`) +.addField(`${language.report18}`, message.member, true) +.addField(`${language.report19}`, message.member.id, true) +.addField(`${language.report20}`, message.author.tag, true) +.addField(`${language.report21}`, user, true) +.addField(`${language.report22}`, user.id, true) +.addField(`${language.report23}`, user.tag, true) +.addField(`${language.report24}`, message.channel, true) +.addField(`${language.report25}`, `${moment(new Date()).format("dddd, MMMM Do YYYY")}`, true) +.addField(`${language.report26}`, `${language.report29} #${serverCase}`, true) +.addField(`${language.report27}`, `\`\`\`${acceptReason}\`\`\``) +.setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) +.setTimestamp() +.setColor(reportColor); + + +guildDB.report.reportCase = serverCase + 1; +await guildDB.save().catch(()=>{}) +channel.send(reportEmbed1).then(async(reportEmbed) => { +if(guildDB.isPremium == "true"){ +if(guildDB.report.upvote == "true"){ + if(guildDB.report.reaction == "1"){ +reportEmbed.react('⬆️').catch(()=>{}) +await delay(750); +reportEmbed.react('⬇️').catch(()=>{}) + + + } else if(guildDB.report.reaction == "2"){ +reportEmbed.react('👍').catch(()=>{}) +await delay(750); +reportEmbed.react('👎').catch(()=>{}) + + } else if(guildDB.report.reaction == "3"){ +reportEmbed.react('✅').catch(()=>{}) +await delay(750); +reportEmbed.react('❌').catch(()=>{}) + + } else { +reportEmbed.react('⬆️').catch(()=>{}) +await delay(750); + reportEmbed.react('⬇️').catch(()=>{}) + + } +} +} + +}).catch(err => {return message.channel.send(`${language.report28}`)}) + + +message.delete().catch(() => {}) +message.author.send(dmEmbed).catch(()=>{}) + } else if(args[0]) { + message.channel.send(properUsage) + } else { + message.channel.send(properUsage) + + } + } +}; + + function match(msg, i) { + if (!msg) return undefined; + if (!i) return undefined; + let user = i.members.cache.find( + m => + m.user.username.toLowerCase().startsWith(msg) || + m.user.username.toLowerCase() === msg || + m.user.username.toLowerCase().includes(msg) || + m.displayName.toLowerCase().startsWith(msg) || + m.displayName.toLowerCase() === msg || + m.displayName.toLowerCase().includes(msg) + ); + if (!user) return undefined; + return user.user; + } + + function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/commands/utility/shorturl.js b/commands/utility/shorturl.js new file mode 100644 index 00000000..17c909d4 --- /dev/null +++ b/commands/utility/shorturl.js @@ -0,0 +1,184 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const discord = require("discord.js") +const randoStrings = require("randostrings"); +const random = new randoStrings; +const talkedRecently = new Set(); +const ShortUrl = require('../../models/ShortUrl.js'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'shorturl', + aliases: [ 'shorten'], + description: 'Shorten a url!!', + category: 'Utility', + guildOnly: true, + cooldown: 20 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`) + + + if (talkedRecently.has(message.author.id)) { + message.channel.send(`You are **blocked** from the following command - ${message.author}`); + + } else { + +let kaka = random.password({ + length: 8, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + }) + +let link = args[0] + +let rgx = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; + + let ipLoggers = [ + "viral.over-blog.com", + "gyazo.in", + "ps3cfw.com", + "urlz.fr", + "webpanel.space", + "steamcommumity.com", + "imgur.com.de", + "fuglekos.com", + "grabify.link", + "leancoding.co", + "stopify.co", + "freegiftcards.co", + "joinmy.site", + "curiouscat.club", + "catsnthings.fun", + "catsnthings.com", + "xn--yutube-iqc.com", + "gyazo.nl", + "yip.su", + "iplogger.com", + "iplogger.org", + "iplogger.ru", + "2no.co", + "02ip.ru", + "iplis.ru", + "iplo.ru", + "ezstat.ru", + "whatstheirip.com", + "hondachat.com", + "bvog.com", + "youramonkey.com", + "pronosparadise.com", + "freebooter.pro", + "blasze.com", + "blasze.tk", + "ipgrab.org", + "gyazos.com", + "discord.kim", + "https://viral.over-blog.com", + "https://gyazo.in", + "https://ps3cfw.com", + "https://urlz.fr", + "https://webpanel.space", + "https://steamcommumity.com", + "https://imgur.com.de", + "https://fuglekos.com", + "https://grabify.link", + "https://leancoding.co", + "https://stopify.co", + "https://freegiftcards.co", + "https://joinmy.site", + "https://curiouscat.club", + "https://catsnthings.fun", + "https://catsnthings.com", + "https://xn--yutube-iqc.com", + "https://gyazo.nl", + "https://yip.su", + "https://iplogger.com", + "https://iplogger.org", + "https://iplogger.ru", + "https://2no.co", + "https://02ip.ru", + "https://iplis.ru", + "https://iplo.ru", + "https://ezstat.ru", + "https://whatstheirip.com", + "https://hondachat.com", + "https://bvog.com", + "https://youramonkey.com", + "https://pronosparadise.com", + "https://freebooter.pro", + "https://blasze.com", + "https://blasze.tk", + "https://ipgrab.org", + "https://gyazos.com", + "https://discord.kim", + "http://viral.over-blog.com", + "http://gyazo.in", + "http://ps3cfw.com", + "http://urlz.fr", + "http://webpanel.space", + "http://steamcommumity.com", + "http://imgur.com.de", + "http://fuglekos.com", + "http://grabify.link", + "http://leancoding.co", + "http://stopify.co", + "http://freegiftcards.co", + "http://joinmy.site", + "http://curiouscat.club", + "http://catsnthings.fun", + "http://catsnthings.com", + "http://xn--yutube-iqc.com", + "http://gyazo.nl", + "http://yip.su", + "http://iplogger.com", + "http://iplogger.org", + "http://iplogger.ru", + "http://2no.co", + "http://02ip.ru", + "http://iplis.ru", + "http://iplo.ru", + "http://ezstat.ru", + "http://whatstheirip.com", + "http://hondachat.com", + "http://bvog.com", + "http://youramonkey.com", + "http://pronosparadise.com", + "http://freebooter.pro", + "http://blasze.com", + "http://blasze.tk", + "http://ipgrab.org", + "http://gyazos.com", + "http://discord.kim" + ]; + + +if(!link) return message.channel.send( new discord.MessageEmbed() + .setDescription(`${message.client.emoji.fail} | ${language.shortUrlError}`) + .setColor(message.client.color.red)); + + if(link.includes("porn") || ipLoggers.includes(link) || link.includes("sex") || link.includes("grabify") || link.includes("iplogger") || link.includes("2no") || link.includes("yip") || link.includes("iplis")|| link.includes("02ip") || link.includes("ezstat") || link.includes("logger")) return message.channel.send(`${message.author} ${language.shorturlBlock1}`) + talkedRecently.add(message.author.id); + setTimeout(() => { + + talkedRecently.delete(message.author.id); + }, 3600000 * 2); + + +if(!rgx.test(args[0])) +return message.channel.send( new discord.MessageEmbed() + .setDescription(`${message.client.emoji.fail} | ${language.shortUrlError}`) + .setColor(message.client.color.red)); + + +await ShortUrl.create({ full: link, short: kaka, guildID:message.guild.id, memberID:message.author.id}) +message.channel.send(new discord.MessageEmbed().setDescription(`${language.urlCreated}\n\n**Short Url:** [https://pogy.xyz/url/${kaka}](https://pogy.xyz/url/${kaka})\n**Full url:** ${args[0]}\n\n**Please note that by making urls you abide by our [policy](https://pogy.xyz/url)**`).setColor(message.client.color.blue)); + + } +} +} \ No newline at end of file diff --git a/commands/utility/snipe.js b/commands/utility/snipe.js new file mode 100644 index 00000000..57f4a4fe --- /dev/null +++ b/commands/utility/snipe.js @@ -0,0 +1,74 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const moment = require('moment') +const Snipe = require('../../database/schemas/snipe') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'snipe', + description: 'Snipe Messages in the channel', + category: 'Utility', + usage: [ 'snipe' ], + cooldown: 5, + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix; +let fail = message.client.emoji.fail; +let client = message.client + +let channel = message.mentions.channels.first(); +if(!channel) channel = message.channel + +const snipe = await Snipe.findOne({ guildId: message.guild.id, channel: channel.id}) + +const no = new MessageEmbed() +.setAuthor(`#${channel.name} | ${message.guild.name}`, message.guild.iconURL()) + .setFooter(message.guild.name) + .setTimestamp() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${message.client.emoji.fail} | Couldn't find any deleted message in **${channel.name}**`) + +if(!snipe){ + return message.channel.send(no) +} + +if(snipe.message.length < 1){ + return message.channel.send(no) +} + +const data = [] + + const embed = new MessageEmbed() + .setAuthor(`#${channel.name} | ${message.guild.name}`, message.guild.iconURL()) + .setFooter(message.guild.name) + .setTimestamp() + .setColor(message.guild.me.displayHexColor) + +for (let i = 0; snipe.message.length > i; i++) { + data.push(`**${i + 1}-**\n**User:** ${await message.client.users.fetch(snipe.tag[i]) || 'Unknown'}\n**Message:** ${snipe.message[i] || 'None'}\n**image:** \`${snipe.image[i] || 'none'}\``) + + embed.addField(`Message ${i + 1}`, `**User:** ${await message.client.users.fetch(snipe.tag[i]) || 'Unknown'}\n**Message:** ${snipe.message[i] || 'None'}\n**image:** \`${snipe.image[i] || 'none'}\``, true) + + }; + + if(data.length < 1) return message.channel.send(no); + + + + message.channel.send(embed).catch(async(err)=>{ + await snipe.deleteOne().catch(()=>{}) + message.channel.send(`The embed contained a huge field that couldn't fit as this is the reason i failed to send the embed. I have resetted the database as you can try rerunning the command again.`) + }) + } +}; diff --git a/commands/utility/suggest.js b/commands/utility/suggest.js new file mode 100644 index 00000000..07614ec7 --- /dev/null +++ b/commands/utility/suggest.js @@ -0,0 +1,187 @@ +const Command = require('../../structures/Command'); +const fetch = require('node-fetch'); +const { MessageEmbed } = require('discord.js'); +const Guild = require('../../database/schemas/Guild'); +const send = require(`../../packages/logs/index.js`) +const discord = require('discord.js'); +const Discord = require('discord.js'); +const moment = require('moment'); +const ms = require('ms'); +const mss = require("parse-ms") +let reminderstarted = new Set(); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'suggest', + description: 'Suggest Something if the module is enabled!', + category: 'Utility', + cooldown: 20, + botPermission: ["ADD_REACTIONS", "USE_EXTERNAL_EMOJIS"] + }); + } + + async run(message, args) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + + const language = require(`../../data/language/${guildDB.language}.json`); + +let prefix = guildDB.prefix +let fail = message.client.emoji.fail + +let suggestColor = guildDB.suggestion.suggestioncolor +if(suggestColor == '#000000') suggestColor = message.guild.me.displayHexColor + + +if(!guildDB.suggestion.suggestionChannelID || !guildDB.suggestion.suggestionChannelID === null) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting1}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let suggestion = guildDB.suggestion.suggestionChannelID +let channel = message.guild.channels.cache.get(suggestion) +if(!channel) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting2}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let suggestionName = args.slice(0).join(" ") +if(!suggestionName) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggest1}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +if(args.join(' ').length > 600) return message.channel.send(new MessageEmbed().setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })).setDescription(`${fail} ${language.suggesting17}`).setFooter('https://pogy.xyz').setTimestamp().setColor('RED')); + +let log = new discord.MessageEmbed() + .setColor(suggestColor) + .setTitle(`Guild Suggestions`) + .setDescription(`**A new User just Suggested!**`) + .addField(`${language.report18}`, message.member, true) + .addField(`${language.report19}`, message.member.id, true) + .addField(`${language.report20}`, message.author.tag, true) + .addField(`Channel`, message.channel, true) + .addField(`${language.report25}`, `${moment(new Date()).format("dddd, MMMM Do YYYY")}`, true) + .addField(`Suggestion`, `\`\`\`${suggestionName}\`\`\``) + .setFooter(message.author.tag, message.author.displayAvatarURL({ dynamic: true })) + + +if(guildDB.suggestion.suggestionChannelID !== null){ + let channelLog = await message.guild.channels.cache.get(guildDB.suggestion.suggestionlogChannelID) + if(channelLog){ + send(channelLog, log, { + name: `Suggestion Logs`, + icon: `${message.client.domain}/logo.png` + }).catch(()=>{}) + } +} + + + +let embed = new discord.MessageEmbed() + .setColor('PURPLE') + .setTitle(`${language.suggesting3}`) + .setDescription(suggestionName) + .setFooter(`${language.suggesting4} ${message.author.tag}`) + + + + if(guildDB.isPremium == "false"){ + channel.send(embed).catch(err => {return message.channel.send(`${language.suggesting5}`)}) + .then(async(sug) => { + + sug.react("788438144818217000").catch(() => {}) + await delay(750); + sug.react("811561362878496838").catch(() => {}) + await delay(750); + sug.react("790491137289879583").catch(() => {}) + + }) + } else if(guildDB.isPremium == "true"){ + let member = message.member + const description = guildDB.suggestion.description || `{suggestion}`; + const footer = guildDB.suggestion.footer || `suggested by {user_tag}` + let theEmbed = new discord.MessageEmbed() + .setColor(suggestColor) + .setTitle(`${language.suggesting3}`) + .setDescription(`${description.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{suggestion}/g, `${suggestionName}`)}`) + .setFooter(`${footer.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`)}`) + + if(guildDB.suggestion.timestamp == "true") theEmbed.setTimestamp() + + channel.send(theEmbed).catch(err => {return message.channel.send(`I could not send the suggestion Properly since my embed description either exceeds 2000 characters, or I do not have permissions to talk in the Suggestion Channel. Kindly report that to a staff member.`)}) + .then(async(sug) => { + if(guildDB.suggestion.reaction == "1"){ + + sug.react("788438144818217000").catch(() => {}) + await delay(750); + sug.react("811561362878496838").catch(() => {}) + await delay(750); + sug.react("790491137289879583").catch(() => {}) + + + } else if(guildDB.suggestion.reaction == "2"){ + + sug.react("👍").catch(() => {}) + await delay(750); + sug.react("👎").catch(() => {}) + + + } else if(guildDB.suggestion.reaction == "3"){ + + sug.react("✅").catch(() => {}) + await delay(750); + sug.react("❌").catch(() => {}) + + + + } else { + + sug.react("788438144818217000").catch(() => {}) + await delay(750); + sug.react("811561362878496838").catch(() => {}) + await delay(750); + sug.react("790491137289879583").catch(() => {}) + + } + + + }) + + } + + + + + + message.channel.send(new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ format: 'png' })) + .setDescription(`${language.suggesting6} ${channel}`) + .setFooter('https://pogy.xyz') + .setTimestamp() + .setColor('GREEN')).then(k => { + +if(guildDB.deleteSuggestion == "true"){ + message.delete().catch(() => {}) +} + + + + setTimeout(() => { + k.delete().catch(() => {}) + }, 10000); + }) + + } +}; + +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/commands/utility/suggestbot.js b/commands/utility/suggestbot.js new file mode 100644 index 00000000..49915cd8 --- /dev/null +++ b/commands/utility/suggestbot.js @@ -0,0 +1,86 @@ +const Command = require('../../structures/Command'); +const { MessageEmbed } = require('discord.js'); +const Discord = require('discord.js'); +const crypto = require("crypto"); +const webhookClient = new Discord.WebhookClient('827490109066051614', 'C_JL4Dm0DoJUHTqq5bXHrEnvyinI1d92ydr5PgI6qfzRLvgK56zyhYJ7AbDU3-XhmqNR'); +const Guild = require('../../database/schemas/Guild'); +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'suggestbot', + aliases: [ 'botsuggest' ], + description: `Suggest a new feature for Pogy!`, + category: 'Utility', + examples: [ 'suggest Can you add music Please!' ], + cooldown: 60 + }); + } + + async run(message, args) { + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + var id = crypto.randomBytes(4).toString('hex'); + + if (args.length < 1) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.suggest1}`)); + + } + + if (args.length < 3) { + return message.channel.send( new MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.suggest2}`)); + } + +//args.join(' ').split('').join('') +let invite = await message.channel.createInvite({ + maxAge: 0, + maxUses: 0 +}).catch(() => {}); + +let report = args.join(' ').split('').join('') + const embed = new MessageEmbed() + .setTitle('New Suggestion') + .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) + .setDescription(report) + .addField('User', message.member, true) + .addField('User username', message.member.user.username, true) + .addField('User ID', message.member.id, true) + .addField('User Tag', message.member.user.tag, true) + .addField('Server', `[${message.guild.name}](${invite ||'none '})`, true) + .addField('Feedback ID:', `#${id}`, true) + .setFooter(message.member.displayName, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor('GREEN'); + + const confirmation = new MessageEmbed() + .setTitle('Bot Suggestions') + .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.suggest3} Support [**Server**](https://discord.gg/FqdH4sfKBg)`) + .addField('Member', message.member, true) + .addField('Message', report, true) + .addField('Suggestion ID:', `#${id}`, true) + .setFooter(`https://pogy.xyz`) + .setTimestamp() + .setColor('GREEN'); + + + webhookClient.send({ + username: 'Pogy Suggestions', + avatarURL: `${message.client.domain}/logo.png`, + embeds: [embed], + }); + + message.delete().catch(()=>{}) + message.author.send(confirmation).catch(()=>{}) + + + } +}; \ No newline at end of file diff --git a/commands/utility/support.js b/commands/utility/support.js new file mode 100644 index 00000000..1df98a7d --- /dev/null +++ b/commands/utility/support.js @@ -0,0 +1,27 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const Discord = require('discord.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'support', + description: `Sends you Pogy's Support server`, + category: 'Utility', + cooldown: 3 + }); + } + + async run(message) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + const embed = new Discord.MessageEmbed() + .setColor(message.guild.me.displayHexColor) + .setDescription(`${language.support}(https://discord.gg/FqdH4sfKBg) ${message.client.emoji.success}`); + + await message.channel.send(embed) + } +}; \ No newline at end of file diff --git a/commands/utility/tiktok.js b/commands/utility/tiktok.js new file mode 100644 index 00000000..b92bfd2b --- /dev/null +++ b/commands/utility/tiktok.js @@ -0,0 +1,79 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const TikTokScraper = require('tiktok-scraper'); +const numformat = n => { + if (n < 1e3) return n; + if (n >= 1e3 && n < 1e6) return +(n / 1e3).toFixed(1) + "K"; + if (n >= 1e6 && n < 1e9) return +(n / 1e6).toFixed(1) + "M"; + if (n >= 1e9 && n < 1e12) return +(n / 1e9).toFixed(1) + "B"; + if (n >= 1e12) return +(n / 1e12).toFixed(1) + "T"; + }; +const { oneLine } = require('common-tags'); +const discord = require('discord.js'); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'tiktok', + description: `Shows you the tiktok stats of a provided user!`, + category: 'Utility', + cooldown: 3 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + message.channel.send(`The following Command has been disabled Since The tiktok API is not working. We are working on making our own API and bringing the command back!`) + if(!args[0]) return message.channel.send(`${language.tiktok1}`) + try + { + const user = await TikTokScraper.getUserProfileInfo(args[0]); + if(user.user.signature == ''){ + const userbe = new discord.MessageEmbed() + .setColor('#b434eb') + .setTitle(`${language.tiktok2} - @${user.user.uniqueId}`) + .setURL(`https://www.tiktok.com/@${user.user.uniqueId}`) + .setThumbnail(user.user.avatarThumb) + .addField(`${language.tiktok3}`, `${user.user.uniqueId}`, true) + .addField(`${language.tiktok4}`, `${user.user.nickname}`, true) + .addField(`${language.tiktok5}`, `No bio yet.`) + .addField(`${language.tiktok6}`, numformat(`${user.stats.followerCount}`),true) + .addField(`${language.tiktok7}`, numformat(`${user.stats.followingCount}`),true) + .addField(`${language.tiktok8}`, numformat(`${user.stats.heartCount}`),true) + .setFooter(`${language.tiktok9} ${message.author.username}`, message.author.displayAvatarURL({ dynamic: true })) + message.channel.send({embed: userbe }) + } + else + { + const userbd = new discord.MessageEmbed() + .setColor('#b434eb') + .setTitle(`${language.tiktok2} - @${user.user.uniqueId}`) + .setURL(`https://www.tiktok.com/@${user.user.uniqueId}`) + .setThumbnail(user.user.avatarThumb) + .addField(`${language.tiktok3}`, `${user.user.uniqueId}`, true) + .addField(`${language.tiktok4}`, `${user.user.nickname}`, true) + .addField(`${language.tiktok5}`, `${user.user.signature}`) + .addField(`${language.tiktok6}`, numformat(`${user.stats.followerCount}`),true) + .addField(`${language.tiktok7}`, numformat(`${user.stats.followingCount}`),true) + .addField(`${language.tiktok8}`, numformat(`${user.stats.heartCount}`),true) + .setFooter(`${language.tiktok9} ${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + message.channel.send({embed: userbd }) + } + } + catch (error) { + console.log(error) + message.channel.send(new MessageEmbed() + .setColor('#FF0000') + .setDescription(`${language.tiktok10} **${args[0]}**`) + .setFooter(`${language.tiktok9} ${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true }))); + +} + + } +}; \ No newline at end of file diff --git a/commands/utility/urbanDictionary.js b/commands/utility/urbanDictionary.js new file mode 100644 index 00000000..55a5f0a1 --- /dev/null +++ b/commands/utility/urbanDictionary.js @@ -0,0 +1,72 @@ +const Command = require('../../structures/Command'); +const request = require('request-promise-native'); +const Guild = require('../../database/schemas/Guild'); +const Discord = require('discord.js') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'define', + aliases: [ 'urban', 'usearch', 'urbandictionary' ], + description: 'Defines the given word!', + category: 'Utility', + usage: '', + examples: [ 'define Poggers' ], + cooldown: 3 + }); + } + + async run(message, args) { + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + if (args.length < 1) { + return message.channel.send( new Discord.MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.define1}`)); + } + + let options = { + url: `https://api.urbandictionary.com/v0/define?term=${args.join(' ')}`, + json: true + }; + + let response = await request(options); + + response = response.list[0]; + + if (!response) { + return message.channel.send( new Discord.MessageEmbed() +.setColor(message.client.color.blue) +.setDescription(`${message.client.emoji.fail} ${language.define2}`)); + } + + + await message.channel.send({ + embed: { + color: message.client.color.blue, + title: 'Urban Dictionary', + fields: [ + { + name: `${language.namse}`, + value: response.word || args.join(' ') + }, + { + name: `${language.define3}`, + value: response.definition || '-' + }, + { + name: `${language.define4}`, + value: response.example || '-' + } + ], + footer: { + text: `${language.define5}` + } + } + }); + } +}; \ No newline at end of file diff --git a/commands/utility/vote.js b/commands/utility/vote.js new file mode 100644 index 00000000..6809b01a --- /dev/null +++ b/commands/utility/vote.js @@ -0,0 +1,59 @@ +const Command = require('../../structures/Command'); +const Guild = require('../../database/schemas/Guild'); +const { MessageEmbed } = require('discord.js'); +const User = require('../../database/schemas/User'); +const ms = require('ms') +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: 'vote', + description: 'Pogy\s vote pages', + category: 'Utility', + cooldown: 5 + }); + } + + async run(message) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + let user = await User.findOne({ + discordId: message.author.id + }) + + if(!user){ + const newUser = new User({ + discordId: message.author.id + }) + + await newUser.save().catch(()=>{}) + user = await User.findOne({ + discordId: message.author.id + }) + + } + + let DBL_INTERVAL = 43200000 + let lastVoted = user && user.lastVoted ? user.lastVoted : 0 + let checkDBLVote = Date.now() - lastVoted < DBL_INTERVAL + + let votes = 'times' + if (user && user.votes === 1) votes = '1 time' + if (user && user.votes > 1) votes = `${user.votes} times` + + + + await message.channel.send(new MessageEmbed() + .setDescription(`__**Top.gg**__\n${checkDBLVote ? `\`In ${ms(user.lastVoted - Date.now() + DBL_INTERVAL, { long: true })}\`` : '[\`Available Now!\`](https://top.gg/bot/767705905235099658/vote)'}\n\n__**Rewards:**__\n`) + .setAuthor(message.author.tag, message.author.displayAvatarURL({ dynamic : true })) + .setColor(message.guild.me.displayHexColor) + .setFooter('https://pogy.xyz') + .setTimestamp() + ); + } +}; \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 00000000..0b2778c5 --- /dev/null +++ b/config.js @@ -0,0 +1,16 @@ +module.exports = { + "verification": "", + "description": "Pogy is a multi-purpose discord bot ready to skill up and boost up your Discord server!", + "domain": "", // domain + "google_analitics": "", // google analitics + "token": process.env.TOKEN, + "https":"https://", // leave as is + "port":"5003", + + "client_id":"", // bot client ID + "secret":"",// bot client secret for auth + +} + + +// read more on https://github.com/aurolia-css/majo-rebuild \ No newline at end of file diff --git a/dashboard/dashboard.js b/dashboard/dashboard.js new file mode 100644 index 00000000..d1765a8e --- /dev/null +++ b/dashboard/dashboard.js @@ -0,0 +1,5269 @@ +const Discord = require("discord.js"); +const url = require("url"); +const path = require("path"); +let uniqid = require('uniqid'); +const cooldownNickname = new Set(); +const express = require("express"); +const passport = require("passport"); +const session = require('express-session'); +const MongoStore = require('connect-mongo'); +const Strategy = require("passport-discord").Strategy; +const premiumWeb = new Discord.WebhookClient('', ''); +const config = require("../config"); +const ejs = require("ejs"); +const jsonconfig = require('../config.json'); + +const ShortUrl = require('../models/ShortUrl.js'); +const { mem, cpu, os } = require('node-os-utils'); +var metrics = require('datadog-metrics'); +const randoStrings = require("randostrings"); +const random = new randoStrings; +const sendingEmbed = new Set(); +const bodyParser = require("body-parser"); +const { readdirSync } = require('fs'); +const { WebhookClient, MessageEmbed } = require('discord.js'); +const DBL = require('@top-gg/sdk'); +const mongoose = require('mongoose'); +const User = require('../database/schemas/User'); +const TicketSettings = require('../models/tickets'); +const ReactionRole = require("../packages/reactionrole/models/schema"); +const ReactionRoles = require("../packages/reactionrole/index.js") +const reactP = new ReactionRoles() +const EmojiArray = require('../assets/json/emojiarray.json') +const Maintenance = require('../database/schemas/maintenance'); +const rrSettings = require('../packages/reactionrole/models/schema'); +const webhook = new DBL.Webhook('peterpogy22'); +const fetch = require('node-fetch'); +const Paste = require('../models/transcript.js') +const moment = require('moment') +const cooldownEmbed = new Set(); +const fs = require('fs'); +const Application = require("../models/application/application.js"); +const customCommand = require('../database/schemas/customCommand.js'); +//dont touch here +const Hook = new WebhookClient('', ''); +// + +let rgx = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; + +//schemas; + +let GuildSettings = require("../database/schemas/Guild"); +let WelcomeSchema = require("../database/schemas/welcome"); +let LeaveSchema = require("../database/schemas/leave"); +let StickySettings = require("../database/schemas/stickyRole"); +let AltSettings = require("../models/altdetector.js"); +let Logging = require("../database/schemas/logging"); +let App = require("../models/application/application.js") + +//important +const domain = config.domain; +const clientID = config.client_id; +const secret = config.secret; + + const app = express(); + app.use(express.static('dashboard/static')); + + + module.exports = async (client) => { + const dataDir = path.resolve(`${process.cwd()}${path.sep}dashboard`); + + const templateDir = path.resolve(`${dataDir}${path.sep}templates`); + + + passport.serializeUser((user, done) => done(null, user)); + passport.deserializeUser((obj, done) => done(null, obj)); + + + passport.use(new Strategy({ + clientID: `${clientID}`, + clientSecret: `${secret}`, + callbackURL: `${domain}/callback`, + scope: ["identify", "guilds"] + }, + (accessToken, refreshToken, profile, done) => { + + process.nextTick(() => done(null, profile)); + })); + +app.use(session({ + secret : 'asdasdasda7734r734753ererfretertdf43534wfefrrrr4awewdasdadadad', + resave : true, + saveUninitialized : true, + store :MongoStore.create({ mongoUrl: jsonconfig.mongodb_url}) +})); + + + // We initialize passport middleware. + app.use(passport.initialize()); + app.use(passport.session()); + + app.locals.domain = config.domain.split("//")[1]; + + app.engine("html", ejs.renderFile); + app.set("view engine", "html"); + + app.use(bodyParser.json()); + app.use(bodyParser.urlencoded({ + extended: true + })); + + const renderTemplate = (res, req, template, data = {}) => { + var hostname = req.headers.host; + var pathname = url.parse(req.url).pathname; + + const baseData = { + https: "https://", + domain: domain, + bot: client, + hostname: hostname, + pathname: pathname, + path: req.path, + user: req.isAuthenticated() ? req.user : null, + verification: config.verification, + description: config.description, + url: res, + req: req, + image: `${domain}/logo.png`, + name: client.username, + tag: client.tag, + arc: jsonconfig.arc, + analitics: config.google_analitics, + }; + res.render(path.resolve(`${templateDir}${path.sep}${template}`), Object.assign(baseData, data)); + }; + + const checkAuth = (req, res, next) => { + if (req.isAuthenticated()) return next(); + req.session.backURL = req.url; + res.redirect("/login"); + } + + // Login endpoint. + app.get("/login", (req, res, next) => { + + if (req.session.backURL) { + req.session.backURL = req.session.backURL; + + } else if (req.headers.referer) { + + const parsed = url.parse(req.headers.referer); + if (parsed.hostname === app.locals.domain) { + req.session.backURL = parsed.path; + } + + + } else { + req.session.backURL = "/"; + } + // Forward the request to the passport middleware. + next(); + }, + passport.authenticate("discord")); + + // Callback endpoint. + app.get("/callback", passport.authenticate("discord", { + failWithError: true, + failureFlash: "There was an error logging you in!", + failureRedirect: "/", + }), async (req, res) => { + + const loginLogs = new WebhookClient('', ''); + + + try { + + if (req.session.backURL) { + + const url = req.session.backURL; + req.session.backURL = null; + res.redirect(url); + + const member = await client.users.fetch(req.user.id); + if (member) { + + const login = new MessageEmbed() + .setColor('GREEN') + .setTitle(`Login Logs`) + .setDescription(`\nUser: ${member.tag}\`(${member.id})\`\nTime: ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")} `); + + loginLogs.send({ + username: 'Login Logs', + avatarURL: `${domain}/logo.png`, + embeds: [login] + }); + } + + } else { + + const member = await client.users.fetch(req.user.id); + if (member) { + + const login = new MessageEmbed() + .setColor('GREEN') + .setTitle(`Login Logs`) + .setDescription(`\nUser: ${member.tag}\`(${member.id})\`\nTime: ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")} `); + + loginLogs.send({ + username: 'Login Logs', + avatarURL: `${domain}/logo.png`, + embeds: [login] + }); + } + + res.redirect("/"); + } + } catch (err) { + + res.redirect('/') + } + + }); + + // Features list redirect endpoint. + app.get("/commands", (req, res) => { + var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl; + renderTemplate(res, req, "features.ejs", { + urlSite: fullUrl + }); + + }); + app.get("/color", (req, res) => { +var url = req.protocol + '://' + req.get('host') + req.originalUrl; + renderTemplate(res, req, "color.ejs", { + urlSite: url + }); + + }); + + app.get("/faq", (req, res) => { + renderTemplate(res, req, "faq.ejs"); + }); + + app.get("/stats", (req, res) => { + renderTemplate(res, req, "stats.ejs"); + }); + + app.get("/variables", (req, res) => { + renderTemplate(res, req, "variables.ejs"); + }); + + app.get("/embeds", (req, res) => { + renderTemplate(res, req, "embeds.ejs"); + }); + + app.get("/support", (req, res) => { + res.redirect(`https://discord.gg/FqdH4sfKBg`) + }); + + app.get("/server", (req, res) => { + res.redirect(`https://discord.gg/FqdH4sfKBg`) + }); + + app.get('/invite', function(req, res) { +res.redirect(`https://discord.com/oauth2/authorize?client_id=${clientID}&redirect_uri=${domain}/thanks&response_type=code&scope=bot&permissions=490073207`) +}); + + app.get('/thanks', function(req, res) { + renderTemplate(res, req, "thanks.ejs") +}); + + app.get("/team", (req, res) => { + renderTemplate(res, req, "team.ejs") + }); + + app.get("/policy", (req, res) => { + renderTemplate(res, req, "policy.ejs") + }); + + // Logout endpoint. + app.get("/logout", async function(req, res) { + + if (req.user) { + const member = await client.users.fetch(req.user.id); + if (member) { + + const logoutLogs = new WebhookClient('', '') + + const logout = new MessageEmbed() + .setColor('RED') + .setTitle(`Logout Logs`) + .setDescription(`\nUser: ${member.tag}\`(${member.id})\`\nTime: ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")} `); + + logoutLogs.send({ + username: 'Logout Logs', + avatarURL: `${domain}/logo.png`, + embeds: [logout] + }); + } + } + + + req.session.destroy(() => { + req.logout(); + res.redirect("/"); + }); + }); + app.get("/window", (req, res) => { + renderTemplate(res, req, "window.ejs"); + }) + + app.get("/premium", (req, res) => { + renderTemplate(res, req, "premium.ejs"); + }) + + // Index endpoint. + app.get("/", (req, res) => { + renderTemplate(res, req, "index.ejs"); + }); + + app.get("/apply", checkAuth, (req, res) => { + + renderTemplate(res, req, "appeal.ejs", { + perms: Discord.Permissions, + }); + + }); + app.get("/paste", (req, res) => { + + res.send(`Working`) + + }); + + app.get('/url/:shortUrl', async (req, res) => { + const shortUrl = await ShortUrl.findOne({ short: req.params.shortUrl }) + if (shortUrl == null) return res.send('Invalid url Provided') + + shortUrl.clicks++ + shortUrl.save() + + res.redirect(shortUrl.full) +}) + + app.get('/url', async (req, res) => { + + renderTemplate(res, req, "url.ejs"); + +}) + + const pastes = await Paste.find({ + type: 'ticket' + }); + + for (const pasteE of pastes) { + + if (pasteE.createdAt > pasteE.expiresAt) { + + await pasteE.deleteOne().catch(()=>{}) + + } + + } + app.get("/paste/:pasteID", async(req, res) => { + + + const paste = await Paste.findOne({ + _id: req.params.pasteID, + type: "ticket" + }) + if(paste){ + if(paste && paste.paste.length >= 1 ){ + + if(paste.createdAt > paste.expiresAt){ + + await paste.deleteOne().catch(()=>{}) + + renderTemplate(res, req, "paste.ejs", { + type: "noFind" + + }); + return; + } + + renderTemplate(res, req, "paste.ejs", { + expires: moment(paste.expiresAt).format("dddd, MMMM Do YYYY HH:mm:ss"), + created: moment(paste.createdAt).format("dddd, MMMM Do YYYY HH:mm:ss"), + paste: paste.paste, + id: paste._id, + db: paste, + type: "ticket" + + }); + + } else { + renderTemplate(res, req, "paste.ejs", { + type: "noFind" + + }); + + } + } else { + const form = await Paste.findOne({ + _id: req.params.pasteID, + type: "form" + }) + + if(form && form.paste.length >= 1 ){ + + if(form.createdAt > form.expiresAt){ + + await form.deleteOne().catch(()=>{}) + + renderTemplate(res, req, "paste.ejs", { + type: "noFindForm" + + }); + return; + } + + renderTemplate(res, req, "paste.ejs", { + expires: moment(form.expiresAt).format("dddd, MMMM Do YYYY HH:mm:ss"), + created: moment(form.createdAt).format("dddd, MMMM Do YYYY HH:mm:ss"), + db: form, + id: form._id, + type: "form" + + }); + + } else { + renderTemplate(res, req, "paste.ejs", { + type: "noFindForm" + + }); + + } + + + + } + }); + + + app.get("/apply/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + } + + let db = await Application.findOne({ + guildID: guild.id + }) + + if(!db) { + let newAppDB = new app({ + guildID: guild.id, + questions: [], + appToggle: false, + appLogs: null + }) + await newAppDB.save().catch(()=>{}) + + db = await Application.findOne({ + guildID: guild.id + }) + } + + renderTemplate(res, req, "appealMain.ejs", { + guild: guild, + alert: null, + app: db, + settings: storedSettings, + }); + + }); + + app.post("/apply/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + } + + let db = await Application.findOne({ + guildID: guild.id + }) + + if(!db) { + let newAppDB = new app({ + guildID: guild.id, + questions: [], + appToggle: false, + appLogs: null + }) + await newAppDB.save().catch(()=>{}) + + db = await Application.findOne({ + guildID: guild.id + }) + } + const data = req.body; + + const channel = await guild.channels.cache.get(db.appLogs) + + if(db.appToggle === false) return; + + if(channel){ + +let embed; + + let ticketID = random.password({ + length: 8, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + }) + + let form = new Paste({ + _id: ticketID, + by: member.id, + type: "form", + expiresAt: new Date(Date.now() + (2629800000)), + }); + + for (let i = 0; db.questions.length > i; i++) { + + if(data[i + 1]){ + + form.paste.push(`Question #${i + 1} - ${db.questions[i]}`) + form.paste2.push(`${data[i + 1] || 'Not Answered'}`) + + + + embed = new MessageEmbed() + .setTitle(`A new Form was Submitted`) + .setDescription(`**Link:** [${domain}/paste/${ticketID}](${domain}/paste/${ticketID})\n\n[or click here](${domain}/paste/${ticketID})\n\n**Form ID**: \`${ticketID}\`\n\n**Submitted by:** ${member} **(${member.user.tag} - ${member.id})**\n**Time:** ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")}`) + .setFooter('https://pogy.xyz') + .setColor('GREEN') + + } else { + + + form.paste.push(`Question #${i + 1} - ${db.questions[i]}`) + form.paste2.push(`Not Answered`) + + + + embed = new MessageEmbed() + .setTitle(`A new Form was Submitted`) + .setDescription(`**Link:** [${domain}/paste/${ticketID}](${domain}/paste/${ticketID})\n\n[or click here](${domain}/paste/${ticketID})\n\n**Form ID**: \`${ticketID}\`\n\n**Submitted by:** ${member} **(${member.user.tag} - ${member.id})**\n**Time:** ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")}`) + .setFooter('https://pogy.xyz') + .setColor('GREEN') + } + + + +} +member.send(new MessageEmbed().setColor('GREEN').setFooter(`Powered by https://pogy.xyz`).setTitle(`Application #${ticketID}`).setDescription(`Hey ${member.user.username}! Your form was Submitted and ready to be judged.\n\n**Form ID**: \`${ticketID}\`\n**Time:** ${moment(new Date()).format("dddd, MMMM Do YYYY HH:mm:ss")}`)).catch(()=>{}); + +await form.save().catch(()=>{}) +channel.send(embed) + + + renderTemplate(res, req, "appealMain.ejs", { + guild: guild, + alert: `Your form has been recieved`, + id: `Form #${ticketID}`, + app: db, + settings: storedSettings, + }); + + return; + } else { + + renderTemplate(res, req, "appealMain.ejs", { + guild: guild, + alert: `There was an error sending your Form.`, + app: db, + settings: storedSettings, + }); + + return; + } + + + + + }); + app.get("/redeem", checkAuth, (req, res) => { + + renderTemplate(res, req, "redeem.ejs", { + perms: Discord.Permissions, + }); + + }); + // Dashboard endpoint. + app.get("/dashboard", checkAuth, (req, res) => { + + const server = client.guilds.cache.get('758566519440408597'); + let user = server.members.cache.has(req.user.id); + + + + + renderTemplate(res, req, "dashboard.ejs", { + perms: Discord.Permissions, + userExists: user, + }); + + }); + + app.get("/redeem/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/redeem"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/redeem"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/redeem"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "redeemguild.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + + }); + + + + app.post("/redeem/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/redeem"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/redeem"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/redeem"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + +const expires = moment(Date.now() + (2592000000 * 12)).format("dddd, MMMM Do YYYY HH:mm:ss"); + + let ID = uniqid(undefined, ``); +const date = require('date-and-time'); +const now = new Date(); +let DDate = date.format(now, 'YYYY/MM/DD HH:mm:ss'); + member.send(new Discord.MessageEmbed().setDescription(`**Congratulations!**\n\n**${guild.name}** Is now a premium guild! Thanks a ton!\n\nIf you have any questions please contact me [here](https://discord.gg/FqdH4sfKBg)\n\n__**Reciept:**__\n**Reciept ID:** ${ID}\n**Redeem Date:** ${DDate}\n**Guild Name:** ${guild.name}\n**Guild ID:** ${guild.id}\n\n**Please make sure to keep this information safe, you might need it if you ever wanna refund / transfer servers.**\n\n**Expires At:** ${expires}`).setColor('GREEN').setFooter(guild.name)).catch(()=>{}); + + storedSettings.isPremium = "true"; + storedSettings.premium.redeemedBy.id = member.id; + storedSettings.premium.redeemedBy.tag = member.user.tag; + storedSettings.premium.redeemedAt = Date.now() + storedSettings.premium.expiresAt = Date.now() + (2592000000 * 12); + storedSettings.premium.plan = 'year'; + + await storedSettings.save().catch(()=>{}) + +const embedPremium = new Discord.MessageEmbed() + .setDescription(`**Premium Subscription**\n\n**${member.user.tag}** Redeemed a code in **${guild.name}**\n\n **Reciept ID:** ${ID}\n**Redeem Date:** ${DDate}\n**Guild Name:** ${guild.name}\n**Guild ID:** ${guild.id}\n**Redeemer Tag:** ${member.user.tag}\n**Redeemer ID:** ${member.user.id}\n\n**Expires At:** ${expires}`) + .setColor(guild.me.displayHexColor) + +premiumWeb.send({ + username: 'Pogy Premium', + avatarURL: `${domain}/logo.png`, + embeds: [embedPremium], + }); + renderTemplate(res, req, "redeemguild.ejs", { + guild: guild, + alert: `${guild.name} Is now a premium guild!!`, + settings: storedSettings, + }); + + }); + + app.get("/dashboard/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + const join1 = [] + const leave1 = [] + const join2 = [] + const leave2 = [] + + guild.members.cache.forEach(async(user)=>{ + + let day = 7 * 86400000; + let x = Date.now() - user.joinedAt; + let created = Math.floor(x / 86400000); + + + + if(7 > created) { + join2.push(user.id) + } + + if(1 > created) { + join1.push(user.id) + } + + }) + + storedSettings.leaves.forEach(async(leave)=>{ + + + let xx = leave - Date.now(); + if(Date.now() > leave){ + xx = Date.now() - leave + } + + let createdd = Math.floor(xx / 86400000); + + + if(6 >= createdd) { + leave2.push(leave) + } + + if(0 >= createdd) { + leave1.push(leave) + } + + }) + + + + renderTemplate(res, req, "./new/mainpage.ejs", { + guild: guild, + alert: `Dashboard might be a little bit buggy due to discord intent problems.`, + join1:join1.length || 0, + join2: join2.length || 0, + leave1: leave1.length || 0, + leave2: leave2.length || 0, + nickname: guild.me.nickname || guild.me.user.username, + settings: storedSettings, + }); + + }); + + app.post("/dashboard/:guildID", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + const join1 = [] + const leave1 = [] + const join2 = [] + const leave2 = [] + + guild.members.cache.forEach(async(user)=>{ + + let day = 7 * 86400000; + let x = Date.now() - user.joinedAt; + let created = Math.floor(x / 86400000); + + + + if(7 > created) { + join2.push(user.id) + } + + if(1 > created) { + join1.push(user.id) + } + + }) + + storedSettings.leaves.forEach(async(leave)=>{ + + + let xx = leave - Date.now(); + if(Date.now() > leave){ + xx = Date.now() - leave + } + + let createdd = Math.floor(xx / 86400000); + + + + if(6 >= createdd) { + leave2.push(leave) + } + + if(0 >= createdd) { + leave1.push(leave) + } + + }) + + //Nickname + let data = req.body + let nickname = data.nickname + if (nickname && nickname.length < 1) nickname = guild.me.nickname || guild.me.user.username; + + if (data.nickname) { + if (cooldownNickname.has(guild.id)) nickname = guild.me.nickname || guild.me.user.username + if (!nickname) nickname = guild.me.nickname || guild.me.user.username + + guild.me.setNickname(nickname); + cooldownNickname.add(guild.id) + setTimeout(() => { + cooldownNickname.delete(guild.id) + }, 20000) + } + + + if (data.prefix) { + let prefix = data.prefix.replace(/ /g, "") + if (!prefix) prefix = storedSettings.prefix + if (prefix.length > 5) { + renderTemplate(res, req, "./new/mainpage.ejs", { + guild: guild, + nickname: nickname, + join1:join1.length || 0, + join2: join2.length || 0, + leave1: leave1.length || 0, + leave2: leave2.length || 0, + alert: "Prefix length exceeds 5 characters ❌", + settings: storedSettings, + }); + return; + } + storedSettings.prefix = prefix + } else { + storedSettings.prefix = storedSettings.prefix + } + + + if (data.language) { + const languages = ["english", "french", "spanish"] + let language = data.language + if (!language) language = "english"; + if (!languages.includes(language)) language = "english"; + + storedSettings.language = language + } + + await storedSettings.save().catch(() => { }) + + + + + + + renderTemplate(res, req, "./new/mainpage.ejs", { + guild: guild, + join1:join1.length || 0, + join2: join2.length || 0, + leave1: leave1.length || 0, + leave2: leave2.length || 0, + nickname: nickname, + alert: "Your changes have been saved! ✅", + settings: storedSettings, + }); + }); + + //applications + app.get("/dashboard/:guildID/applications", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + var appSettings = await App.findOne({ guildID: guild.id }); + if (!appSettings) { + + const newSettings5 = new App({ + guildID: guild.id + }); + await newSettings5.save().catch(() => { }); + appSettings = await App.findOne({ guildID: guild.id }); + + + + } + + renderTemplate(res, req, "./new/mainapp.ejs", { + guild: guild, + alert: null, + app: appSettings, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/applications", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} +const data = req.body + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + var appSettings = await App.findOne({ guildID: guild.id }); + if (!appSettings) { + + const newSettings5 = new App({ + guildID: guild.id + }); + await newSettings5.save().catch(() => { }); + appSettings = await App.findOne({ guildID: guild.id }); + + + + } + + if (Object.prototype.hasOwnProperty.call(data, "save")) { + + //channel + +const channelV = await guild.channels.cache.find((ch) => `#${ch.name}` === data.log); +if(channelV){ +appSettings.appLogs = channelV.id +} else { + appSettings.appLogs = null +} + + //add_role + + let add = await guild.roles.cache.find((r) => "@" + r.name === data.add_role) +if(add){ +appSettings.add_role = add.id +} else { + appSettings.add_role = null +} + + + + //remove_role + let rem = await guild.roles.cache.find((r) => "@" + r.name === data.remove_role) +if(rem){ +appSettings.remove_role = rem.id +} else { + appSettings.remove_role = null +} + + + + //toggle + +let toggle = req.body["toggle"] +if(toggle){ +appSettings.appToggle = true +} else { +appSettings.appToggle = false +} + + + //dm + let dm = req.body["dm"] + if(dm){ +appSettings.dm = true + } else { +appSettings.dm = false + } + } + + await appSettings.save().catch(()=>{}) + renderTemplate(res, req, "./new/mainapp.ejs", { + guild: guild, + alert: `Your Changes have been saved ✅`, + app: appSettings, + settings: storedSettings, + }); + }); + + //commands + app.get("/dashboard/:guildID/commands", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/maincommands.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/commands", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/maincommands.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + // welcome + app.get("/dashboard/:guildID/welcome", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + var welcomeSettings = await WelcomeSchema.findOne({ guildId: guild.id }); + if (!welcomeSettings) { + + const newSettings = new WelcomeSchema({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + welcomeSettings = await WelcomeSchema.findOne({ guildId: guild.id }); + + + + } + + var leaveSettings = await LeaveSchema.findOne({ guildId: guild.id }); + if (!leaveSettings) { + + const newSettings = new LeaveSchema({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + leaveSettings = await LeaveSchema.findOne({ guildId: guild.id }); + + + + } + + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: null, + leave: leaveSettings, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + }); + + app.post("/dashboard/:guildID/welcome", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + const newSettings = new WelcomeSchema({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + var welcomeSettings = await WelcomeSchema.findOne({ guildId: guild.id }); + if (!welcomeSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + welcomeSettings = await WelcomeSchema.findOne({ guildId: guild.id }); + + + + } + var leaveSettings = await LeaveSchema.findOne({ guildId: guild.id }); + if (!leaveSettings) { + + const newSettings = new LeaveSchema({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + leaveSettings = await LeaveSchema.findOne({ guildId: guild.id }); + + + + } + + let data = req.body + + if (Object.prototype.hasOwnProperty.call(data, "welcomeSave")) { + + + + let welcomeValid = await guild.channels.cache.find((ch) => `# ${ch.name}` === data.welcomeChannel); + + + if (welcomeValid) { + + welcomeSettings.welcomeChannel = guild.channels.cache.find((ch) => `# ${ch.name}` === data.welcomeChannel).id; + + + } else { + + welcomeSettings.welcomeChannel = null; + + } + + + } + + + + // leave save + if (Object.prototype.hasOwnProperty.call(data, "leaveSave")) { + + + + let leaveValid = await guild.channels.cache.find((ch) => `# ${ch.name}` === data.leaveChannel); + + + if (leaveValid) { + + leaveSettings.leaveChannel = guild.channels.cache.find((ch) => `# ${ch.name}` === data.leaveChannel).id; + + + } else { + + leaveSettings.leaveChannel = null; + + } + + + } + + + // leave start + + + + if (Object.prototype.hasOwnProperty.call(data, "leaveEnable") || Object.prototype.hasOwnProperty.call(data, "leaveUpdate")) { + + let checkDM = req.body["leaveDM"] + if (checkDM) { + leaveSettings.leaveDM = true + } else { + leaveSettings.leaveDM = false + } + + let checkIfEmbed = req.body["leaveEmbed"] + + if (checkIfEmbed) { + let database = await guild.channels.cache.get(leaveSettings.leaveChannel); + + + if (!database) { + + leaveSettings.leaveToggle = false; + await leaveSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to save the welcome Channel first ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + }; + leaveSettings.leaveEmbed = true + + } else { + + + let database = await guild.channels.cache.get(leaveSettings.leaveChannel); + + + if (!database) { + + leaveSettings.leaveToggle = false; + await leaveSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to save the welcome Channel first ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + }; + + if (data.leaveMessage) { + + if (data.leaveMessage.length > 2000) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure text length is below 2000❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + leaveSettings.leaveMessage = data.leaveMessage; + + } else { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please Provide me with a text ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + leaveSettings.leaveToggle = true; + leaveSettings.leaveChannel = database.id + leaveSettings.leaveEmbed = false + + + } + + }; + + if (Object.prototype.hasOwnProperty.call(data, "leaveEnableEmbed") || Object.prototype.hasOwnProperty.call(data, "leaveUpdateEmbed")) { + + let data = req.body; + + let checkDM = req.body["leaveDM"] + if (checkDM) { + leaveSettings.leaveDM = true + } else { + leaveSettings.leaveDM = false + }; + + let checkIfEmbed = req.body["leaveEmbed"] + + + + if (checkIfEmbed) { + + + // author + + + // author name + if (data.leave_author_name) { + + if (data.leave_author_name.length > 256) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure the author length is below 200❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + + leaveSettings.embed.author.name = data.leave_author_name; + } else { + leaveSettings.embed.author.name = ``; + + } + + // author URL + + if (data.leave_author_url) { + + + + if (rgx.test(data.leave_author_url) || data.leave_author_url.toLowerCase() == "{useravatar}") { + + leaveSettings.embed.author.url = data.leave_author_url; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure this is a valid URL❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + } else { + leaveSettings.embed.author.url = ``; + } + + + // icon + if (data.leave_author_icon) { + + if (rgx.test(data.leave_author_icon) || data.leave_author_icon.toLowerCase() == "{useravatar}") { + + leaveSettings.embed.author.icon = data.leave_author_icon; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure this is a valid URL❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + + } else { + + leaveSettings.embed.author.icon = ``; + } + + // embed Title + + if (data.leave_embedTitle) { + + if (data.leave_embedTitle.length > 200) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure your title is under 200 characters long❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + + } + + leaveSettings.embed.title = data.leave_embedTitle + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to include a title❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + // welcome embed title url + + if (data.leave_embedTitleURL) { + + if (rgx.test(data.leave_embedTitleURL)) { + + leaveSettings.embed.titleURL = data.leave_embedTitleURL; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Invalid Link Provided ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + } else { + leaveSettings.embed.titleURL = ``; + } + + // description + + if (data.leave_embedDescription) { + + if (data.leave_embedDescription.length > 2000) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Make sure the description is below 2000 characters long ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + leaveSettings.embed.description = data.leave_embedDescription; + } else { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please provide a description ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + // thumbnail URL + + if (data.leave_embedThumbnail) { + + if (rgx.test(data.leave_embedThumbnail)) { + + leaveSettings.embed.thumbnail = data.leave_embedThumbnail; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please provide a valid thumbnail❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + + } else { + + leaveSettings.embed.thumbnail = ``; + + } + + // footer + + if (data.leave_embedFooter) { + + if (data.leave_embedFooter.length > 1048) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Make sure the footer is under 1000 characters long ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + leaveSettings.embed.footer = data.leave_embedFooter; + + } else { + + leaveSettings.embed.footer = ""; + } + + // footer icon + + + if (data.leave_embedFooterIcon) { + + if (rgx.test(data.leave_embedFooterIcon)) { + + leaveSettings.embed.footerIcon = data.leave_embedFooterIcon; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Invalid Footer Icon ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + + + return; + + } + + } else { + leaveSettings.embed.footerIcon = ""; + } + + // Timestamp + + let timestamp = req.body["leave_timestamp"] + if (timestamp) { + leaveSettings.embed.timestamp = true + } else { + leaveSettings.embed.timestamp = false + } + + //color + if (data.leave_embedColor) { + leaveSettings.embed.color = data.leave_embedColor + } else { + leaveSettings.embed.color = `#000000` + } + + leaveSettings.leaveEmbed = true; + + //end + } else { + leaveSettings.leaveEmbed = false; + } + + leaveSettings.leaveToggle = true; + } + + + + + // leave end + + if (Object.prototype.hasOwnProperty.call(data, "welcomeEnable") || Object.prototype.hasOwnProperty.call(data, "welcomeUpdate")) { + + let checkDM = req.body["dmUser"] + if (checkDM) { + welcomeSettings.welcomeDM = true + } else { + welcomeSettings.welcomeDM = false + } + + let checkIfEmbed = req.body["isEmbed"] + + if (checkIfEmbed) { + let database = await guild.channels.cache.get(welcomeSettings.welcomeChannel); + + + if (!database) { + + welcomeSettings.welcomeToggle = false; + await welcomeSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to save the welcome Channel first ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + }; + welcomeSettings.welcomeEmbed = true; + + } else { + + + let database = await guild.channels.cache.get(welcomeSettings.welcomeChannel); + + + if (!database) { + welcomeSettings.welcomeToggle = false; + await welcomeSettings.save().catch(() => { }); + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to save the welcome Channel first ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + }; + + if (data.welcomeMessage) { + + if (data.welcomeMessage.length > 2000) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure text length is below 2000❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + welcomeSettings.welcomeMessage = data.welcomeMessage; + + } else { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please Provide me with a text ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + welcomeSettings.welcomeToggle = true; + welcomeSettings.welcomeChannel = database.id + welcomeSettings.welcomeEmbed = false + + + } + + }; + + if (Object.prototype.hasOwnProperty.call(data, "welcomeEnableEmbed") || Object.prototype.hasOwnProperty.call(data, "welcomeUpdateEmbed")) { + + let checkDM = req.body["dmUser"] + if (checkDM) { + welcomeSettings.welcomeDM = true + } else { + welcomeSettings.welcomeDM = false + } + + let checkIfEmbed = req.body["isEmbed"] + + let data = req.body + + if (checkIfEmbed) { + + + // author + + + // author name + if (data.author_name) { + + if (data.author_name.length > 256) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure the author length is below 200❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + + welcomeSettings.embed.author.name = data.author_name; + } else { + welcomeSettings.embed.author.name = ``; + + } + + // author URL + + if (data.author_url) { + + + + if (rgx.test(data.author_url) || data.author_url.toLowerCase() == "{useravatar}") { + + welcomeSettings.embed.author.url = data.author_url; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure this is a valid URL❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + } else { + welcomeSettings.embed.author.url = ``; + } + + + // icon + if (data.author_icon) { + + if (rgx.test(data.author_icon) || data.author_icon.toLowerCase() == "{useravatar}") { + + welcomeSettings.embed.author.icon = data.author_icon; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure this is a valid URL❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + + } else { + + welcomeSettings.embed.author.icon = ``; + } + + // embed Title + if (data.embedTitle) { + + if (data.embedTitle.length > 200) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure your title is under 200 characters long❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + + } + + welcomeSettings.embed.title = data.embedTitle + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please make sure to include a title❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + + // welcome embed title url + + if (data.embedTitleURL) { + + if (rgx.test(data.embedTitleURL)) { + + welcomeSettings.embed.titleURL = data.embedTitleURL; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Invalid Link Provided ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + return; + } + } else { + welcomeSettings.embed.titleURL = ``; + } + + // description + + if (data.embedDescription) { + + if (data.embedDescription.length > 2000) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Make sure the description is below 2000 characters long ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + welcomeSettings.embed.description = data.embedDescription; + } else { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please provide a description ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + // thumbnail URL + + if (data.embedThumbnail) { + + if (rgx.test(data.embedThumbnail) || data.embedThumbnail.toLowerCase() == "{useravatar}") { + + welcomeSettings.embed.thumbnail = data.embedThumbnail; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please provide a valid thumbnail❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + + } else { + + welcomeSettings.embed.thumbnail = ``; + + } + + if (data.embedImage) { + + if (rgx.test(data.embedImage) || data.embedImage.toLowerCase() == "{useravatar}") { + + welcomeSettings.embed.image = data.embedImage; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Please provide a valid image❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + + + } else { + + welcomeSettings.embed.image = ``; + + } + + // footer + + if (data.embedFooter) { + + if (data.embedFooter.length > 1048) { + + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Make sure the footer is under 1000 characters long ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + return; + } + welcomeSettings.embed.footer = data.embedFooter; + + } else { + + welcomeSettings.embed.footer = ""; + } + + // footer icon + + + if (data.embedFooterIcon) { + + if (rgx.test(data.embedFooterIcon)) { + + welcomeSettings.embed.footerIcon = data.embedFooterIcon; + + } else { + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Invalid Footer Icon ❌`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + + + + return; + + } + + } else { + welcomeSettings.embed.footerIcon = ""; + } + + // Timestamp + + let timestamp = req.body["timestamp"] + if (timestamp) { + welcomeSettings.embed.timestamp = true + } else { + welcomeSettings.embed.timestamp = false + } + + //color + if (data.embedColor) { + welcomeSettings.embed.color = data.embedColor + } else { + welcomeSettings.embed.color = `#000000` + } + + welcomeSettings.welcomeEmbed = true; + + //end + } else { + welcomeSettings.welcomeEmbed = false; + } + + welcomeSettings.welcomeToggle = true; + } + if (Object.prototype.hasOwnProperty.call(data, "welcomeDisable")) { + welcomeSettings.welcomeToggle = false; + + } + + if (Object.prototype.hasOwnProperty.call(data, "leaveDisable")) { + leaveSettings.leaveToggle = false; + + } + + await welcomeSettings.save().catch(() => { }) + await leaveSettings.save().catch(() => { }) + renderTemplate(res, req, "./new/mainwelcome.ejs", { + guild: guild, + alert: `Your Changes have been saved! ✅`, + settings: storedSettings, + welcome: welcomeSettings, + leave: leaveSettings, + }); + }); + + + //members + app.get("/dashboard/:guildID/members", checkAuth, async (req, res) => { + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + + const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + + renderTemplate(res, req, "./new/mainmembers.ejs", { + guild: guild, + members: guild.members.cache.array() + }); + }); + + app.get("/dashboard/:guildID/members/list", checkAuth, async (req, res) => { + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.status(404); + if (req.query.fetch) { + await guild.fetchMembers(); + } + const totals = guild.members.size; + const start = parseInt(req.query.start, 10) || 0; + const limit = parseInt(req.query.limit, 10) || 50; + let members = guild.members; + + if (req.query.filter && req.query.filter !== "null") { + members = members.filter(m => { + m = req.query.filterUser ? m.user : m; + return m["displayName"].toLowerCase().includes(req.query.filter.toLowerCase()); + }); + } + + + const memberArray = members.cache.array().slice(start, start + limit); + + const returnObject = []; + for (let i = 0; i < memberArray.length; i++) { + const m = memberArray[i]; + returnObject.push({ + id: m.id, + status: m.user.presence.status, + bot: m.user.bot, + username: m.user.username, + displayName: m.displayName, + tag: m.user.tag, + discriminator: m.user.discriminator, + joinedAt: m.joinedTimestamp, + createdAt: m.user.createdTimestamp, + highestRole: { + hexColor: m.roles.highest.hexColor + }, + memberFor: moment.duration(Date.now() - m.joinedAt).format(" D [days], H [hrs], m [mins], s [secs]"), + roles: m.roles.cache.map(r => ({ + name: r.name, + id: r.id, + hexColor: r.hexColor + })) + }); + } + res.json({ + total: totals, + page: (start / limit) + 1, + pageof: Math.ceil(members.size / limit), + members: returnObject + }); + }); + + + //automod + app.get("/dashboard/:guildID/automod", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainautomod.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/automod", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainautomod.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + + // moderation + + app.get("/dashboard/:guildID/moderation", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + var logSettings = await Logging.findOne({ guildId: guild.id }); + if (!logSettings) { + + const newSettings1 = new Logging({ + guildId: guild.id + }); + await newSettings1.save().catch(() => { }); + logSettings = await Logging.findOne({ guildId: guild.id }); + + } + + + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: null, + mod: logSettings.moderation, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/moderation", checkAuth, async (req, res) => { + + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + var logSettings = await Logging.findOne({ guildId: guild.id }); + if (!logSettings) { + + const newSettings1 = new Logging({ + guildId: guild.id + }); + await newSettings1.save().catch(() => { }); + logSettings = await Logging.findOne({ guildId: guild.id }); + + } + +const data = req.body +const mod = logSettings.moderation; + +//main Settings + if (Object.prototype.hasOwnProperty.call(data, "save_main")) { +const delete_after_executed = req.body["delete_after_executed"] +if(delete_after_executed){ +mod.delete_after_executed = "true"; +} else { +mod.delete_after_executed = "false" +}; + +const delete_reply = req.body["delete_reply"] +if(delete_reply){ +mod.delete_reply = "true" +} else { +mod.delete_reply = "false" +}; + +const include_reason = req.body["include_reason"]; +if(include_reason){ + mod.include_reason = "true"; +} else { + mod.include_reason = "false" +}; + +const remove_roles = req.body["remove_roles"] +if(remove_roles){ + mod.remove_roles = "true" +} else { + mod.remove_roles = "false" +}; + let autoroleValid = await guild.roles.cache.find((r) => "@" + r.name === data.role) + if(autoroleValid){ +mod.mute_role = autoroleValid.id; + } else { +mod.mute_role = null; + } + + const numbers = ["1", "2", "3", "4"] + + if(data.ban){ + if(numbers.includes(data.ban)){ + mod.ban_action = data.ban + } else { + mod.ban_action = "1" + } + } else { + mod.ban_action = "1" + } + + + if(data.kick){ + if(numbers.includes(data.kick)){ + mod.kick_action = data.kick + } else { + mod.kick_action = "1" + } + } else { + mod.kick_action = "1" + } + + + if(data.warn){ + if(numbers.includes(data.warn)){ + mod.warn_action = data.warn + } else { + mod.warn_action = "1" + } + } else { + mod.warn_action = "1" + } + + + if(data.mute){ + if(numbers.includes(data.mute)){ + mod.mute_action = data.mute + } else { + mod.mute_action = "1" + } + } else { + mod.mute_action = "1" + } + } + + if (Object.prototype.hasOwnProperty.call(data, "auto_punish_save") || Object.prototype.hasOwnProperty.call(data, "auto_punish_update")) { + + const amount = data.amount + + if(amount){ + + if(Number(amount) && Number(amount) < 51){ + mod.auto_punish.amount = amount + } else { + mod.auto_punish.amount = "1" + } + } else { + mod.auto_punish.amount = "1" + }; + + const punishments = ["1", "2", "3"] + if(data.punishment){ + if(punishments.includes(data.punishment)){ + mod.auto_punish.punishment = data.punishment + } else { + mod.auto_punish.punishment = "1" + } + } else { + mod.auto_punish.punishment = "1" + } + const numberss = ["1","2","3"] + if(data.dm){ + if(numberss.includes(data.dm)){ + mod.auto_punish.dm = data.dm + } else { + mod.auto_punish.dm = "1" + } + } else { + mod.auto_punish.dm = "1" + } + mod.auto_punish.toggle = "true" + } + + if (Object.prototype.hasOwnProperty.call(data, "auto_punish_disable")) { + mod.auto_punish.toggle = "false"; + await logSettings.save().catch(()=>{}); + + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: `Auto Punish has been disabled ✅`, + settings: storedSettings, + mod: mod, + }); + + return; + } + + if (Object.prototype.hasOwnProperty.call(data, "dm_disable")) { + mod.ban_message.toggle = "false"; + await logSettings.save().catch(()=>{}); + + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: `Ban Message has been disabled ✅`, + settings: storedSettings, + mod: mod, + }); + + return; + } + + if (Object.prototype.hasOwnProperty.call(data, "dm_save") || Object.prototype.hasOwnProperty.call(data, "dm_update")) { + +const message = data.dm_message +if(message && message.length){ +if(message.length > 1999){ + + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: `Please Provide a message under 2000 characters long`, + settings: storedSettings, + mod: mod, + }); + return; + +} +} else { + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: `Please Provide a message`, + settings: storedSettings, + mod: mod, + }); + return; +} + +mod.ban_message.toggle = "true"; +mod.ban_message.message = data.dm_message + } + await logSettings.save().catch(()=>{}); + + renderTemplate(res, req, "./new/mainmoderation.ejs", { + guild: guild, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + mod: mod, + }); + }); + + + //logging + + app.get("/dashboard/:guildID/logging", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + } + + + + var logSettings = await Logging.findOne({ guildId: guild.id }); + if (!logSettings) { + + const newSettings1 = new Logging({ + guildId: guild.id + }); + await newSettings1.save().catch(() => { }); + logSettings = await Logging.findOne({ guildId: guild.id }); + + } + + + + renderTemplate(res, req, "./new/mainlogging.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + log: logSettings, + }); + }); + + app.post("/dashboard/:guildID/logging", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + const data = req.body; + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + var logSettings = await Logging.findOne({ guildId: guild.id }); + if (!logSettings) { + + const newSettings1 = new Logging({ + guildId: guild.id + }); + await newSettings1.save().catch(() => { }); + logSettings = await Logging.findOne({ guildId: guild.id }); + + } + + + if (Object.prototype.hasOwnProperty.call(data, "moderation")) { + + + // checkboxes + const ban = req.body["ban"]; + if (ban) { + logSettings.moderation.ban = true; + } else { + logSettings.moderation.ban = false + } + + const kick = req.body["kick"] + if(kick){ + logSettings.moderation.kick = true; + } else { + logSettings.moderation.kick = false; + } + + + const role = req.body["role-a"] + if(role){ + logSettings.moderation.role = true; + } else { + logSettings.moderation.role = false; + } + + const purge = req.body["purge"] + if(purge){ + logSettings.moderation.purge = true; + } else { + logSettings.moderation.purge = false; + } + + const lock = req.body["lock"] + if(lock){ + logSettings.moderation.lock = true; + } else { + logSettings.moderation.lock = false; + } + + const warns = req.body["warns"] + if(warns){ + logSettings.moderation.warns = true; + } else { + logSettings.moderation.warns = false; + } + + const mute = req.body["mute"] + if(mute){ + logSettings.moderation.mute = true; + } else { + logSettings.moderation.mute = false; + } + + + const slowmode = req.body["slowmode"] + if(slowmode){ + logSettings.moderation.slowmode = true; + } else { + logSettings.moderation.slowmode = false; + } + + const nicknames = req.body["nicknames"] + if(nicknames){ + logSettings.moderation.nicknames = true; + } else { + logSettings.moderation.nicknames= false; + } + +//channel + + + + let channelValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.moderation_channel); + + if (channelValid) { + logSettings.moderation.channel = guild.channels.cache.find((ch) => `#${ch.name}` === data.moderation_channel).id; + } else { + logSettings.moderation.channel = null; + } + + + // ignore channel + + let channelValid2 = await guild.channels.cache.find((ch) => `#${ch.name}` === data.ignore_channel); + + if (channelValid2) { + logSettings.moderation.ignore_channel = guild.channels.cache.find((ch) => `#${ch.name}` === data.ignore_channel).id; + } else { + logSettings.moderation.ignore_channel = null; + } + + +//ignore role + + let roleValid = await guild.roles.cache.find((r) => "@" + r.name === data.ignore_role) + + if (roleValid) { + + logSettings.moderation.ignore_role = guild.roles.cache.find((r) => "@" + r.name === data.ignore_role).id; + + } else { + + logSettings.moderation.ignore_role = null; + + } + + //Color + const color = data.color + if(color){ + logSettings.moderation.color = data.color + } else { + logSettings.moderation.color = `#000000` + } + + //Toggle + + const toggle = req.body["toggle"] + if(toggle){ + logSettings.moderation.toggle = true + } else { + logSettings.moderation.toggle = false + } + + await storedSettings.save().catch(() => { }); + await logSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainlogging.ejs", { + guild: guild, + log: logSettings, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + + +return; + + } + + + + // server events + if (Object.prototype.hasOwnProperty.call(data, "server_events")) { + + + + // checkboxes + + const channel_created = req.body["channel_created"] + if(channel_created){ +logSettings.server_events.channel_created = true + } else { +logSettings.server_events.channel_created = false + } + + const channel_update = req.body["channel_update"] + if(channel_update){ +logSettings.server_events.channel_update = true + } else { +logSettings.server_events.channel_update = false + } + + const channel_delete = req.body["channel_delete"] + if(channel_delete){ +logSettings.server_events.channel_delete = true + } else { +logSettings.server_events.channel_delete = false + } + + const role_create = req.body["role_create"] + if(role_create){ +logSettings.server_events.role_create = true + } else { +logSettings.server_events.role_create = false + } + + const role_update = req.body["role_update"] + if(role_update){ +logSettings.server_events.role_update= true + } else { +logSettings.server_events.role_update = false + } + + const guild_update = req.body["guild_update"] + if(guild_update){ +logSettings.server_events.guild_update = true + } else { +logSettings.server_events.guild_update = false + } + + const emoji_update = req.body["emoji_update"] + if(emoji_update){ +logSettings.server_events.emoji_update = true + } else { +logSettings.server_events.emoji_update = false + } + + const member_join = req.body["member_join"] + if(member_join){ +logSettings.server_events.member_join = true + } else { +logSettings.server_events.member_join = false + } + + const member_leave = req.body["member_leave"] + if(member_leave){ +logSettings.server_events.member_leave = true + } else { +logSettings.server_events.member_leave = false + } + + const join = req.body["join"] + if(join){ +logSettings.server_events.voice.join = true + } else { +logSettings.server_events.voice.join = false + } + + + const move= req.body["move"] + if(move){ +logSettings.server_events.voice.move = true + } else { +logSettings.server_events.voice.move = false + } + + const leave = req.body["leave"] + if(leave ){ +logSettings.server_events.voice.leave = true + } else { +logSettings.server_events.voice.leave = false + } + + + + const dashboard = req.body["dashboard"] + if(dashboard){ +logSettings.server_events.dashboard = true + } else { +logSettings.server_events.dashboard = false + } + + + +//channel + + + + let channelValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.channel1); + + if (channelValid) { + logSettings.server_events.channel = guild.channels.cache.find((ch) => `#${ch.name}` === data.channel1).id; + } else { + logSettings.server_events.channel = null; + } + + + //Color + const color = data.color1 + if(color){ + logSettings.server_events.color = data.color1 + } else { + logSettings.server_events.color = `#000000` + } + + //Toggle + + const toggle = req.body["toggle1"] + if(toggle){ + logSettings.server_events.toggle = true + } else { + logSettings.server_events.toggle = false + } + + + await storedSettings.save().catch(() => { }); + await logSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainlogging.ejs", { + guild: guild, + log: logSettings, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + + +return; + } + + +// member events + + if (Object.prototype.hasOwnProperty.call(data, "member_events")) { + + + + const member_role_update = req.body["member_role_update"] + if(member_role_update){ +logSettings.member_events.role_update = true + } else { +logSettings.member_events.role_update = false + } + + const name_change = req.body["name_change"] + if(name_change){ + logSettings.member_events.name_change = true + } else { + logSettings.member_events.name_change = false + } + + + +//channel + + + + let channelValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.channel_member_events); + + if (channelValid) { + logSettings.member_events.channel = guild.channels.cache.find((ch) => `#${ch.name}` === data.channel_member_events).id; + } else { + logSettings.member_events.channel = null; + } + + + //Color + const color = data.member_events_color + if(color){ + logSettings.member_events.color = data.member_events_color + } else { + logSettings.member_events.color = `#000000` + } + + //Toggle + + const toggle = req.body["member_events_toggle"] + if(toggle){ + logSettings.member_events.toggle = true + } else { + logSettings.member_events.toggle = false + } + + + await storedSettings.save().catch(() => { }); + await logSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainlogging.ejs", { + guild: guild, + log: logSettings, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + + +return; + } + + + if (Object.prototype.hasOwnProperty.call(data, "message_events")) { + + const avatar_change = req.body["ignore"] + if(avatar_change){ +logSettings.message_events.ignore = true + } else { +logSettings.message_events.ignore = false + } + + const deleted = req.body["deleted"] + if(deleted){ +logSettings.message_events.deleted = true + } else { +logSettings.message_events.deleted = false + } + + const edited = req.body["edited"] + if(edited){ +logSettings.message_events.edited = true + } else { +logSettings.message_events.edited = false + } + + + const purged = req.body["purged"] + if(purged){ +logSettings.message_events.purged = true + } else { +logSettings.message_events.purged = false + } + +//channel + + + + let channelValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.message_events_channel); + + if (channelValid) { + logSettings.message_events.channel = guild.channels.cache.find((ch) => `#${ch.name}` === data.message_events_channel).id; + } else { + logSettings.message_events.channel = null; + } + + + //Color + const color = data.message_events_color + if(color){ + logSettings.message_events.color = data.message_events_color + } else { + logSettings.message_events.color = `#000000` + } + + //Toggle + + const toggle = req.body["message_events_toggle"] + if(toggle){ + logSettings.message_events.toggle= true + } else { + logSettings.message_events.toggle = false + } + + + await storedSettings.save().catch(() => { }); + await logSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainlogging.ejs", { + guild: guild, + log: logSettings, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + + +return; + } + + }); + + // auto role + + app.get("/dashboard/:guildID/autorole", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + + const member = await guild.members.fetch(req.user.id).catch(() => { + res.redirect("/dashboard") + return; + }); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + var stickySettings = await StickySettings.findOne({ guildId: guild.id }); + if (!stickySettings) { + + const newSettingss = new StickySettings({ + guildId: guild.id + }); + await newSettingss.save().catch(() => { }); + stickySettings = await StickySettings.findOne({ guildId: guild.id }); + + + + } + + renderTemplate(res, req, "./new/mainautorole.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + sticky: stickySettings + }); + }); + + app.post("/dashboard/:guildID/autorole", checkAuth, async (req, res) => { + + + let data = req.body; + + + + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + var stickySettings = await StickySettings.findOne({ guildId: guild.id }); + if (!stickySettings) { + + const newSettingss = new StickySettings({ + guildId: guild.id + }); + await newSettingss.save().catch(() => { }); + stickySettings = await StickySettings.findOne({ guildId: guild.id }); + + + + } + + if (Object.prototype.hasOwnProperty.call(data, "autoroleEnable") || Object.prototype.hasOwnProperty.call(data, "autoroleUpdate")) { + + + storedSettings.autoroleToggle = true; + + let autoroleValid = await guild.roles.cache.find((r) => "@" + r.name === data.role) + + if (autoroleValid) { + + storedSettings.autoroleID = guild.roles.cache.find((r) => "@" + r.name === data.role).id; + + } else { + + storedSettings.autoroleToggle = false; + storedSettings.autoroleID = null; + + } + + + } + + if (Object.prototype.hasOwnProperty.call(data, "autoroleDisable")) { + + storedSettings.autoroleToggle = false; + storedSettings.autoroleID = null; + + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainautorole.ejs", { guild: guild, settings: storedSettings, sticky: stickySettings, alert: "Successfuly disabled the autorole Module ✅" }); + return; + + } + + if (Object.prototype.hasOwnProperty.call(data, "stickyroleEnable") || Object.prototype.hasOwnProperty.call(data, "stickyUpdate")) { + + + stickySettings.stickyroleToggle = true; + + let autoroleValid = await guild.roles.cache.find((r) => "@" + r.name === data.stickyrole) + + if (autoroleValid) { + + stickySettings.stickyroleID = guild.roles.cache.find((r) => "@" + r.name === data.stickyrole).id; + + } else { + + stickySettings.stickyroleToggle = false; + stickySettings.stickyroleID = null; + + } + + + } + + if (Object.prototype.hasOwnProperty.call(data, "stickyroleDisable")) { + + stickySettings.stickyroleToggle = false; + stickySettings.stickyroleID = null; + stickySettings.stickyroleUser = []; + await storedSettings.save().catch(() => { }); + await stickySettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/mainautorole.ejs", { guild: guild, settings: storedSettings, sticky: stickySettings, alert: "Successfuly disabled the sticky role Module ✅" }); + return; + + } + + await stickySettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + renderTemplate(res, req, "./new/mainautorole.ejs", { + guild: guild, + sticky: stickySettings, + alert: `Your Changes have been saved ✅`, + settings: storedSettings, + }); + }); + + + + // reaction roles + + app.get("/dashboard/:guildID/reactionroles", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: null, + emojiArray: EmojiArray, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/reactionroles", checkAuth, async (req, res) => { + + let data = req.body + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + if (Object.prototype.hasOwnProperty.call(data, "reset")) { + + const conditional = { + guildid: guild.id +} +const results = await ReactionRole.find(conditional) + +if (results && results.length) { + for (const result of results) { + const { guildid } = result + + try { + await ReactionRole.deleteOne(conditional) + } catch (e) { + console.log(e) + } + + } + +} + + +let resultsHeheLol = results.length +let resultsHehe = `reaction roles` +if (resultsHeheLol == '1') resultsHehe = 'reaction role'; + + + +if (resultsHeheLol === '0' || !results || !results.length){ + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `The current guild doesn't have any existing reaction Role to delete.`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + + return; +} + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Succesfuly wiped ${resultsHeheLol} ${resultsHehe} ✅`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + + + + return; + } + + +/* +sendChannel +messageID +emoji +role +rr +send + */ + +if(Object.prototype.hasOwnProperty.call(data, "send")){ + + + + + +//channel + let channelValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.sendChannel); + + + + let channel; + if(channelValid){ + channel = channelValid.id + } else { + + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Please Provide me with a valid Channel`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + + + return; + } + +let message; + if(data.messageID){ + + try { + + const emojimessage = await channelValid.messages.fetch(data.messageID) + message = emojimessage + } catch { + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Please Provide me with a valid message ID`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + return; + } + } else { + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Please Provide me with a valid message ID`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + + + return; + } + + const checkEmoji = data.emoji; + + let emoji; + if(EmojiArray.includes(checkEmoji)){ + emoji = checkEmoji + } else { + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Please Provide me with a valid Emoji`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + +return; + } + +let roleValid = await guild.roles.cache.find((r) => "@" + r.name === data.role); +let role; +if(roleValid){ + role = roleValid.id +} else { + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Please Provide me with a valid Role`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + + return; +} + +const numbers = ["1","2","3","4","5","6"]; +let rr; +if(numbers.includes(data.rr)){ + rr = Number(data.rr) +} else { + rr = 1 +} + + +message.react(emoji).catch(()=>{}) +await reactP.reactionCreate(client, guild.id , message.id, role, emoji, "false", rr); + + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Succesfully Created reaction role ✅`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + +return; +//end +} + + + + if (Object.prototype.hasOwnProperty.call(data, "save")) { + // color +if(data.reactionrolescolor){ +storedSettings.reactionColor = data.reactionrolescolor; +} else { + storedSettings.reactionColor = `#000000` +} + +// channel + + if(data.reactionroleslog === `None`){ + storedSettings.reactionLogs = null; + } else { + + let suggestionValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.reactionroleslog); + + if(suggestionValid){ + storedSettings.reactionLogs = guild.channels.cache.find((ch) => `#${ch.name}` === data.reactionroleslog).id; + } else { + storedSettings.reactionLogs = null; + }; + + + // rr dms + let checkrrDms = req.body["rrDM"]; + +if(storedSettings.isPremium == "false"){ + storedSettings.reactionDM = true +} else { + + + if(checkrrDms){ +storedSettings.reactionDM = true +} else { + storedSettings.reactionDM = false +} + +} + + + } + } + await storedSettings.save().catch(()=>{}) + renderTemplate(res, req, "./new/mainreactionroles.ejs", { + guild: guild, + alert: `Your Changes have been saved ✅`, + emojiArray: EmojiArray, + settings: storedSettings, + }); + }); + + + + // leve;s + + app.get("/dashboard/:guildID/levels", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainlevels.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/levels", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainlevels.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + + // embeds + + app.get("/dashboard/:guildID/embeds", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainembeds.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/embeds", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + const user = member + + if (req.body.type === 'embed') { + + let guild = client.guilds.cache.get(req.body.guild), + channel = guild && guild.channels.cache.get(req.body.to), + data = req.body.json; + if (!guild || !channel || !data) return res.status(400).send('Some data is missing'); + const fetchmember = await guild.members.fetch(user.id); + if (!fetchmember || !fetchmember.hasPermission('ADMINISTRATOR')) return res.status(403).send("You don't have permission."); + if (!channel.permissionsFor(channel.guild.client.user).has("SEND_MESSAGES")) return res.status(403).send("I'm missing 'send message' permissions"); + if (cooldownEmbed.has(guild.id)) return res.status(403).send("Slow Down!"); + try { + await channel.send(data) + cooldownEmbed.add(guild.id); + setTimeout(() => { + cooldownEmbed.delete(guild.id) + }, 5000) + return; + } catch (err) { + res.status(403).send(`403 - ${err}`) + return; + } + res.send(); + + + } else if (req.body.type === 'customcommand') { + + + let guild = client.guilds.cache.get(req.params.guildID), + data = req.body.json, + cmdname = req.body.command + + if (!guild || !data) return; + + const name = cmdname.toLowerCase() + if (!name) return; + const check = cmdname.toLowerCase() + if (!check) return; + if (client.commands.get(check) || client.aliases.get(check)) return; + const content = JSON.stringify(data) + if (!content) return; +if(storedSettings.isPremium === "false"){ + const conditional = { + guildId: message.guild.id +} +const results = await customCommand.find(conditional) + +if(results.length >= 10) return; + +} + customCommand.findOne({ + guildId: guild.id, + name + }, async (err, data) => { + if (!data) { + customCommand.create({ guildId: guild.id, name, content, json: true }); + return; + } + else { + + } + }) + + } + + }); + + + app.get("/contact", async (req, res) => { + renderTemplate(res, req, "contact.ejs") + }); + + app.get("/report", async (req, res) => { + renderTemplate(res, req, "report.ejs") + }); + + app.post("/report", async (req, res) => { + + + if (req.body.type === "report") { + const reportEmbed = new WebhookClient('', ''); + + const report = new MessageEmbed() + .setColor('GREEN') + .setTitle(`Pogy Reports`) + .setDescription(`Someone just reported a user!\n\nUser: ${req.body.name}\`(${req.body.id})\`\nReported User: ${req.body.reported_user}\nReported User ID: ${req.body.reported_id}\nReason: \`${req.body.reason}\`\nProof: ${req.body.proof}`); + + + reportEmbed.send({ + username: 'Pogy Reports', + avatarURL: `${domain}/logo.png`, + embeds: [report] + }); + + } + + }); + + + app.post("/contact", async (req, res) => { + + + if (req.body.type === 'contact') { + + const contactEmbed = new WebhookClient('', ''); + + const contact = new MessageEmbed() + .setColor('GREEN') + .setTitle(`Contact Form`) + .setDescription(`Someone just contacted us!\n\nUser: ${req.body.name}\`(${req.body.id})\`\nEmail: ${req.body.email}\nMessage: \`${req.body.msg}\``); + + + contactEmbed.send({ + username: 'Pogy Contact', + avatarURL: `${domain}/logo.png`, + embeds: [contact] + }); + } + }); + + // tickets + + app.get("/dashboard/:guildID/tickets", checkAuth, async (req, res) => { + + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + const data = req.body; + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + } + + + var ticketSettings = await TicketSettings.findOne({ guildID: guild.id }); + if (!ticketSettings) { + + const newSettingsT = new TicketSettings({ + guildID: guild.id + }); + newSettingsT.ticketType = "reaction"; + await newSettingsT.save().catch(() => { }); + ticketSettings = await TicketSettings.findOne({ guildID: guild.id }); + } + + renderTemplate(res, req, "./new/maintickets.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + ticket: ticketSettings, + }); + + }); + + app.post("/dashboard/:guildID/tickets", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); + const data = req.body; +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + var ticketSettings = await TicketSettings.findOne({ guildID: guild.id }); + if (!ticketSettings) { + + const newSettingsz = new TicketSettings({ + guildID: guild.id + }); + newSettingsz.ticketType = "reaction"; + await newSettingsz.save().catch(() => { }); + + ticketSettings = await TicketSettings.findOne({ guildID: guild.id }); + } + + + if (Object.prototype.hasOwnProperty.call(data, "resetTicket")) { + + await ticketSettings.deleteOne().catch(() => { }) + + const newSettings = new TicketSettings({ + guildID: guild.id + }); + newSettings.ticketType = "reaction"; + await newSettings.save().catch(() => { }); + + ticketSettingsNew = await TicketSettings.findOne({ guildID: guild.id }); + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettingsNew, alert: "Successfuly Resetted Database ✅" }); + + + return; + } + + //..........................// + // ticket starts here // + //--------------------------// + + //General ticket Settings + + + if (Object.prototype.hasOwnProperty.call(data, "ticketEnable") || Object.prototype.hasOwnProperty.call(data, "ticketUpdate")) { + + ticketSettings.guildID = guild.id + ticketSettings.ticketToggle = true; + + //ticket Welcome Message + + + if (data.ticketWelcomeMessage) { + + if (data.ticketWelcomeMessage.length > 1024) { + + ticketSettings.ticketWelcomeMessage = `Hey {user} Welcome to your ticket! + +Thank you for creating a ticket, the support team will be with you shortly. +In the mean time, please explain your issue below` + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure your description is less than 1024 characters long!" }); + + return; + } + + ticketSettings.ticketWelcomeMessage = data.ticketWelcomeMessage + + } else { + + + ticketSettings.ticketWelcomeMessage = `Hey {user} Welcome to your ticket! + +Thank you for creating a ticket, the support team will be with you shortly. +In the mean time, please explain your issue below`; + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure to Include a ticket description!" }); + + return; + }; + + // Ticket Logs + + //ticket Logs Color + if (data.ticketLogColor) { + ticketSettings.ticketLogColor = data.ticketLogColor + } else { + ticketSettings.ticketLogColor = `#000000` + }; + + // ticket welcome color + if (data.ticketWelcomeColor) { + ticketSettings.ticketWelcomeColor = data.ticketWelcomeColor + } else { + ticketSettings.ticketWelcomeColor = `#000000` + }; + + + // ticket log channel + let ticketCategoryValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.ticketChannel); + + + + + if (ticketCategoryValid) { + + ticketSettings.ticketModlogID = guild.channels.cache.find((ch) => `#${ch.name}` === data.ticketChannel).id; + + + } else { + + + ticketSettings.ticketToggle = false; + ticketSettings.ticketModlogID = null; + + } + + + // support Role + + let autoroleValid = await guild.roles.cache.find((r) => "@" + r.name === data.ticketRole) + + if (autoroleValid) { + + ticketSettings.supportRoleID = guild.roles.cache.find((r) => "@" + r.name === data.ticketRole).id; + + } else { + + ticketSettings.ticketToggle = false; + ticketSettings.supportRoleID = null; + + } + + // ticket category + + let ticketLogValid = await guild.channels.cache.find((ch) => ch.name === data.ticketCategory && ch.type === "category"); + + + + if (ticketLogValid) { + + ticketSettings.categoryID = guild.channels.cache.find((ch) => ch.name === data.ticketCategory && ch.type === "category").id; + + + } else { + + + ticketSettings.ticketToggle = false; + ticketSettings.categoryID = null; + + } + + + // ticket limit + + if (data.ticketLimit) { + + let numbers = [`1`, `2`, `3`, `4`, `5`]; + if (!numbers.includes(data.ticketLimit)) { + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Invalid Number ❌" }); + + return; + } + + ticketSettings.maxTicket = data.ticketLimit; + + } else { + + ticketSettings.ticketToggle = false; + ticketSettings.maxTicket = `1`; + + } + + + // ping everyone + let checkPing = req.body["pingEveryone"]; + + if (checkPing) { + ticketSettings.ticketPing = true; + } else { + ticketSettings.ticketPing = false; + } + + // require reason for message + + let checkPingz = req.body["requireReason"]; + + if (ticketSettings.ticketType == "message") { + + if (checkPingz) { + ticketSettings.requireReason = true; + } else { + ticketSettings.requireReason = false; + } + + + } + + + // close ticket + let checkPing2 = req.body["ticketClose"]; + + if (storedSettings.isPremium == "false") { + ticketSettings.ticketClose = true; + } else { + if (checkPing2) { + ticketSettings.ticketClose = true; + } else { + ticketSettings.ticketClose = false; + } + } + // end + ticketSettings.ticketCustom == "false"; + } + + // disable ticketing + if (Object.prototype.hasOwnProperty.call(data, "ticketDisable")) { + ticketSettings.ticketToggle = false; + + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Successfuly disabled the ticket Module ✅" }); + return; + + } + + + + // send + + if (Object.prototype.hasOwnProperty.call(data, "sendEmbed")) { + + + + + if (sendingEmbed.has(guild.id)) { + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Slow Down! ❌" }); + return; + }; + + + + if (ticketSettings.ticketToggle == "true") { + + + if (ticketSettings.ticketType == "reaction" && ticketSettings.ticketCustom == "false") { + let embedColor = data.reactionPanelColor; + if (embedColor == "#000000") embedColor = guild.me.displayHexColor; + let reactionTitle = data.reactionTitle; + if (reactionTitle.length > 200) { + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure your title is not that long! ❌" }); + + return; + } + + let reactionDescription = data.reactionDescription; + if (reactionDescription.length > 1024) { + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure your description is not that long! ❌" }); + + return; + } + + let ticketChannel = await guild.channels.cache.find((ch) => `#${ch.name}` === data.ticketChannelReact); + + let ticketReaction = data.ticketReaction; + + if (storedSettings.isPremium == "false") ticketReaction = `🎫`; + + + if (!embedColor || !reactionTitle || !reactionDescription || !ticketChannel || !ticketReaction) { + + ticketSettings.ticketToggle = false; + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure your embed is correct ❌" }); + return; + } + + ticketSettings.ticketTitle = reactionTitle + ticketSettings.ticketDescription = reactionDescription + ticketSettings.ticketEmbedColor = embedColor + ticketSettings.ticketReactChannel = ticketChannel.id + let checkTimestamp2 = req.body["ticketTimestamp"]; + if (checkTimestamp2) { + ticketSettings.ticketTimestamp = true + } else { + ticketSettings.ticketTimestamp = false + } + + if (storedSettings.isPremium == "false") { + ticketSettings.ticketFooter = "Powered by Pogy.xyz"; + } else { + let checkFooter2 = req.body["reactionfooterEmbed"]; + if (checkFooter2) { + + if (data.reactionfooterEmbed.length > 140) { + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Make sure your footer is not that long! ❌" }); + return; + }; + + ticketSettings.ticketFooter = data.reactionfooterEmbed; + + } else { + ticketSettings.ticketFooter = null; + } + } + + + + let checkFooter = req.body["reactionfooterEmbed"]; + let reactionFooter = "Powered by Pogy.xyz"; + + + + let footer = "Powered by Pogy.xyz"; + if (storedSettings.isPremium == "true") footer = reactionFooter; + + + + + + let ticketEmbed = new Discord.MessageEmbed() + .setTitle(reactionTitle) + .setColor(embedColor) + .setDescription(reactionDescription) + + if (storedSettings.isPremium == "false") { + ticketEmbed.setFooter(`Powered by Pogy.xyz`) + } else { + + if (checkFooter) { + ticketEmbed.setFooter(data.reactionmbedFooter) + } + + } + + + let checkTimestamp = req.body["ticketTimestamp"]; + if (checkTimestamp) ticketEmbed.setTimestamp() + + ticketSettings.ticketType = "reaction"; + + + + + + let emoji = data.ticketReaction; + + + if (data.ticketReaction == "ticketReaction2" && storedSettings.isPremium == "true") { + emoji = "🎟️"; + } else if (data.ticketReaction == "✅" && storedSettings.isPremium == "true") { + emoji = "✅"; + } else if (data.ticketReaction == "📻" && storedSettings.isPremium == "true") { + emoji = "📻"; + } else if (data.ticketReaction == "☑️" && storedSettings.isPremium == "true") { + emoji = "☑️"; + } else if (data.ticketReaction == "📲" && storedSettings.isPremium == "true") { + emoji = "📲"; + } else if (data.ticketReaction == "📟" && storedSettings.isPremium == "true") { + emoji = "📟"; + } else if (data.ticketReaction == "🆕" && storedSettings.isPremium == "true") { + emoji = "🆕"; + } else if (data.ticketReaction == "📤" && storedSettings.isPremium == "true") { + emoji = "📤"; + } else if (data.ticketReaction == "📨" && storedSettings.isPremium == "true") { + emoji = "📨"; + } else if (data.ticketReaction == "🔑" && storedSettings.isPremium == "true") { + emoji = "🔑"; + } else if (data.ticketReaction == "🏷️" && storedSettings.isPremium == "true") { + emoji = "🏷️"; + } else { + emoji = "🎫"; + } + + + //end + if (data.ticketReaction == "ticketReaction1") emoji = "🎫"; + if (data.ticketReaction == "📩") emoji = "📩"; + + if (storedSettings.isPremium == "false") { + + if (data.ticketReaction == "🎫" || data.ticketReaction == "📩") { + ticketSettings.ticketReaction = data.ticketReaction + } else { + ticketSettings.ticketReaction = "🎫"; + } + + + } else { + + ticketSettings.ticketReaction = emoji + + } + + sendingEmbed.add(guild.id) + setTimeout(() => { + sendingEmbed.delete(guild.id) + }, 10000) + ticketChannel.send(ticketEmbed).then(async (s) => { + + s.react(emoji) + + ticketSettings.messageID.push(s.id) + await ticketSettings.save().catch(() => { }); + }) + + + } else if (ticketSettings.ticketType == "reaction" && ticketSettings.ticketCustom == "true") { + + + // get channel + + let messageChannel = await guild.channels.cache.find((ch) => `#${ch.name}` === data.ticketChannelReact); + + + + + if (messageChannel) { + + ticketSettings.ticketReactChannel = guild.channels.cache.find((ch) => `#${ch.name}` === data.ticketChannelReact).id; + + + } else { + + + ticketSettings.ticketToggle = false; + ticketSettings.ticketReactChannel = null; + + }; + + await ticketSettings.save().catch(() => { }); + + // get message ID + + if (!data.messageID || data.messageID.length < 1) { + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Could not find the following Message " }); + return; + } + + + try { + + await messageChannel.messages.fetch(data.messageID) + + } catch { + + renderTemplate(res, req, "./new/maintickets.ejs", { guild: guild, settings: storedSettings, ticket: ticketSettings, alert: "Could not find the following Message " }); + + return; + } + + let messageID = await messageChannel.messages.fetch(data.messageID) + + + + // get emoji reaction + + let emoji = data.ticketReaction; + if (data.ticketReaction == "ticketReaction2" && storedSettings.isPremium == "true") { + emoji = "🎟️"; + } else if (data.ticketReaction == "✅" && storedSettings.isPremium == "true") { + emoji = "✅"; + } else if (data.ticketReaction == "📻" && storedSettings.isPremium == "true") { + emoji = "📻"; + } else if (data.ticketReaction == "☑️" && storedSettings.isPremium == "true") { + emoji = "☑️"; + } else if (data.ticketReaction == "📲" && storedSettings.isPremium == "true") { + emoji = "📲"; + } else if (data.ticketReaction == "📟" && storedSettings.isPremium == "true") { + emoji = "📟"; + } else if (data.ticketReaction == "🆕" && storedSettings.isPremium == "true") { + emoji = "🆕"; + } else if (data.ticketReaction == "📤" && storedSettings.isPremium == "true") { + emoji = "📤"; + } else if (data.ticketReaction == "📨" && storedSettings.isPremium == "true") { + emoji = "📨"; + } else if (data.ticketReaction == "🔑" && storedSettings.isPremium == "true") { + emoji = "🔑"; + } else if (data.ticketReaction == "🏷️" && storedSettings.isPremium == "true") { + emoji = "🏷️"; + } else { + emoji = "🎫"; + } + + + + if (data.ticketReaction == "ticketReaction1") emoji = "🎫"; + if (data.ticketReaction == "📩") emoji = "📩"; + + if (storedSettings.isPremium == "false") { + if (data.ticketReaction == "🎫" || data.ticketReaction == "📩") { + ticketSettings.ticketReaction = data.ticketReaction + } else { + ticketSettings.ticketReaction = "🎫"; + } + } else { + + ticketSettings.ticketReaction = emoji + + } + + ticketSettings.guildID = guild.id + ticketSettings.messageID.push(messageID.id) + + + await messageID.react(emoji).catch(() => { }) + sendingEmbed.add(guild.id) + setTimeout(() => { + sendingEmbed.delete(guild.id) + }, 10000) + // end of message + + + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly reacted to the message! ✅" + }); + return; + } + + + + //end + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly sent the Embed ✅" + }); + return; + } + } + + if (Object.prototype.hasOwnProperty.call(data, "useMessage")) { + ticketSettings.ticketCustom = true; + ticketSettings.ticketType == "reaction"; + ticketSettings.guildID = guild.id + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly switched to Message Ticketing ✅" + }); + + return; + }; + + if (Object.prototype.hasOwnProperty.call(data, "useReaction")) { + ticketSettings.ticketCustom = false; + ticketSettings.guildID = guild.id + ticketSettings.ticketType == "reaction"; + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly switched to Reaction Ticketing ✅" + }); + return; + } + + + if (Object.prototype.hasOwnProperty.call(data, "switchReaction")) { + + ticketSettings.ticketCustom = false + ticketSettings.ticketType = "reaction" + + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly switched to Reaction Ticketing ✅" + }); + return; + } + + if (Object.prototype.hasOwnProperty.call(data, "switchReaction2")) { + + ticketSettings.ticketCustom = false + ticketSettings.ticketType = "message" + + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + + renderTemplate(res, req, "./new/maintickets.ejs", { + settings: storedSettings, + ticket: ticketSettings, + guild: guild, + alert: "Succesfuly switched to message Ticketing ✅" + }); + return; + } + + await ticketSettings.save().catch(() => { }); + await storedSettings.save().catch(() => { }); + renderTemplate(res, req, "./new/maintickets.ejs", { + guild: guild, + alert: `Your changes have been saved ✅`, + ticket: ticketSettings, + settings: storedSettings, + }); + + + }); + + // suggestions + + app.get("/dashboard/:guildID/suggestions", checkAuth, async (req, res) => { + let data = req.body; + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainsuggestions.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/suggestions", checkAuth, async (req, res) => { + let data = req.body; + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + if (Object.prototype.hasOwnProperty.call(data, "saveChannel")) { + + // suggestion channel + let suggestionValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.suggestionChannel); + + if (suggestionValid) { + storedSettings.suggestion.suggestionChannelID = guild.channels.cache.find((ch) => `#${ch.name}` === data.suggestionChannel).id; + } else { + storedSettings.suggestion.suggestionChannelID = null; + } + + } + + if (Object.prototype.hasOwnProperty.call(data, "additional")) { + let suggestionValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.logChannel); + + if (suggestionValid) { + storedSettings.suggestion.suggestionlogChannelID = guild.channels.cache.find((ch) => `#${ch.name}` === data.logChannel).id; + } else { + storedSettings.suggestion.suggestionlogChannelID = null; + } + + + + // allow to decline / approve + + let checkDecline = req.body["decline"] + + if (checkDecline) { + storedSettings.suggestion.decline = true; + } else { + storedSettings.suggestion.decline = false; + } + //delete message + let checkDecline2 = req.body["deleteSuggestion"] + + if (checkDecline2) { + storedSettings.suggestion.deleteSuggestion = true; + } else { + storedSettings.suggestion.deleteSuggestion = false; + } + } + + + + if (Object.prototype.hasOwnProperty.call(data, "premium")) { + + if (storedSettings.isPremium == "true") { + + //color + if (data.color) { + storedSettings.suggestion.suggestioncolor = data.color; + + } else { + + storedSettings.suggestion.suggestioncolor = `#000000` + } + + //description + + + if (data.description) { + + if (data.description.length > 1024) { + renderTemplate(res, req, "./new/mainsuggestions.ejs", { + guild: guild, + alert: `Make sure the description is less than 1024 characters long ❌`, + settings: storedSettings, + }); + return; + } + storedSettings.suggestion.description = data.description; + + } else { + storedSettings.suggestion.description = `{suggestion}` + } + + + // footer + + if (data.footer) { + + if (data.footer.length > 1024) { + renderTemplate(res, req, "./new/mainsuggestions.ejs", { + guild: guild, + alert: `Make sure the footer is less than 1024 characters long ❌`, + settings: storedSettings, + }); + return; + } + storedSettings.suggestion.footer = data.footer; + + } else { + storedSettings.suggestion.footer = `{suggestion}` + } + + //timestamp + + let time = req.body["timestamp"] + if (time) { + storedSettings.suggestion.timestamp = true + } else { + storedSettings.suggestion.timestamp = false + } + + //reaction + + if (data.flexRadioDefault) { + if (data.flexRadioDefault == "1" || data.flexRadioDefault == "2" || data.flexRadioDefault == "3") { + + + storedSettings.suggestion.reaction = data.flexRadioDefault; + + } else { + storedSettings.suggestion.reaction = `1`; + + } + } else { + + storedSettings.suggestion.reaction = `1`; + + } + } + } + + await storedSettings.save().catch(() => { }) + renderTemplate(res, req, "./new/mainsuggestions.ejs", { + guild: guild, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + }); + + // alt detector + + + app.get("/dashboard/:guildID/altdetector", checkAuth, async (req, res) => { + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + } + + + + var altSettings = await AltSettings.findOne({ guildID: guild.id }); + if (!altSettings) { + + const newSettings = new AltSettings({ + guildID: guild.id + }); + await newSettings.save().catch(() => { }); + altSettings = await AltSettings.findOne({ guildID: guild.id }); + + + } + + + + renderTemplate(res, req, "./new/mainaltdetector.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + alt: altSettings + }); + }); + + + app.post("/dashboard/:guildID/altdetector", checkAuth, async (req, res) => { + const data = req.body; + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + } + + + + var altSettings = await AltSettings.findOne({ guildID: guild.id }); + if (!altSettings) { + + const newSettings = new AltSettings({ + guildID: guild.id + }); + await newSettings.save().catch(() => { }); + altSettings = await AltSettings.findOne({ guildID: guild.id }); + + + } + + + if (Object.prototype.hasOwnProperty.call(data, "disable")) { + + altSettings.altToggle = false; + + } + if (Object.prototype.hasOwnProperty.call(data, "enable") || Object.prototype.hasOwnProperty.call(data, "update")) { + //channel + let altValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.channel); + + if (altValid) { + altSettings.altModlog = guild.channels.cache.find((ch) => `#${ch.name}` === data.channel).id; + } else { + altSettings.altModlog = null; + } + + + // account age + + const age = data.age; + + let days = age + if (isNaN(age)) days = '7' + if (Number(age) > 100) days = '7' + + altSettings.altDays = days; + + + + // action + + const action = data.action; + + if (action == "kick") { + altSettings.altAction = "kick" + } else if (action == "ban") { + altSettings.altAction = "ban" + } else { + altSettings.altAction = "none" + } + + + //whitelist + + const id = data.id + let arrID = id.split(",") + let newArr = [] + let con = newArr.concat(arrID) + + const arrFiltered = con.filter(el => { + return el != null && el != ''; + }); + + con = arrFiltered + + if (storedSettings.isPremium == "false") { + + if (con.length > 10) { + renderTemplate(res, req, "./new/mainaltdetector.ejs", { + guild: guild, + alert: `ID length exceeds 10 `, + settings: storedSettings, + alt: altSettings + }); + return; + } + + } else if (storedSettings.isPremium == "true") { + + if (con.length > 50) { + renderTemplate(res, req, "./new/mainaltdetector.ejs", { + guild: guild, + alert: `ID length exceeds 50 `, + settings: storedSettings, + alt: altSettings + }); + + return; + } + + } + + if (id) { + + altSettings.allowedAlts = con + + } else { + altSettings.allowedAlts = [] + } + + altSettings.altToggle = true + + } + + + + await altSettings.save().catch(() => { }) + + renderTemplate(res, req, "./new/mainaltdetector.ejs", { + guild: guild, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + alt: altSettings + }); + }); + + //reports + + app.get("/dashboard/:guildID/reports", checkAuth, async (req, res) => { + const data = req.body; + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + + renderTemplate(res, req, "./new/mainreports.ejs", { + guild: guild, + alert: null, + settings: storedSettings, + }); + }); + + app.post("/dashboard/:guildID/reports", checkAuth, async (req, res) => { + const data = req.body + + + const guild = client.guilds.cache.get(req.params.guildID); + if (!guild) return res.redirect("/dashboard"); + const member = await guild.members.fetch(req.user.id); + if (!member) return res.redirect("/dashboard"); + if (!member.permissions.has("MANAGE_GUILD")) return res.redirect("/dashboard"); +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") { + + return renderTemplate(res, req, "maintenance.ejs") + +} + var storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + if (!storedSettings) { + + const newSettings = new GuildSettings({ + guildId: guild.id + }); + await newSettings.save().catch(() => { }); + storedSettings = await GuildSettings.findOne({ guildId: guild.id }); + + + + } + + + if (Object.prototype.hasOwnProperty.call(data, "saveChannel")) { + + // report channel + let suggestionValid = await guild.channels.cache.find((ch) => `#${ch.name}` === data.reportChannel); + + if (suggestionValid) { + storedSettings.report.reportChannelID = guild.channels.cache.find((ch) => `#${ch.name}` === data.reportChannel).id; + } else { + storedSettings.report.reportChannelID = null; + } + + } + + if (Object.prototype.hasOwnProperty.call(data, "additional")) { + + if (data.reportColor) { + storedSettings.report.reportcolor = data.reportColor + } else { + storedSettings.report.reportcolor = `#000000` + } + + let checkDecline = req.body["disableUser"] + + if (checkDecline) { + storedSettings.report.disableUser = true; + } else { + storedSettings.report.disableUser = false; + } + + let checkDecline2 = req.body["disableIssue"] + + if (checkDecline2) { + storedSettings.report.disableIssue = true; + } else { + storedSettings.report.disableIssue = false; + } + + let checkDecline3 = req.body["upvote"] + + if (checkDecline3) { + + if (storedSettings.isPremium == "true") { + storedSettings.report.upvote = true; + + //reaction + + if (data.flexRadioDefault) { + if (data.flexRadioDefault == "1" || data.flexRadioDefault == "2" || data.flexRadioDefault == "3") { + + + storedSettings.report.reaction = data.flexRadioDefault; + storedSettings.report.upvote = true + + } else { + storedSettings.report.reaction = `1`; + + } + } else { + + storedSettings.report.reaction = `1`; + + } + + + } else { + storedSettings.report.upvote = false; + } + + } else { + storedSettings.report.upvote = false; + } + + + } + + + await storedSettings.save().catch(() => { }) + renderTemplate(res, req, "./new/mainreports.ejs", { + guild: guild, + alert: `Your changes have been saved ✅`, + settings: storedSettings, + }); + }); + + // + + app.get('/dblwebhook', async (req, res) => { + + res.send(`Top.gg API is currently working!`) + + }); + + app.post('/dblwebhook', webhook.middleware(), async (req) => { + let credits = req.vote.isWeekend ? 2000 : 1000; + + const apiUser = await fetch(`https://discord.com/api/v8/users/${req.vote.user}`, { + headers: { Authorization: `Bot ${process.env.TOKEN}` } + }).then(res => res.json()); + + + const msg = new Discord.MessageEmbed() + .setAuthor('Voting System', `${domain}/logo.png`) + .setColor('#7289DA') + .setTitle(`${apiUser.username} Just Voted`) + .setDescription(`Thank you **${apiUser.username}#${apiUser.discriminator}** (${apiUser.id}) for voting **Pogy**!`) + Hook.send(msg); + + const userSettings = await User.findOne({ discordId: req.vote.user }) + if (!userSettings) return User.create({ discordId: req.vote.user, votes: 1, lastVoted: Date.now() }); + + +let voteUser = await client.users.fetch(apiUser.id); + + + let voteNumber = userSettings.votes; + if(!voteNumber) voteNumber = 0 + if (voteUser) { + voteUser.send(new Discord.MessageEmbed() + .setColor('#7289DA') + .setTitle(`Thanks for Voting!`) + .setDescription(`Thank you **${apiUser.username}#${apiUser.discriminator}** (${apiUser.id}) for voting **Pogy**! \n\nVote #${voteNumber + 1}`)); + + }; + + + + + + await userSettings.updateOne({ votes: userSettings.votes + 1 || 1, lastVoted: Date.now() }); + }); + + + + + app.get("*", (req, res) => { + var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl; + + + + if (fullUrl == domain || fullUrl == `${domain}/style.css` || fullUrl == `${domain}/style.css` || fullUrl == `${domain}/favico.ico` ) { + + renderTemplate(res, req, "index.ejs"); + + + } else { + + renderTemplate(res, req, "404.ejs"); + } + }); + + app.listen(config.port, null, null, () => console.log(`Dashboard is up and running on port ${config.port}.`)); + + + const d = moment.duration(client.uptime); + const days = (d.days() == 1) ? `${d.days()}` : `${d.days()}`; + const hours = (d.hours() == 1) ? `${d.hours()}` : `${d.hours()}`; + const minutes = (d.minutes() == 1) ? `${d.minutes()}` : `${d.minutes()}`; + const seconds = (d.seconds() == 1) ? `${d.seconds()}` : `${d.seconds()}`; + + metrics.init({ apiKey: '9acd8fa5fffc29d9b4014df766ce7acf', host: 'pogy', prefix: 'pogy.' }); + function collectMemoryStats() { + var memUsage = process.memoryUsage(); + metrics.gauge('memory.rss', memUsage.rss); + metrics.gauge('memory.heapTotal', memUsage.heapTotal); + metrics.gauge('memory.heapUsed', memUsage.heapUsed); + metrics.gauge('CPU USAGE', cpu.usage()); + metrics.gauge('Ram Usage', (process.memoryUsage().heapUsed /1024 /1024).toFixed(2)); + metrics.gauge('guilds.size', client.guilds.cache.size); + metrics.gauge('users.size', client.guilds.cache.reduce((a, g) => a + g.memberCount, 0)); + metrics.gauge('ping', client.ws.ping); + + }; + setInterval(collectMemoryStats, 5000); + } diff --git a/dashboard/models/settings.js b/dashboard/models/settings.js new file mode 100644 index 00000000..55ddbda4 --- /dev/null +++ b/dashboard/models/settings.js @@ -0,0 +1,10 @@ +const { Schema, model } = require("mongoose"); +module.exports = { + name: "name" +} +const guildSettingSchema = new Schema({ + gid: { type: String }, + prefix: { type: String, default: "!" } +}); + +module.exports = model("guild_settings", guildSettingSchema); \ No newline at end of file diff --git a/dashboard/static/404/b1nzy.png b/dashboard/static/404/b1nzy.png new file mode 100644 index 00000000..a52cf6c3 Binary files /dev/null and b/dashboard/static/404/b1nzy.png differ diff --git a/dashboard/static/404/b1nzyavatar.png b/dashboard/static/404/b1nzyavatar.png new file mode 100644 index 00000000..dbe7f35d Binary files /dev/null and b/dashboard/static/404/b1nzyavatar.png differ diff --git a/dashboard/static/404/b1nzybanhammer.png b/dashboard/static/404/b1nzybanhammer.png new file mode 100644 index 00000000..db21dd27 Binary files /dev/null and b/dashboard/static/404/b1nzybanhammer.png differ diff --git a/dashboard/static/404/banhammer.png b/dashboard/static/404/banhammer.png new file mode 100644 index 00000000..cb20c4a1 Binary files /dev/null and b/dashboard/static/404/banhammer.png differ diff --git a/dashboard/static/404/feelsthinking.png b/dashboard/static/404/feelsthinking.png new file mode 100644 index 00000000..57ec5aa4 Binary files /dev/null and b/dashboard/static/404/feelsthinking.png differ diff --git a/dashboard/static/404/hypergibbs.png b/dashboard/static/404/hypergibbs.png new file mode 100644 index 00000000..90ed3dd1 Binary files /dev/null and b/dashboard/static/404/hypergibbs.png differ diff --git a/dashboard/static/404/hyperthink.png b/dashboard/static/404/hyperthink.png new file mode 100644 index 00000000..22ad095d Binary files /dev/null and b/dashboard/static/404/hyperthink.png differ diff --git a/dashboard/static/404/jake.gif b/dashboard/static/404/jake.gif new file mode 100644 index 00000000..384ad220 Binary files /dev/null and b/dashboard/static/404/jake.gif differ diff --git a/dashboard/static/404/lul.png b/dashboard/static/404/lul.png new file mode 100644 index 00000000..7ecf3864 Binary files /dev/null and b/dashboard/static/404/lul.png differ diff --git a/dashboard/static/404/owo.png b/dashboard/static/404/owo.png new file mode 100644 index 00000000..9914dc08 Binary files /dev/null and b/dashboard/static/404/owo.png differ diff --git a/dashboard/static/404/plane.png b/dashboard/static/404/plane.png new file mode 100644 index 00000000..f0670026 Binary files /dev/null and b/dashboard/static/404/plane.png differ diff --git a/dashboard/static/404/thonkang.png b/dashboard/static/404/thonkang.png new file mode 100644 index 00000000..d7c3e278 Binary files /dev/null and b/dashboard/static/404/thonkang.png differ diff --git a/dashboard/static/404/uwu.png b/dashboard/static/404/uwu.png new file mode 100644 index 00000000..df12a143 Binary files /dev/null and b/dashboard/static/404/uwu.png differ diff --git a/dashboard/static/arc-sw.js b/dashboard/static/arc-sw.js new file mode 100644 index 00000000..48fbba79 --- /dev/null +++ b/dashboard/static/arc-sw.js @@ -0,0 +1 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=99)}({3:function(e,t,n){"use strict";n.d(t,"a",function(){return r}),n.d(t,"e",function(){return c}),n.d(t,"i",function(){return i}),n.d(t,"h",function(){return a}),n.d(t,"b",function(){return d}),n.d(t,"j",function(){return f}),n.d(t,"c",function(){return p}),n.d(t,"d",function(){return s}),n.d(t,"f",function(){return l}),n.d(t,"g",function(){return m});var r={images:["bmp","jpeg","jpg","ttf","pict","svg","webp","eps","svgz","gif","png","ico","tif","tiff","bpg"],video:["mp4","3gp","webm","mkv","flv","f4v","f4p","f4bogv","drc","avi","mov","qt","wmv","amv","mpg","mp2","mpeg","mpe","m2v","m4v","3g2","gifv","mpv"],audio:["mid","midi","aac","aiff","flac","m4a","m4p","mp3","ogg","oga","mogg","opus","ra","rm","wav","webm","f4a","pat"],interchange:["json","yaml","xml","csv","toml","ini","bson","asn1","ubj"],documents:["pdf","ps","doc","docx","ppt","pptx","xls","otf","xlsx"],other:["swf"]},o="arc:",c={COMLINK_INIT:"".concat(o,"comlink:init"),NODE_ID:"".concat(o,":nodeId"),CDN_CONFIG:"".concat(o,"cdn:config"),P2P_CLIENT_READY:"".concat(o,"cdn:ready"),STORED_FIDS:"".concat(o,"cdn:storedFids"),SW_HEALTH_CHECK:"".concat(o,"cdn:healthCheck"),WIDGET_CONFIG:"".concat(o,"widget:config"),WIDGET_INIT:"".concat(o,"widget:init"),WIDGET_UI_LOAD:"".concat(o,"widget:load"),BROKER_LOAD:"".concat(o,"broker:load"),RENDER_FILE:"".concat(o,"inlay:renderFile"),FILE_RENDERED:"".concat(o,"inlay:fileRendered")},i="serviceWorker",a="/".concat("shared-worker",".js"),d="/".concat("dedicated-worker",".js"),f="/".concat("arc-sw-core",".js"),u="".concat("arc-sw",".js"),p=("/".concat(u),"/".concat("arc-sw"),"arc-db"),s="key-val-store",l="".concat("https://overmind.arc.io","/api/propertySession"),m="".concat("https://warden.arc.io","/mailbox/propertySession")},99:function(e,t,n){"use strict";n.r(t);var r=n(3);if("undefined"!=typeof ServiceWorkerGlobalScope){var o="https://arc.io"+r.j;importScripts(o)}else if("undefined"!=typeof SharedWorkerGlobalScope){var c="https://arc.io"+r.h;importScripts(c)}else if("undefined"!=typeof DedicatedWorkerGlobalScope){var i="https://arc.io"+r.b;importScripts(i)}}}); \ No newline at end of file diff --git a/dashboard/static/avatars/ace.png b/dashboard/static/avatars/ace.png new file mode 100644 index 00000000..6543bc03 Binary files /dev/null and b/dashboard/static/avatars/ace.png differ diff --git a/dashboard/static/avatars/chaz.gif b/dashboard/static/avatars/chaz.gif new file mode 100644 index 00000000..c98c018d Binary files /dev/null and b/dashboard/static/avatars/chaz.gif differ diff --git a/dashboard/static/avatars/indo.png b/dashboard/static/avatars/indo.png new file mode 100644 index 00000000..36be5f54 Binary files /dev/null and b/dashboard/static/avatars/indo.png differ diff --git a/dashboard/static/avatars/peter.gif b/dashboard/static/avatars/peter.gif new file mode 100644 index 00000000..960d4fcc Binary files /dev/null and b/dashboard/static/avatars/peter.gif differ diff --git a/dashboard/static/avatars/scoopy.png b/dashboard/static/avatars/scoopy.png new file mode 100644 index 00000000..66d81c02 Binary files /dev/null and b/dashboard/static/avatars/scoopy.png differ diff --git a/dashboard/static/avatars/slayer.png b/dashboard/static/avatars/slayer.png new file mode 100644 index 00000000..a522a2ea Binary files /dev/null and b/dashboard/static/avatars/slayer.png differ diff --git a/dashboard/static/avatars/streaks.gif b/dashboard/static/avatars/streaks.gif new file mode 100644 index 00000000..6d7cc122 Binary files /dev/null and b/dashboard/static/avatars/streaks.gif differ diff --git a/dashboard/static/avatars/sui.png b/dashboard/static/avatars/sui.png new file mode 100644 index 00000000..b0bc045e Binary files /dev/null and b/dashboard/static/avatars/sui.png differ diff --git a/dashboard/static/avatars/wlegit.png b/dashboard/static/avatars/wlegit.png new file mode 100644 index 00000000..5b90e033 Binary files /dev/null and b/dashboard/static/avatars/wlegit.png differ diff --git a/dashboard/static/cards/10.svg b/dashboard/static/cards/10.svg new file mode 100644 index 00000000..0d664649 --- /dev/null +++ b/dashboard/static/cards/10.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/static/cards/11.svg b/dashboard/static/cards/11.svg new file mode 100644 index 00000000..a0cff964 --- /dev/null +++ b/dashboard/static/cards/11.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/static/cards/4.svg b/dashboard/static/cards/4.svg new file mode 100644 index 00000000..065b4bd7 --- /dev/null +++ b/dashboard/static/cards/4.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/static/cards/8.svg b/dashboard/static/cards/8.svg new file mode 100644 index 00000000..ddf262f8 --- /dev/null +++ b/dashboard/static/cards/8.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dashboard/static/cards/application.png b/dashboard/static/cards/application.png new file mode 100644 index 00000000..d164e88c Binary files /dev/null and b/dashboard/static/cards/application.png differ diff --git a/dashboard/static/cards/embeds.png b/dashboard/static/cards/embeds.png new file mode 100644 index 00000000..3115fc2a Binary files /dev/null and b/dashboard/static/cards/embeds.png differ diff --git a/dashboard/static/cards/logging.png b/dashboard/static/cards/logging.png new file mode 100644 index 00000000..fa63c070 Binary files /dev/null and b/dashboard/static/cards/logging.png differ diff --git a/dashboard/static/cards/rr.png b/dashboard/static/cards/rr.png new file mode 100644 index 00000000..893fd1c6 Binary files /dev/null and b/dashboard/static/cards/rr.png differ diff --git a/dashboard/static/css/appeal.css b/dashboard/static/css/appeal.css new file mode 100644 index 00000000..234f628a --- /dev/null +++ b/dashboard/static/css/appeal.css @@ -0,0 +1,361 @@ +@import url(https://fonts.googleapis.com/css?family=Heebo|Ubuntu:700&display=swap); +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); +:root { + --mainBackground: #21222C; + --font1: 'Heebo', sans-serif; + --font2: 'Ubuntu', sans-serif; + --font3: 'Poppins', sans-serif; + --font4: Montserrat, sans-serif; + --defaultColor: rgb(192, 204, 209); + --font5: "Open Sans", "Helvetica Neue", "Segoe UI", "Calibri", "Arial", sans-serif; + --scrollbar: #222; +--scrollbar-thumb: #2b2b2b; +--scrollbar-hover: #363636; +--scrollbar-active: #454545; +} + +* { + margin: 0; + padding: 0; + color: white; + box-sizing: border-box; + box-sizing: border-box; + font-family: var(--font3); + scrollbar-color: #353535 transparent; +scrollbar-width: thin; + +} + +::-webkit-scrollbar { +width: 16px; +background-color: var(--scrollbar); +cursor: pointer; +} + +::-webkit-scrollbar-thumb { +background-color: var(--scrollbar-thumb); +height: 16px; +background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { +background-color: var(--scrollbar-hover); +} + +::-webkit-scrollbar-thumb:active { +background-color: var(--scrollbar-active); +} + + +body { + background-color: #2f2f2f; +} + +a { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; + transition: all .4s; +} + +a:focus { + outline: none!important; +} + +a:hover { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +p { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; +} + +ul, li { + margin: 0; + list-style-type: none; +} + +input { + border: none; + outline: none; +} + +textarea { + border: none; + outline: none; + max-width: 100%; + min-width: 100%; + max-height: 200px; +} + +textarea:focus, input:focus { + border-color: transparent!important; +} + +button { + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 45px; + width: 200px; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); + background-color: #43b581; + border: 2px solid #43b581; + color: #fff; +} + + +button:hover { + cursor: pointer; + transform: translateY(1px); +} + +iframe { + border: none!important; +} + +.container { + max-width: 1200px +} + +.container-contact { + z-index: 1; + width: 100%; + display: flex; + padding: 15px; + flex-wrap: wrap; + background: 0 0; + min-height: 100vh; + position: relative; + align-items: center; + justify-content: center; +} + + + + + + + + +.contact-map { + top: 0; + left: 0; + z-index: -2; + width: 100%; + height: 100%; + position: absolute; +} + +.wrap-contact { + width: 1170px; + position: relative; + border-radius: 10px; + background: #222222; + padding: 82px 180px 33px; + box-shadow: 0px 0px 20px 15px rgba(0, 0, 0, 0.103); +} + +.contact-form { + width: 100%; + display: flex; + flex-wrap: wrap; + padding-bottom: 68px; + justify-content: space-between; +} + + + +.contact-form-title { + width: 100%; + color: #fff; + display: block; + font-size: 39px; + font-weight: 700; + line-height: 1.2; + text-align: left; + padding-bottom: 44px; + font-family: var(--font3); +} + +.wrap-input { + width: 100%; + position: relative; + margin-bottom: 65px; + padding-bottom: 13px; +} + +.rs1-wrap-input { + width: calc((100% - 30px)/2); +} + +.label { + color: #fff; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + padding-left: 5px; +} + +.input { + width: 100%; + color: #fff; + display: block; + padding: 0 5px; + font-size: 18px; + background: 0 0; + line-height: 1.2; + font-weight: 500; +} + +.input-line { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: none; +} + +.input-line::before { + content: ""; + display: block; + position: absolute; + bottom: -2px; + left: 0; + width: 100%; + height: 2px; + transition: all .4s; + background: linear-gradient(90deg, #5a5460, #4f4c62); +} + +input.input { + height: 40px; + margin-top: 10px; + border-radius: 5px; +} + +textarea.input { + padding-top: 9px; + margin-top: 10px; + min-height: 110px; + border-radius: 5px; + padding-bottom: 13px; +} + +.container-contact-form-btn { + width: 100%; + display: flex; + flex-wrap: wrap; + margin-top: -25px; +} + +.contact-form-btn { + height: 50px; + color: #fff; + display: flex; + font-size: 16px; + padding: 0 20px; + line-height: 1.2; + min-width: 160px; + transition: all .5s; + border-radius: 25px; + align-items: center; + justify-content: center; + box-shadow: 0 10px 10px 0 #0000000f; + background: linear-gradient(150deg, #3f3b44, #3c3748); +} + +.contact-form-btn:hover { + box-shadow: 0 10px 10px 0 #1f1d2275; +} + +.contact-form-btn:hover i { + transform: translateX(10px); +} + +@media(max-width:992px) { + .wrap-contact { + padding: 82px 80px 33px; + } +} + +@media(max-width:768px) { + .rs1-wrap-input { + width: 100%; + } +} + +@media(max-width:576px) { + .wrap-contact { + padding: 82px 15px 33px; + } + .contact-form-title::after { + font-size: 35px; + font-weight: 600; + content: "Contact Us"; + } +} + +.validate-input { + position: relative; +} + +.alert-validate::before { + top: 58%; + right: 2px; + opacity: 0; + max-width: 70%; + font-size: 13px; + color: #c80000; + line-height: 1.4; + text-align: left; + visibility: hidden; + position: absolute; + border-radius: 2px; + pointer-events: none; + background-color: #fff; + transition: opacity .4s; + padding: 4px 25px 4px 10px; + transform: translateY(-50%); + border: 1px solid #c80000; + content: attr(data-validate); +} + +.contact-more { + color: #757184; + font-size: 14px; + line-height: 1.5; +} + +.contact-more-highlight { + color: #8a7b9d; +} + +body.full-screen .wrap-contact { + width: 100%; + height: 100%; +} + +body.full-screen .container-contact { + padding: 0; + width: 100%; + height: 100%; +} + +body.done form>div { + display: none !important; +} + diff --git a/dashboard/static/css/commands.css b/dashboard/static/css/commands.css new file mode 100644 index 00000000..e8d88f32 --- /dev/null +++ b/dashboard/static/css/commands.css @@ -0,0 +1,576 @@ +@import url(https://fonts.googleapis.com/css?family=Heebo|Ubuntu:700&display=swap); +:root { + --mainBackground: #21222C; + --font1: 'Heebo', sans-serif; + --font2: 'Ubuntu', sans-serif; + --font3: Montserrat, sans-serif; + --font4: "Open Sans", "Helvetica Neue", "Segoe UI", "Calibri", "Arial", sans-serif; + --defaultColor: rgb(192, 204, 209); + --scrollbar: #222; +--scrollbar-thumb: #2b2b2b; +--scrollbar-hover: #363636; +--scrollbar-active: #454545; +} + +* { + font-family: var(--font1); + text-decoration: none; + margin: 0; + box-sizing: border-box; +scrollbar-color: #353535 transparent; +scrollbar-width: thin; +} + +::-webkit-scrollbar { +width: 16px; +background-color: var(--scrollbar); +cursor: pointer; +} + +::-webkit-scrollbar-thumb { +background-color: var(--scrollbar-thumb); +height: 16px; +background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { +background-color: var(--scrollbar-hover); +} + +::-webkit-scrollbar-thumb:active { +background-color: var(--scrollbar-active); +} + + +::selection { + background-color: #383844; +} + +a { + font-style: none; + color: inherit +} + +body { + + background-color: #2f2f2f + background-size: cover; + color: white; +} + + + +span.userMention { + border-radius: 3px; + padding: 0 2px; + font-weight: 500; + unicode-bidi: -moz-plaintext; + unicode-bidi: plaintext; + color: #7289da; + background: rgba(114, 137, 218, .1); + position: relative; + cursor: pointer; +} + +span.userMention:hover { + color: #fff; + background-color: #7289da; +} + +.bottom { + position: absolute; + left: 50%; + bottom: 10px; + transform: translateX(-50%); + font-size: 20px; + z-index: -1; + display: none; +} + +.bottom * { + font-family: var(--font3); +} + +body.zoomed .cmdsBoxInner .menuIconFullScreen, .newTab, body.zoomed .win2 { + display: none; +} + +@keyframes win2An { + from { + right: -100px; + } +} + +.win2 { + position: fixed; + overflow: hidden; + z-index: -2; +} + +.win2.aside { + cursor: pointer +} + +.win2 .inner { + transition: 1s ease; + right: 0; + top: 50%; + width: 5%; + height: 80%; + position: fixed; + transform: translateY(-50%); + background-color: #282933; + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + animation: win2An 1s ease-in-out; + box-shadow: 0px 0px 20px 15px rgba(0, 0, 0, 0.103); +} + +body:not(.shoWin2) .win2 .inner>iframe { + opacity: 0; + pointer-events: none; + user-select: none; +} + +body .win2 .inner>iframe { + opacity: 1; + transition: .5s ease; +} + +body.shoWin2 .win2 .inner { + width: 70%; + right: 50%; + transform: translate(50%, -50%); + border-radius: 10px; +} + +#bmc-wbtn { + background: rgba(0, 0, 0, 0) linear-gradient(rgba(68, 69, 91, 0.357), rgba(75, 68, 91, 0.04)) repeat scroll 0% 0%!important; + width: 50px!important; + height: 50px!important; + z-index: -1!important; +} + +#bmc-wbtn>img { + filter: invert(63%) sepia(1%) saturate(200%) hue-rotate(233deg) brightness(90%) contrast(88%) !important; + width: 30px!important; + height: 30px!important; +} + +#bmc-wbtn>svg path { + fill: #948a92; +} + +#bmc-wbtn, iframe:last-of-type { + left: 18px!important; +} + +.cmdsBox { + width: 100%; +} + +.menuIconFullScreen { + width: 20px; + opacity: .5; + position: relative; + left: -25px; +} + +.menuIcon { + cursor: pointer; +} + +.menuIcon .menuIconDash:nth-child(2) { + padding-left: 10px; +} + +.menuIcon .menuIconDash { + width: 25px; + height: 2px; + margin: 4px 0; + background-color: #a5a5a5; +} + +.menuIcon .menuIconDashes { + pointer-events: none; +} + +.cmdsBoxInner>header { + display: none; +} + +body.zoomed .cmdsBoxInner { + border-radius: 0; + width: 100%; + height: 100%; +} + +body:not(.zoomed) .cmdsBoxInner { + width: 70%; + height: 80%; + border-radius: 10px; +} + +body:not(.zoomed) .cmdsBoxInner .menuIconDashes { + display: none; +} + +.menuIconFullScreen { + animation: menuIconFullScreen 1s ease; + position: relative; +} + +@keyframes menuIconFullScreen { + from { + transform: translateX(-70px); + opacity: 0; + } +} + +.menuIconDashes { + animation: menuIconDashes 1s ease; + position: relative; +} + +@keyframes menuIconDashes { + from { + transform: translateX(-70px); + opacity: 0; + } +} + +.cmdsBoxInner { + background-position: center; + background-size: cover; + transition: 1s ease; + box-shadow: 0px 0px 20px 15px rgba(0, 0, 0, 0.103); + box-shadow: 0px 0px 20px 15px 0px 0px 20px 15px rgba(0, 0, 0, 0.08); + background-color: #272833; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 100%; + height: 100%; + overflow: auto; +} + +h5 { + font-weight: 600; + text-transform: uppercase; + font-size: 13px; + line-height: 16px; + color: #676a70; + font-family: var(--font2); + padding: 10px 0; +} + +.cmdsBoxCmdsContainer { + transition: 1s ease; + display: grid; + grid-template-columns: 1fr 3fr; + width: 100%; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; +} + +body:not(.zoomed) .cmdsBoxInner .cmdsBoxCmdsContainer { + border-radius: 0; +} + +body.zoomed .cmdsBoxInner .cmdsBoxCmdsContainer { + border-radius: 0; +} + +body.zoomed .cmdsBoxInner .cmdsBoxCmdsContainer .cmdFilters .cmdFilter, body.zoomed .cmdsBoxInner .cmdFilters h5 { + padding-left: 50px; +} + +body:not(.zoomed) .cmdsBoxInner .cmdsBoxCmdsContainer .cmdFilters .cmdFilter, body:not(.zoomed) .cmdsBoxInner .cmdFilters h5 { + padding-left: 20px; +} + +.separator { + background: linear-gradient(to right, #3e425300, #3e4253d3, #3e425300); + width: 100%; + height: 1px; + margin: 5px 0; + position: relative; +} + +.cmdsBoxCmdsContainer .cmdFilters { + transform: translateY(55px); + position: relative; + min-width: 200px; +} + +.cmdsBoxCmdsContainer .cmdFilters div:first-child { + transition: .5s ease-out; +} + +.cmdsBoxCmdsContainer .cmdFilters .tips:not(.active) { + display: none; +} + +.cmdsBoxCmdsContainer .cmdFilters .tips.active { + display: block; +} + +.cmdsBoxCmdsContainer .cmdFilters .tips { + border-radius: 10px; + margin: 10px; + box-shadow: 0 0px 10px rgba(0, 0, 0, .2); + max-width: 250px; + position: relative; + left: 5%; + padding: 20px; + background: linear-gradient(150deg, #18191c, #18191c70); + margin-right: 32px; +} + +.cmdsBoxCmdsContainer .cmdFilters .tips h5 { + padding-left: 0; + padding-top: 0; + color: #938d84; +} + +.cmdsBoxCmdsContainer .cmdFilters .tips .text { + color: #8a8c8c; + font-size: 15px; +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter:hover { + background: linear-gradient(to right, #32333f, #32333f00); +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter.active { + background: linear-gradient(to right, #32333f, #32333f00); +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter { + padding: 5px 10px; + margin: 5px 0; + cursor: pointer; +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter>a { + pointer-events: none; +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter .cmdFilterName { + padding: 0 5px; + position: relative; + top: -3px; + font-size: 14px; + transition: 1s ease; +} + +.cmdsBoxCmdsContainer .cmdFilters .cmdFilter img { + width: 20px; + position: relative; + top: 2px; +} + +.cmdsBoxCmdsContainer main { + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + padding: 10px 0; + margin-top: 46.4px; +} + +.cmd { + border-radius: 5px; + margin: 10px 0; + background: linear-gradient(to right, #1f2028, #21212b00); +} + +.cmd:not(.ccmd) { + cursor: pointer; +} + +.cmd .cmdData { + cursor: auto; + margin-bottom: 10px; +} + +.cmd .cmdData:not(.active) { + display: none; +} + +.cmd .cmdComps { + pointer-events: none; + padding: 10px; +} + +.cmd .cmdComps2 { + padding: 10px; + padding-top: 0; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +.exComp { + margin-left: 20px; +} + +.cmd .cmdMain { + color: #a5a5a5a9; +} + +.cmd .cmdCompTitle { + color: #b5b5b5; +} + +.cmd .cmdPrefix, .cmd .cmdDesc { + display: inline-block; +} + +.cmd .cmdDesc::before { + content: "-"; + padding: 0 5px; +} + +.cmd .cmdDesc { + color: #a5a5a5; +} + +#bmc-wbtn~div { + display: none !important; +} + +.lnk { + color: rgb(110, 114, 121); + position: relative; +} + +.lnk::after { + content: ""; + width: 100%; + position: absolute; + left: 0; + bottom: 1px; + border: 1px solid; + border-top-color: currentcolor; + border-right-color: currentcolor; + border-bottom-color: currentcolor; + border-left-color: currentcolor; + transition: .25s ease; + border-color: #45465975; +} + +.someInfo { + font-size: 90%; + opacity: .5; +} + +.emojiImage { + object-fit: contain; + vertical-align: bottom; + width: 1.375em; + height: 1.375em; +} + +@media screen and (max-width: 1215px) { + .win2 { + display: none; + } + body:not(.zoomed) .cmdsBoxInner { + width: 90%; + } +} + +@media screen and (max-width: 945px) { + .cmdsBoxInner { + width: 100%!important; + border-radius: 0!important; + bottom: 0!important; + } +} + +@media screen and (max-width:850px), screen and (max-height:610px) { + #bmc-wbtn { + z-index: 1!important; + } + #bmc-wbtn, iframe:last-of-type { + left: 5px !important; + } + #bmc-wbtn { + transform: scale(.8) !important; + } + .cmdsBox { + height: calc(100% - 46px); + } + .cmdsBoxCmdsContainer main { + margin-top: 10px; + } + .cmdsBoxInner { + position: relative; + border-radius: 0; + width: 100%!important; + height: 100%!important; + } + .cmdsBoxInner>header { + display: none!important; + } + body>header:first-child { + z-index: 100; + position: relative; + padding: 10px 10px; + } + body>header:first-child ul { + padding-left: 10px; + } + body>header:first-child li { + display: inline-block; + padding: 0 10px; + } +} + +@media screen and (max-width:630px) { + #bmc-wbtn, iframe:last-of-type { + left: auto !important; + } + .cmdsBoxCmdsContainer main { + padding: 10px; + margin-top: 0; + } + .cmdsBoxCmdsContainer { + grid-template-columns: 0 auto!important; + } + .cmdFilters * { + display: none; + } +} + +@media screen and (max-width:975px) { + .cmdsBoxCmdsContainer .cmdFilters .tips.active { + display: none!important; + } + .cmdsBoxCmdsContainer .cmdFilters .tipsBtn { + display: none!important; + } + .cmdsBoxCmdsContainer main { + margin-top: 10px; + } + .cmdsBoxCmdsContainer .cmdFilters { + margin-top: 100%; + } + body.zoomed .cmdsBoxInner .cmdsBoxCmdsContainer .cmdFilters .cmdFilter { + padding-left: 20px; + } + header:last-child { + padding-left: 60px; + } + .cmdsBoxCmdsContainer .cmdFilters { + min-width: 0; + } + .separator { + background: linear-gradient(to right, #3e425300, #464a5b, #3e425300); + } + .cmdFilters .cmdFilterName, .cmdFilters h5 { + display: none; + } + .cmdsBoxCmdsContainer { + grid-template-columns: 60px auto; + } +} \ No newline at end of file diff --git a/dashboard/static/css/contact.css b/dashboard/static/css/contact.css new file mode 100644 index 00000000..e72d3da4 --- /dev/null +++ b/dashboard/static/css/contact.css @@ -0,0 +1,366 @@ +@import url(https://fonts.googleapis.com/css?family=Heebo|Ubuntu:700&display=swap); +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); +:root { + --mainBackground: #21222C; + --font1: 'Heebo', sans-serif; + --font2: 'Ubuntu', sans-serif; + --font3: 'Poppins', sans-serif; + --font4: Montserrat, sans-serif; + --defaultColor: rgb(192, 204, 209); + --font5: "Open Sans", "Helvetica Neue", "Segoe UI", "Calibri", "Arial", sans-serif; + --scrollbar: #222; +--scrollbar-thumb: #2b2b2b; +--scrollbar-hover: #363636; +--scrollbar-active: #454545; +} + +* { + margin: 0; + padding: 0; + color: white; + box-sizing: border-box; + box-sizing: border-box; + font-family: var(--font3); + scrollbar-color: #353535 transparent; +scrollbar-width: thin; + +} + +::-webkit-scrollbar { +width: 16px; +background-color: var(--scrollbar); +cursor: pointer; +} + +::-webkit-scrollbar-thumb { +background-color: var(--scrollbar-thumb); +height: 16px; +background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { +background-color: var(--scrollbar-hover); +} + +::-webkit-scrollbar-thumb:active { +background-color: var(--scrollbar-active); +} + + +body { + background-color: #2f2f2f; +} + +a { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; + transition: all .4s; +} + +a:focus { + outline: none!important; +} + +a:hover { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +p { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; +} + +ul, li { + margin: 0; + list-style-type: none; +} + +input { + border: none; + outline: none; +} + +textarea { + border: none; + outline: none; + max-width: 100%; + min-width: 100%; + max-height: 200px; +} + +textarea:focus, input:focus { + border-color: transparent!important; +} + +button { + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 45px; + width: 200px; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); + background-color: #43b581; + border: 2px solid #43b581; + color: #fff; +} + + +button:hover { + cursor: pointer; + transform: translateY(1px); +} + +iframe { + border: none!important; +} + +.container { + max-width: 1200px +} + +.container-contact { + z-index: 1; + width: 100%; + display: flex; + padding: 15px; + flex-wrap: wrap; + background: 0 0; + min-height: 100vh; + position: relative; + align-items: center; + justify-content: center; +} + + + + + + + + +.contact-map { + top: 0; + left: 0; + z-index: -2; + width: 100%; + height: 100%; + position: absolute; +} + +.wrap-contact { + width: 1170px; + position: relative; + border-radius: 10px; + background: #222222; + padding: 82px 180px 33px; + box-shadow: 0px 0px 20px 15px rgba(0, 0, 0, 0.103); +} + +.contact-form { + width: 100%; + display: flex; + flex-wrap: wrap; + padding-bottom: 68px; + justify-content: space-between; +} + +.contact-form-title::after { + content: "Contact Us"; +} + +.contact-form-title { + width: 100%; + color: #fff; + display: block; + font-size: 39px; + font-weight: 700; + line-height: 1.2; + text-align: left; + padding-bottom: 44px; + font-family: var(--font3); +} + +.wrap-input { + width: 100%; + position: relative; + margin-bottom: 65px; + padding-bottom: 13px; +} + +.rs1-wrap-input { + width: calc((100% - 30px)/2); +} + +.label { + color: #fff; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + padding-left: 5px; +} + +.input { + width: 100%; + color: #fff; + display: block; + padding: 0 5px; + font-size: 18px; + background: 0 0; + line-height: 1.2; + font-weight: 500; +} + +.input-line { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: none; +} + +.input-line::before { + content: ""; + display: block; + position: absolute; + bottom: -2px; + left: 0; + width: 100%; + height: 2px; + transition: all .4s; + background: linear-gradient(90deg, #5a5460, #4f4c62); +} + +input.input { + height: 40px; + margin-top: 10px; + border-radius: 5px; +} + +textarea.input { + padding-top: 9px; + margin-top: 10px; + min-height: 110px; + border-radius: 5px; + padding-bottom: 13px; +} + +.container-contact-form-btn { + width: 100%; + display: flex; + flex-wrap: wrap; + margin-top: -25px; +} + +.contact-form-btn { + height: 50px; + color: #fff; + display: flex; + font-size: 16px; + padding: 0 20px; + line-height: 1.2; + min-width: 160px; + transition: all .5s; + border-radius: 25px; + align-items: center; + justify-content: center; + box-shadow: 0 10px 10px 0 #0000000f; + background: linear-gradient(150deg, #3f3b44, #3c3748); +} + +.contact-form-btn:hover { + box-shadow: 0 10px 10px 0 #1f1d2275; +} + +.contact-form-btn:hover i { + transform: translateX(10px); +} + +@media(max-width:992px) { + .wrap-contact { + padding: 82px 80px 33px; + } +} + +@media(max-width:768px) { + .rs1-wrap-input { + width: 100%; + } +} + +@media(max-width:576px) { + .wrap-contact { + padding: 82px 15px 33px; + } + .contact-form-title::after { + font-size: 35px; + font-weight: 600; + content: "Contact Us"; + } +} + +.validate-input { + position: relative; +} + +.alert-validate::before { + top: 58%; + right: 2px; + opacity: 0; + max-width: 70%; + font-size: 13px; + color: #c80000; + line-height: 1.4; + text-align: left; + visibility: hidden; + position: absolute; + border-radius: 2px; + pointer-events: none; + background-color: #fff; + transition: opacity .4s; + padding: 4px 25px 4px 10px; + transform: translateY(-50%); + border: 1px solid #c80000; + content: attr(data-validate); +} + +.contact-more { + color: #757184; + font-size: 14px; + line-height: 1.5; +} + +.contact-more-highlight { + color: #8a7b9d; +} + +body.full-screen .wrap-contact { + width: 100%; + height: 100%; +} + +body.full-screen .container-contact { + padding: 0; + width: 100%; + height: 100%; +} + +body.done form>div { + display: none !important; +} + +body.done .contact-form-title::after { + content: "Your Response was Recieved."!important; +} \ No newline at end of file diff --git a/dashboard/static/css/embed-css.css b/dashboard/static/css/embed-css.css new file mode 100644 index 00000000..414c138c --- /dev/null +++ b/dashboard/static/css/embed-css.css @@ -0,0 +1,2172 @@ +* { + outline: none; + box-sizing: border-box; +} + +:root { + --link: #00b0f4; + --embedTextColor: #dcddde; + --embedTextColor2: #72767d; + --embedBackground: #2f3136; + --fullEmbedBackground: #36393f; + --side1Background: #2c2e33; + --side1Background: #2f3136; + --background-secondary: #2f3136; + --background-tertiary: #202225; + --header-secondary: #b9bbbe; + --interactive-muted: #4f545c; +} + +body { + line-height: 1; + margin: 0px; + padding: 0px; + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + overflow: hidden; + background-color: var(--fullEmbedBackground); + color: #fff; +} +.no-js { +background: #f44336; +font-family: Roboto-Thin; +color: #fff; +text-align: center; +display: -ms-flexbox; +display: -webkit-flex; +display: flex; +-ms-flex-align: center; +-webkit-box-align: center; +align-items: center; +justify-content: center; +position: fixed; +user-select: none; +height: 100%; +width: 100%; +top: 0; +left: 0; +right: 0; +bottom: 0; +z-index: 999999; +} +.mainBuilder { + position: absolute; + width: 100%; + height: 100%; + display: grid; + grid-template-columns: 45% 55%; +} + +.top pre>code .hltChars { + color: #b96a97; + color: #b36391; +} + +.top pre>code .hltInt { + color: #a474e8; + color: #7658c8; +} + +.top pre>code .hltBool { + color: #d679c6; +} + +.top pre>code .hltStr1 { + color: #68b7c8; +} + +.top pre>code .hltStr2 { + color: #b58900; + color: #aab060; +} + +.mainBuilder section { + min-height: 0; + padding-right: 0; + position: relative; +} + +.mainBuilder .side1 { + width: 100%; + height: 100%; + background-color: var(--side1Background); + border-right: 1px solid var(--background-tertiary); + padding: 20px; +} + +.side1 .bottom .box { + background-color: #27282d; +} + +.top { + width: 100%; + height: 55%; + border: none; + padding: 5px; + outline: none; + border-radius: 5px; + background-color: #292b2f; + color: rgb(228, 225, 225); + border: 1px solid var(--background-tertiary); + overflow: auto; +} + +.side1 .item.top { + background-color: #292b2f; + width: 100%; + height: 94%; + border-radius: 5px; + transform: translateY(10px); +} + +body.gui .side1 .item.top { + transform: translateY(20px); +} + +.top, .bottom { + margin: auto; +} + +.mainBuilder .side2 { + height: 100%; + background-color: var(--fullEmbedBackground); + justify-content: center; + vertical-align: center; + overflow: auto; + scrollbar-color: #26272d #36393f; + scrollbar-width: thin; +} + +::-webkit-scrollbar { + width: 7px; + background: #36393f; +} + +.mainBuilder .side2::-webkit-scrollbar-thumb { + background: #26272d; +} + +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, q, s, samp, small, span, strike, strong, table, tbody, td, tfoot, th, thead, tr, tt, ul, var { + margin: 0px; + padding: 0px; + border: 0px; + font-weight: inherit; + font-style: inherit; + font-family: inherit; + font-size: 100%; + vertical-align: baseline; +} + +.hljs-comment, .hljs-quote { + color: var(--interactive-muted); +} + +.hljs-addition, .hljs-keyword, .hljs-selector-tag { + color: #859900; +} + +.hljs-doctag, .hljs-literal, .hljs-meta .hljs-meta-string, .hljs-number, .hljs-regexp, .hljs-string { + color: #2aa198; +} + +.hljs-name, .hljs-section, .hljs-selector-class, .hljs-selector-id, .hljs-title { + color: #268bd2; +} + +.hljs-attr, .hljs-attribute, .hljs-class .hljs-title, .hljs-template-variable, .hljs-type, .hljs-variable { + color: #b58900; +} + +.hljs-bullet, .hljs-link, .hljs-meta, .hljs-meta .hljs-keyword, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-subst, .hljs-symbol { + color: #cb4b16; +} + +.hljs-built_in, .hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: 700; +} + +.cm-string { + color: #92deea!important; +} + +.cm-string~.cm-string { + color: #c3e88d!important; +} + +.cm-number { + color: #d19a66!important; +} + +code, [class^="cm-"] { + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + font-size: 14px; + line-height: 16px; +} + +a img { + border: none; +} + +::-webkit-input-placeholder, body, button, input, select, textarea { + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + text-rendering: optimizelegibility; +} + +::placeholder, body, button, input, select, textarea { + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + text-rendering: optimizelegibility; +} + +a, button, div, input, label, select, span, strong, textarea { + outline: 0px; +} + +img[alt] { + text-indent: -9999px; +} + +.msgEmbed { + min-height: 2.75rem; + position: absolute; + overflow-wrap: break-word; + user-select: text; + width: 100%; + margin: 10px 0 0 0; + padding: calc(0.125rem + 10px) 20px 20px 92px; +} + +.msgEmbed:hover { + background-color: #04040512; +} + +.embedTitle>* { + line-height: 1.375rem; +} + +.contents { + position: static; + margin-left: 0px; + padding-left: 0px; + text-indent: 0px; +} + +.avatar { + position: absolute; + left: 36px; + margin-top: calc(4px - 0.125rem); + width: 40px; + height: 40px; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + user-select: none; + flex: 0 0 auto; + z-index: 1; +} + +.timeText { + font-size: 0.75rem; + line-height: 1.375rem; + color: var(--embedTextColor2); + vertical-align: baseline; + margin-left: 0.25rem; + display: inline-block; + height: 1.25rem; + cursor: default; + pointer-events: none; + font-weight: 500; +} + +.botTag { + height: 0.9375rem; + padding: 0px 0.275rem; + margin-top: 0.075em; + border-radius: 0.1875rem; + background: rgb(114, 137, 218); + font-size: 0.625rem; + text-transform: uppercase; + vertical-align: top; + display: inline-flex; + align-items: center; + flex-shrink: 0; + text-indent: 0px; + position: relative; + top: 0.1rem; + margin-left: 0.25rem; + line-height: 1.375rem; + white-space: break-spaces; + overflow-wrap: break-word; +} + +.botText { + position: relative; + font-size: 10px; + line-height: 15px; + text-transform: uppercase; + text-indent: 0px; + color: rgb(255, 255, 255); + font-weight: 500; +} + +.username { + cursor: pointer; + font-size: 1rem; + font-weight: 500; + line-height: 1.375rem; + color: #fff; + display: inline; + vertical-align: baseline; + position: relative; +} +.username:hover { +-webkit-animation:rainbow 1s infinite; +-ms-animation:rainbow 1s infinite; +-o-animation:rainbow 1s infinite; +animation:rainbow 1s infinite; +} +@-webkit-keyframes rainbow { +0% {color: #ff0000;} +10% {color: #ff8000;} +20% {color: #ffff00;} +30% {color: #80ff00;} +40% {color: #00ff00;} +50% {color: #00ff80;} +60% {color: #00ffff;} +70% {color: #0080ff;} +80% {color: #0000ff;} +90% {color: #8000ff;} +100% {color: #ff0080;} +} +@-ms-keyframes rainbow { +0% {color: #ff0000;} +10% {color: #ff8000;} +20% {color: #ffff00;} +30% {color: #80ff00;} +40% {color: #00ff00;} +50% {color: #00ff80;} +60% {color: #00ffff;} +70% {color: #0080ff;} +80% {color: #0000ff;} +90% {color: #8000ff;} +100% {color: #ff0080;} +} +@-o-keyframes rainbow { +0% {color: #ff0000;} +10% {color: #ff8000;} +20% {color: #ffff00;} +30% {color: #80ff00;} +40% {color: #00ff00;} +50% {color: #00ff80;} +60% {color: #00ffff;} +70% {color: #0080ff;} +80% {color: #0000ff;} +90% {color: #8000ff;} +100% {color: #ff0080;} +} +@keyframes rainbow { +0% {color: #ff0000;} +10% {color: #ff8000;} +20% {color: #ffff00;} +30% {color: #80ff00;} +40% {color: #00ff00;} +50% {color: #00ff80;} +60% {color: #00ffff;} +70% {color: #0080ff;} +80% {color: #0000ff;} +90% {color: #8000ff;} +100% {color: #ff0080;} +} +.imageWrapper { + display: block; + position: relative; + user-select: text; + overflow: hidden; + border-radius: 3px; +} + +.imageWrapper img { + position: absolute; +} + +.clickable { + cursor: pointer; +} + +.embed { + position: relative; + display: grid; + max-width: 520px; + box-sizing: border-box; + border-radius: 4px; + border-left: 4px solid var(--fullEmbedBackground); + background: var(--embedBackground); + border-color: #1e2327; +} + +.embedAuthorName, .embedAuthorNameLink, .embedDescription, .embedFieldName, .embedFieldValue, .embedFooterText, .embedLink, .embedProvider-3k5pfl, .embedTitle, .embedTitleLink-1Zla9e { + unicode-bidi: plaintext; + text-align: left; +} + +.emoji { + object-fit: contain; + width: 1.375em; + height: 1.375em; + vertical-align: bottom; +} + +.embed .emoji { + width: 18px; + height: 18px; +} + +.embedGrid { + overflow: hidden; + max-width: 516px; + padding: 0.5rem 1rem 1rem 0.75rem; + display: inline-grid; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-columns: auto min-content; +} + +.embedMargin { + margin-top: 8px; +} + +.embedLink { + text-decoration: none; + cursor: pointer; +} + +.embedAuthor { + display: flex; + align-items: center; + grid-column: 1 / 1; +} + +.embedAuthorName { + font-size: 0.875rem; + font-weight: 600; +} + +.embedAuthorIcon { + margin-right: 8px; + width: 24px; + height: 24px; + object-fit: contain; + border-radius: 50%; +} + +.embedTitle { + font-size: 1rem; + font-weight: 600; + display: inline-block; + grid-column: 1 / 1; +} + +.embedDescription { + font-size: 0.875rem; + line-height: 1.125rem; + font-weight: 400; + white-space: pre-line; + grid-column: 1 / 1; +} + +.embedImage { + margin-top: 16px; + grid-column: 1 / 1; + border-radius: 4px; + contain: paint; + grid-column: 1 / 3; + max-width: 100%; +} + +.embedImage, .embedThumbnail { + display: block; + object-fit: fill; +} + +.embedImage, .embedThumbnail { + display: block; + border-radius: 4px; +} + +.embedThumbnail { + width: 80px; + height: 80px; +} + +.embedThumbnail { + grid-area: 1 / 2 / 8 / 2; + margin-left: 16px; + margin-top: 8px; + flex-shrink: 0; + justify-self: end; + width: 80px; + height: 80px; +} + +.embedFooter { + display: flex; + align-items: center; + grid-area: auto / 1 / auto / 1; +} + +.embedFooter { + grid-column: 1 / 3; +} + +.embedFooterText { + font-size: 0.75rem; + line-height: 1rem; + font-weight: 500; + color: var(--embedTextColor); +} + +.embedFooterSeparator { + font-weight: 500; + color: var(--embedTextColor); + display: inline-block; + margin: 0px 4px; +} + +.embedFooterIcon { + margin-right: 8px; + width: 20px; + height: 20px; + object-fit: contain; + border-radius: 50%; +} + +.embedFields { + display: grid; + grid-column: 1 / 1; + margin-top: 8px; + gap: 8px; + min-width: 0px; + grid-gap: 8px; +} + +.embedField { + font-weight: 400; + font-size: 0.875rem; + line-height: 1.125rem; + min-width: 0px; +} + +.embedFieldName { + font-weight: 600; + margin-bottom: 2px; +} + +.embedFieldValue { + font-size: 0.875rem; + line-height: 1.125rem; + font-weight: 400; + white-space: pre-line; + min-width: 0px; +} + +.embedDescription, .embedFieldValue { + color: var(--embedTextColor); +} + +.embedAuthorName, .embedFieldName, .embedTitle { + color: #fff; +} + +.embedGrid>* { + display: none; +} + +.messageContent { + user-select: text; + margin-left: -72px; + padding-left: 72px; +} + +.messageContent.markup { + font-size: 1rem; + line-height: 1.375rem; + white-space: pre-wrap; + white-space: break-spaces; + word-wrap: break-word; + user-select: text; + font-weight: 400; +} + +strong { + font-weight: 600; +} + +u { + text-decoration: underline; +} + +.markup em { + font-style: italic; +} + +.markup strong { + font-weight: 700; +} + +.markup { + font-size: 1rem; + line-height: 1.375rem; + user-select: text; + color: var(--embedTextColor); + font-weight: 400; +} + +.markup a { + word-break: break-word; + text-decoration: none; + cursor: pointer; +} + +.anchor { + color: var(--link); +} + +.markup a:hover { + text-decoration: underline; +} + +.markup code { + font-size: 0.875rem; + line-height: 1.125rem; + text-indent: 0; + white-space: pre-wrap; + scrollbar-width: thin; + scrollbar-color: var(--background-tertiary) var(--background-secondary); + background: #2f3136; + border: 1px solid #202225; +} + +.markup pre>code { + display: block; + overflow-x: auto; + padding: .5em; + border-radius: 4px; + color: var(--header-secondary); + text-size-adjust: none; +} + +.embed blockquote { + max-width: 100%; +} + +.blockquote { + display: flex; +} + +.blockquote blockquote { + padding: 0 8px 0 12px; + box-sizing: border-box; + text-indent: 0; +} + +.blockquote .blockquoteDivider { + width: 4px; + border-radius: 4px; +} + +.blockquoteDivider { + background-color: var(--interactive-muted); +} + +.container { + display: grid; + grid-auto-flow: row; + row-gap: 0.25rem; + text-indent: 0px; + min-height: 0px; + min-width: 0px; + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.container>* { + place-self: start; +} + +.markup code { + font-size: 0.875rem; + line-height: 1.125rem; + text-indent: 0; + white-space: pre-wrap; + background: var(--background-secondary); + border: 1px solid var(--background-tertiary); +} + +.markup code.inline { + width: auto; + height: auto; + padding: .2em; + margin: -.2em 0; + border-radius: 3px; + font-size: 85%; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + text-indent: 0; + border: none; + white-space: pre-wrap; +} + +.markup pre, .markup blockquote { + max-width: 90%; +} + +.markup pre { + border-radius: 4px; + padding: 0; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + font-size: 0.75rem; + line-height: 1rem; + margin-top: 6px; + white-space: pre-wrap; + background-clip: border-box; +} + +.embed code { + border: none; + background: var(--background-tertiary); +} + +.CodeMirror { + background-color: #212121; + color: #eff; + width: 100%!important; + height: 100%!important; + background-color: inherit!important; +} + +.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { + background-image: none!important; +} + +.CodeMirror-lint-marker-error:after, .CodeMirror-lint-message-error:before { + content: "!"; + color: #f45711; + font-size: 20px; + position: relative; + left: 10px; + top: -3px; +} + +.CodeMirror-lint-message-error:before { + content: "!"; + color: #f45711; + font-size: 20px; + position: relative; + left: -15px!important; + top: 1px!important; +} + +.CodeMirror-lint-tooltip { + box-shadow: 1px 10px 15px rgb(0 0 0 / 17%); + background-color: #202225!important; + border: 1px solid #373a40!important; + color: #cacaca!important; +} + +.CodeMirror-lint-message { + padding: 5px 5px 10px 18px; +} + +.CodeMirror-code .CodeMirror-gutter-wrapper .CodeMirror-gutter-elt { + left: 0px!important; +} + +.CodeMirror-gutters { + background: #292b2f!important; + display: none; +} + +.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { + padding: 0 12px; +} + +.CodeMirror-lint-marker.CodeMirror-lint-marker-error { + left: 15px!important; +} + +.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { + padding: 0 15px!important; +} + +.CodeMirror-foldmarker { + color: #e5ecff!important; + text-shadow: none!important; + font-size: 20px; +} + +.CodeMirror-cursor { + border-left: 2px solid #6ba6ff !important; + height: 17px!important; +} + +.CodeMirror-scrollbar-filler { + display: none!important; +} + +.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + background: #202225!important; +} + +.cm-s-material-darker .cm-comment { + color: #5d616b!important; +} + +.cm-s-material-darker .CodeMirror-matchingbracket { + text-decoration: none!important; + background-color: rgb(173 192 212 / 3%)!important; + color: #b9c3d6 !important; + border-bottom: 1px solid #c2d6ff!important; + /* border: 1px solid #bacdf347; */ +} + +.notification { + position: relative; + bottom: 0; + left: 50%; + transform: translateX(-50%); + text-align: center; + position: fixed; + bottom: 0px; +} + +.notification .inline { + width: auto; + height: auto; + padding: .2em; + margin: -.2em 0; + border-radius: 3px; + font-size: 85%; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + text-indent: 0; + border: none; + overflow: hidden; + white-space: pre-wrap; + background-color: #4a3535; + color: white; + color: inherit; + background-color: inherit; + border: 1px dashed; +} + +@keyframes notifAn { + from { + opacity: 0; + bottom: -50px; + } +} + +.notification { + margin-top: 5px; + animation: notifAn .5s ease; + background-color: #202225; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding: 10px; + color: #8c4949; + display: none; + width: 100%; + z-index: 5; +} + +.col.cm-string.cm-property::before { + content: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' xml:space='preserve'%3E%3Cpath style='fill:%23D8D8DA;' d='M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256s256-114.615,256-256S397.385,0,256,0z M256,336.842c-44.648,0-80.842-36.194-80.842-80.842s36.194-80.842,80.842-80.842s80.842,36.194,80.842,80.842 S300.648,336.842,256,336.842z'/%3E%3Cpath style='fill:%23D4B6E6;' d='M282.947,188.632h220.076C485.09,122.726,441.507,67.394,383.64,34.044L229.053,188.632H282.947z'/%3E%3Cpath style='fill:%23EBAFD1;/*! fill: %23e592bf; */' d='M229.053,188.632L383.639,34.044C346.068,12.39,302.482,0,256,0c-23.319,0-45.899,3.135-67.368,8.978 v220.075L229.053,188.632z'/%3E%3Cpath style='fill:%23E07188;' d='M188.632,229.053V8.978C122.726,26.91,67.394,70.493,34.045,128.36l154.586,154.588V229.053z'/%3E%3Cg%3E%3Cpolygon style='fill:%23D8D8DA;' points='188.632,229.053 229.053,188.633 282.947,188.633 282.947,188.632 229.053,188.632 '/%3E%3Cpolygon style='fill:%23D8D8DA;' points='229.053,323.367 188.632,282.947 229.053,323.368 282.947,323.368 323.368,282.947 282.947,323.367 '/%3E%3C/g%3E%3Cpath style='fill:%23B4D8F1;' d='M503.024,188.632H282.947v0.001h0.958l39.463,40.42L477.955,383.64 C499.611,346.068,512,302.482,512,256C512,232.681,508.865,210.099,503.024,188.632z'/%3E%3Cpath style='fill:%23ACFFF4;' d='M323.368,282.947v220.075c65.905-17.932,121.238-61.517,154.586-119.382L323.368,229.053V282.947z'/%3E%3Cpath style='fill:%2395D5A7;' d='M282.947,323.368L128.361,477.956C165.932,499.61,209.518,512,256,512 c23.319,0,45.899-3.135,67.368-8.977V282.947L282.947,323.368z'/%3E%3Cpath style='fill:%23F8E99B;' d='M229.053,323.368H8.976C26.91,389.274,70.493,444.606,128.36,477.956l154.588-154.588H229.053z'/%3E%3Cpath style='fill:%23EFC27B;' d='M188.632,282.947L34.045,128.36C12.389,165.932,0,209.518,0,256c0,23.319,3.135,45.901,8.976,67.368 h220.076L188.632,282.947z'/%3E%3Cpolygon style='fill:%23E3E3E3;' points='283.905,188.633 282.947,188.633 323.368,229.053 '/%3E%3Cpath style='fill:%23B681D5;' d='M503.024,188.632C485.09,122.726,441.507,67.394,383.64,34.044L256,161.684v26.947h26.947H503.024z'/%3E%3Cpath style='fill:%23E592BF;' d='M383.639,34.044C346.068,12.39,302.482,0,256,0v161.684L383.639,34.044z'/%3E%3Cpath style='fill:%2380CB93;' d='M256,350.316V512c23.319,0,45.899-3.135,67.368-8.977V282.947l-40.421,40.421L256,350.316z'/%3E%3Cpolygon style='fill:%23F6E27D;' points='282.947,323.368 256,323.368 256,350.316 '/%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3C/svg%3E"); + width: 15px; + height: 100px; + display: block; + background-repeat: no-repeat; + position: absolute; + top: 0; + left: 40px; + cursor: pointer; + opacity: .5; + transition: 1s ease; +} + +.CodeMirror:hover .col.cm-string.cm-property::before { + opacity: 1; +} + +body.gui .side1 .item.top { + max-width: 90%; + height: 70%; + border-radius: 15px; +} + +body.gui .top>.CodeMirror { + display: none; +} + +.top>.gui { + height: 100%; + width: 100%; + background: #292b2f; + border-radius: 5px; + overflow-y: scroll; + overflow-x: hidden; + scrollbar-color: #202225 #292b2f; + scrollbar-width: thin; + margin-top: 15px; +} + +body:not(.gui) .top>.gui, body:not(.gui) .bottom, body:not(.gui) .pickerToggle { + display: none; +} + +.chooser { + display: flex; + height: 40px; + width: 100px; + border-radius: 5px; + margin-bottom: 10px; + padding: 7px; + background: #1b1c2061; + box-shadow: -2px -2px 10px 0px #0000; +} + +.chooser>.opt { + width: 50px; + cursor: pointer; + background: #292b2f; + border-radius: 4px; +} + +body.gui .chooser>.gui { + background: #41444a; +} + +body:not(.gui) .chooser>.json { + background: #41444a; +} + +.chooser>.back { + position: absolute; + height: 26px; + width: 43px; + border-radius: 4px; + background: #41444a; + transition: .5s ease-out; + pointer-events: none; +} + +body:not(.gui) .chooser>.back { + transform: translateX(43px); +} + +.chooser>.opt p { + display: flex; + justify-content: center; + font-size: 10px; + position: relative; + top: 50%; + transform: translateY(-50%); + pointer-events: none; +} + +.bottom { + /* margin: 40px auto auto auto!important; */ + max-width: 90%; +} + +@keyframes colrsAn { + 0% { + transform: translateX(-200px); + opacity: 0; + } +} + +.bottom .colrs { + animation: colrsAn .5s ease-out; + background: #212226; + border-radius: 10px; + width: 250px; + height: 130px; + position: absolute; + bottom: 20px; + box-shadow: -3px 3px 5px 0px #00000029; + display: grid; + grid-template-columns: 27% 73%; + grid-template-columns: 5% 27.5% 67.5%; +} + +.bottom .colrs .colr { + background: #41f097; +} + +.bottom .colrs.display { + display: grid; +} + +.colLeft { + border-radius: 15px; +} + +.colLeft .picker { + background: #292b2f; + border: 1px solid #ffffff24; +} + +.colLeft .picker>svg { + top: 7px; + right: 10px; + width: 16px; + height: 16px; + position: absolute; +} + +.col.colLeft>* { + border-radius: 8px; + cursor: pointer; +} + +.colRight { + margin: 0 10px; +} + +.cTop { + width: 100%; +} + +.cTop>h2 { + font-weight: 900; + margin-top: 10px; +} + +.cTop .desc { + font-size: 12px; + opacity: .6; + margin-top: 5px; +} + +.col { + display: grid; + grid-template-rows: 45% 45%; + gap: 10px; + height: 80%; + transform: translateY(-50%); + top: 50%; + position: relative; +} + +.pallets { + width: 100%; + display: grid; + /* grid-template-columns: repeat(8, 1fr); */ + grid-template-columns: repeat(6, minmax(25px, 1fr)); + gap: 5px 0px; + /* opacity: .7; */ + transition: .5s; +} + +.colrs:hover .pallets { + opacity: 1; +} + +.pallets>* { + background: black; + width: 17px; + height: 17px; + margin-left: 5px; + border-radius: 2px; + cursor: pointer; +} + +.color-picker { + transform: none; + width: 100%; + height: 100%; + top: 0!important; + left: 0!important; + border-radius: 10px; + overflow: hidden; +} + +.color-picker>div { + height: 100%!important; +} + +.colRight.picking .cTop>*:not(.color-picker), .colRight.picking .pallets, .colRight:not(.picking) .colBack { + display: none; +} + +.color-picker\:a { + display: none!important; +} + +@keyframes colBackAn { + from { + right: 50px; + } +} + +.colBack { + animation: colBackAn .2s ease-out; + position: absolute; + right: 0; + transform: translateX(40px); + z-index: 1000; + cursor: pointer; +} + +.colBack svg { + width: 20px; + height: 20px; + opacity: .6; +} + +.top { + scrollbar-color: #202225 #292b2f; + scrollbar-width: thin; + overflow: hidden; +} + +.top>.gui>.item { + cursor: pointer; + background: #212226; + height: 40px; + width: 90%; + margin: 8px auto; + border-radius: 7px; + background: linear-gradient(90deg, #212226, #21222600); + position: relative; + z-index: 2; +} + +.top>.gui>.item.active .ttle::after { + transform: scale(.8) rotate(180deg); +} + +.top>.gui>.item.active .ttle::after { + transform: scale(.8) rotate(180deg); +} + +.top>.gui>.item.inlineField.active .ttle, .top>.gui>.item:not(.active) .ttle~input { + display: none; +} + +.ttle, .ttle~input { + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + position: relative; + top: 50%; + transform: translateY(-50%); + margin-left: 15px; +} + +.top>.gui>.item.active .ttle~input:not(:placeholder-shown) { + font-weight: normal; + text-transform: none; + font-size: 12px; +} + +input, textarea { + background: transparent; + border: none; + color: inherit; +} + +.ttle~input { + width: 100%; +} + +.ttle::after { + content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' viewBox='0 0 24 24' height='30'%3E%3Cpath clip-rule='evenodd' fill='%23fff' d='M16.59 8.59004L12 13.17L7.41 8.59004L6 10L12 16L18 10L16.59 8.59004Z'%3E%3C/path%3E%3C/svg%3E"); + position: absolute; + right: 0; + top: -12px; + transform: scale(.8); + opacity: .1; + pointer-events: none; + transition: .2s ease; +} + +@keyframes editAn { + from { + opacity: 0; + transform: translateY(-40px); + } +} + +.top>.gui>.item~.edit { + animation: editAn .3s ease; + height: 40px; + width: 90%; + margin: 8px auto; + position: relative; + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px; + margin-top: 0; + background: #212226; +} + +.top>.gui>.item~.edit input { + align-self: start; + font-size: 13px; + position: relative; + margin-left: 15px; + transform: translateY(4px); +} + +.top>.gui>.item:not(.active)+.edit { + display: none; +} + +.top>.gui>.item:not(.inlineField).active { + margin-bottom: 0; + background: #212226; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.edit { + padding-left: 15px; +} + +.item:not(.rows2)+.edit { + display: flex; +} + +.editIcon { + display: flex; +} + +.editIcon, .editName, .editIcon input, .editName input { + width: 100%; + overflow: hidden; +} + +.editIcon .imgParent { + width: 24px; + height: 24px; + object-fit: contain; + border-radius: 50%; +} + +.editIcon>* { + display: inline-flex; +} + +.pickerToggle { + display: none; + bottom: 15px; + left: 15px; + position: absolute; + cursor: pointer; + z-index: 5; +} + +.pickerToggle>svg { + width: 20px; + height: 100%; +} + +textarea { + font-size: 13px; + min-width: 100%; + max-width: 100%!important; + height: 75px; + max-height: 200px; +} + +.top>.gui>.item.description+.edit, .top>.gui>.item.content+.edit { + height: auto; +} + +.top>.gui>.item.content+.edit textarea { + height: 80px; +} + +.browse { + margin-top: 25px; + font-size: 13px; + display: flex; + cursor: pointer; + position: absolute; + opacity: .5; +} + +.browse:hover { + opacity: 1; +} + +.browse>svg { + width: 20px; + position: relative; + z-index: 6; + height: 20px; + transform: translateY(-5px); + margin-right: 5px; +} + +.browse>p::after { + content: "Browse"; +} + +.browse.loading>svg:first-of-type, .browse:not(.loading)>svg:last-of-type, .browse.error>svg { + display: none; +} + +.browse.loading>p::after { + content: "Loading..."; +} + +.browse.error>p::after { + color: #ee9191; + content: "Request failed. (Check dev-tools)"; +} + +.linkName { + display: flex; +} + +.linkName, .linkName .txtCol, .linkName .txtCol>input[type="text"] { + width: 100%; + text-overflow: ellipsis; +} + +.txtCol>input[type="text"] { + overflow: auto; +} + +.top>.gui>.item.rows2+.edit { + height: 80px; +} + +input[type="file"], button[type="submit"] { + display: none; +} + +.largeImg+.edit .editIcon .imgParent { + width: 80px; + height: 80px; + border-radius: 4px; + object-fit: fill; + margin-top: 0; + margin-bottom: 15px; +} + +.top>.gui>.largeImg+.edit input { + transform: none; +} + +.largeImg+.edit .browse { + margin-top: 40px; + font-size: 13px; + display: flex; + cursor: pointer; + position: relative; + opacity: .5; + margin-left: 15px; +} + +.largeImg.image+.edit .browse { + margin-top: 35px; +} + +.largeImg+.edit .editIcon>* { + display: block; +} + +.largeImg+.edit { + height: auto!important; +} + +.largeImg.image+.edit .editIcon .imgParent { + width: 130px; + object-fit: contain; + border-radius: 4px; + object-fit: cover; +} + +.top>.gui>.item.fields+.edit input { + margin-left: 0; +} + +.top>.gui>.item.fields+.edit input[type="text"] { + width: 100%; +} + +.top>.gui>.item.fields+.edit { + height: auto; + padding-bottom: 15px; +} + +.top>.gui>.item.fields.active+.edit { + display: block; +} + +.designerFieldName { + width: 95%; + min-height: 30px; + border-radius: 5px; +} + +.designerFieldValue textarea { + padding: 5px 10px; +} + +.designerFieldName { + width: 100%; + min-height: 30px; + padding: 5px 10px; + margin-bottom: 2px; +} + +.designerFieldName>input[type="text"] { + font-weight: 700; +} + +.field~.field { + margin-top: 10px; +} + +.field .fieldInner { + width: 95%; + border-radius: 4px; + background: #292b2f; + border-radius: 5px; + margin-bottom: 2px; + transition: .3s ease; +} + +@keyframes lastFieldSlide { + from { + opacity: 0; + transform: translateY(100px); + } +} + +.gui>.item.fields+.edit>.field { + animation: lastFieldSlide .5s ease; +} + +.fields+.edit .fieldInner .designerFieldName { + background: #2d2e33; +} + +body { + counter-reset: fieldCount; +} + +.fieldNumber { + position: absolute; +} + +.fields+.edit { + z-index: 2; +} + +@keyframes fieldNumberFadeInAn { + from { + opacity: 0; + transition: opacity 1s ease; + } +} + +.fieldNumber::before { + animation: fieldNumberFadeInAn .2s ease-in; + counter-increment: fieldCount; + content: counter(fieldCount); + position: relative; + font-size: 20px; + right: 41px; + top: 22px; + z-index: -2; + opacity: .15; +} + +.inlineCheck, .removeBtn { + font-size: 11px; + font-weight: bold; + text-transform: uppercase; + cursor: pointer; + display: inline-block; + margin-top: 3px; +} + +#inlineCheck, [for="inlineCheck"] { + cursor: pointer; +} + +.removeBtn { + margin-left: 20PX; +} + +.removeBtn>svg { + width: 10px; + height: 10px; + transition: .5s ease; +} + +.removeBtn>span { + margin-left: 3px; + position: relative; + top: -1px; + transition: .5s ease; +} + +.removeBtn:hover>span, .removeBtn:hover>svg path { + color: #ff9191; + fill: #ff9191; +} + +.inlineCheck input[type="checkbox"] { + scale: .8; + cursor: pointer; +} + +.inlineCheck input[type="checkbox"]+span { + cursor: pointer; +} + +.sep { + width: 100%; + height: 2px; + background: linear-gradient(to right, #2f313600, #2f3136, #2f313600); +} + +.imgParent { + border-radius: 4px; + object-fit: fill; + margin-top: 0; + content: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' width='1400' height='780' viewBox='0, 0, 1400, 780'%3E%3Cg id='Background'%3E%3Crect x='0' y='0' width='1400' height='780' style='fill: %23212226;' fill='%23363A3E'/%3E%3C/g%3E%3Cg id='Background'/%3E%3Cg id='Background'%3E%3Cg%3E%3Cpath d='M463.326,212.495 L936.674,212.495 L936.674,567.505 L463.326,567.505 z' fill-opacity='0' stroke='%2343474B' stroke-width='30' stroke-miterlimit='10' style='stroke: %23888789;fill: %23888789;'/%3E%3Cpath d='M605.33,309.136 C605.33,328.961 589.259,345.032 569.435,345.032 C549.61,345.032 533.539,328.961 533.539,309.136 C533.539,289.312 549.61,273.241 569.435,273.241 C589.259,273.241 605.33,289.312 605.33,309.136 z' fill='%2343474B' style='fill: %23888789;'/%3E%3Cpath d='M878.689,507.548 L523.284,507.548 L570.618,406.173 L600.597,450.352 L700.789,298.092 L772.58,405.778 L806.503,368.699 z' fill='%2343474B' style='fill: %23888789;'/%3E%3C/g%3E%3C/g%3E%3Cstyle xmlns='http://www.w3.org/1999/xhtml' type='text/css'%3E%3C/style%3E%3C/svg%3E"); +} + +.largeImg+.edit .imgParent { + margin-bottom: 15px; +} + +.item:not(.largeImg)+.edit .imgParent[style*="content"] { + transform: scale(1); +} + +.item:not(.largeImg)+.edit .imgParent { + transform: scale(2); +} + +@keyframes addFieldFade { + from { + opacity: 0; + } +} + +.addField { + animation: addFieldFade .5s ease; + font-size: 13px; + display: flex; + cursor: pointer; + opacity: .5; + padding-top: 15px; + transition: .5s ease; +} + +.field+.addField { + margin-top: 5px; +} + +.addField>svg { + width: 16px; + position: relative; + z-index: 6; + height: 100%; + transform: translateY(-3px); + margin-left: 5px; + opacity: .8; +} + +.addField:hover, .addField:hover>svg { + opacity: 1; +} + +.clear { + left: 140px; + position: absolute; + cursor: pointer; + z-index: 5; + transform: translate(0, -5px); + padding: 8.5px; + border-radius: 100%; + background: #27282e; + width: 35px; + height: 35px; + transition: .5s ease; +} + +@keyframes emptyTxtAn { + from { + opacity: 0; + } +} + +.emptyTxt { + animation: emptyTxtAn 1s ease; + font-weight: 600; + text-transform: uppercase; + font-size: 30px; + line-height: 16px; + color: #41444a; + font-family: var(--font2); + padding: 10px 0; + top: 50%; + position: absolute; + left: 50%; + transform: translate(-50%, -50%); + pointer-events: none; +} + +@keyframes clearAn { + 0% { + transform: rotate(10deg); + } + 25% { + transform: rotate(-10deg); + } + 50% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-13deg); + } +} + +.clear:hover>svg { + animation: clearAn 1s ease-in-out forwards; + transform-origin: top right; +} + +.messageContent.empty, .messageContent+.container.empty, .emptyTxt { + display: none; +} + +.messageContent.empty+.container.empty+.emptyTxt { + display: block; + position: absolute; + top: 800%; +} + +.clear>svg { + width: 20px; + height: 100%; + position: relative; + left: -2.5px; + top: -2px; +} + +::-webkit-scrollbar { + width: 7px; + background: #292b2f00; +} + +::-webkit-scrollbar-thumb { + background: #202225; +} + +@media screen and (max-width: 1270px) { + .fieldNumber::before { + right: 300%; + } +} + +@media screen and (max-width: 530px) { + .msgEmbed { + margin: 20px 0px; + padding: 0.125rem 0 20px 65px; + } + .avatar { + left: 10px; + } + .mainBuilder .side1 { + padding: 10px; + } +} + +@media screen and (max-height: 760px) { + .bottom .colrs { + bottom: 10px; + } + body.gui .side1 .item.top { + height: 65%; + max-width: 100%; + width: 100%; + } + .bottom { + margin: 40px 0 0 0 !important; + } +} + +@media screen and (max-width: 1015px) { + .clear { + position: absolute; + cursor: pointer; + z-index: 5; + left: 135px; + } + .mainBuilder { + display: flex; + flex-direction: column; + } + .side1 .item.top { + height: 100%; + } + .notification .inline { + display: block; + margin-top: 5px; + } + .bottom .colrs { + bottom: 40px; + left: 200px; + display: none; + top: 0; + animation: colrsAn .1s ease-out; + box-shadow: 0px 5px 15px 0px #0000004f; + } + body.gui .side1 .item.top { + height: 85%; + max-width: 100%; + width: 100%; + } + .bottom { + margin: 40px 0 0 0 !important; + } + .pickerToggle { + display: block; + position: absolute; + cursor: pointer; + z-index: 5; + left: 170px; + border-left: 2px solid #4c5057; + padding-left: 15px; + bottom: auto; + margin-left: 15px; + } + .pickerToggle>svg { + width: 17px; + } + .side1 .item.top { + padding-top: 10px; + transform: translateY(10px); + } +} + +@media screen and (max-width: 460px) { + .bottom .colrs { + top: 70px; + left: 10px; + } + .top>.gui { + margin-top: 5px; + } +} + +/**/ + +.done { + position: fixed; + right: -30px; + bottom: 30px; + z-index: 5; + transition: right .50s ease-out; +} + +.done:not(.sent):hover { + right: 10px; + transition: right .30s ease-in; +} + +.done.position { + right: 30px; +} + +.done:not(.sent).position:hover { + right: 75px; +} + +.done .in { + position: relative; + border-radius: 3px; + background: linear-gradient(30deg, #202225, #202225); + padding: 10px 20px; + box-shadow: 0px 0px 20px 0px #0000002b; + display: flex; + cursor: pointer; + width: 105px; + max-width: 150px; + transition: max-width .50s ease-out; + overflow: hidden; + color: #dcdddec7; +} + +.done:not(.sent):hover .in { + width: auto; + max-width: 500px; + transition: max-width .30 ease-in; +} + +.done .in span { + font-family: var(--font2); + pointer-events: none; + transition: .5s ease-in-out; + color: #dcdddec7; +} + +.done .in svg { + width: 16px; + height: 100%; + margin-left: 10px; + pointer-events: none; +} + +.done .in svg path { + transition: .5s ease-in-out; + fill: #dcdddec7; +} + +.done .channels { + position: relative; + background: linear-gradient(30deg, #202225, #202225); + box-shadow: 0px 0px 20px 0px #0000002b; + display: flex; + color: #dcddde; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + max-height: 0; + transition: 0s ease-out; + overflow: hidden; +} + +.done:not(.sent):hover .channels { + max-height: 500px; + transition: max-height .50s ease-in; +} + +.done:not(.sent):hover .in span { + color: #dcddde; +} + +.done:not(.sent):hover .in svg path { + fill: #dcdddeea; +} + +.done .channels .selectOptions { + margin: 7px 12px; + padding: 5px 0; + overflow-y: scroll; +} + +.done .channels .selectOptions h5 { + margin-bottom: 5px; + font-weight: 600; + text-transform: uppercase; + font-size: 13px; + line-height: 16px; + color: #8e9297ad; + font-family: var(--font2); +} + +.done .channels .selectOptions .channel { + padding: 5px 10px; + cursor: pointer; + display: flex; + padding: 5px 10px; +} + +.done .channels .selectOptions .channel:hover { + background-color: #2c2f33; + border-radius: 4px; +} + +.done .channels .selectOptions .channel img { + width: 16px; + filter: contrast(.3); + position: relative; + top: -4px; + pointer-events: none; + transform: translateY(3.5px); +} + +.done .channels .selectOptions .channel span { + padding-left: 6px; + pointer-events: none; +} + +.selectOptions { + overflow: auto; +} + +.done .in>span::after { + content: "Send"; +} + +.done:not(.sent):hover .in>span::after { + content: "Send to"; +} + +.done.sent .in>span::after { + content: "Embed Sent!"; + color: #44ee95; +} + +.done.sent .in { + max-width: 200px; + background: transparent; + box-shadow: none; + width: auto; + transform: translateX(-15px); +} + +.done.sent .in svg { + display: none; +} + +.done.sent .channels { + background: transparent; + box-shadow: none; + opacity: .5; +} + +.done:not(.sent):hover .in { + border-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + width: 100%; +} + +.done:not(.sent):hover .in>svg { + width: 16px; + height: 100%; + margin-left: 10px; + transition: .5s ease; + transform: rotate(-90deg); +} + +.webhook { + display: flex; +} +.custom{ + display: flex; +} +.custom-text{ + height: 36px; + padding-left: 5px; + vertical-align: bottom; + min-width: 0px; + max-width: 100%; + width: 170px; + color: rgb(220, 221, 222); + font-size: 16px; + unicode-bidi: plaintext; + padding: 0px 9px; + background: rgb(32, 34, 37); + border-width: 2px; + border-style: solid; + border-color: transparent; + border-image: initial; + border-radius: 3px; + outline: none; + transition: background-color 150ms ease 0s, border-color, color; + margin: 10px 0; + +} + +.webhook-button-custom { + margin: 10px 20; + background-color: #43b581; + border: 2px solid #43b581; + color: #fff; + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 36px; + min-width: 0px; + + max-width: 100%; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); + +} + +.webhook-button-custom:hover { +transform: translateY(1px); + +} +.webhook-text { + height: 36px; + min-width: 0px; + max-width: 100%; + color: rgb(220, 221, 222); + font-size: 16px; + unicode-bidi: plaintext; + padding: 0px 9px; + background: rgb(32, 34, 37); + border-width: 2px; + border-style: solid; + border-color: transparent; + border-image: initial; + border-radius: 3px; + outline: none; + transition: background-color 150ms ease 0s, border-color, color; + margin: 10px 0; + width: 100%; +} + +.webhook-button { + margin: 20px; + background-color: #43b581; + border: 2px solid #43b581; + color: #fff; + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 36px; + min-width: 0px; + max-width: 100%; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); +} + +.webhook-button2 { + margin: 20px; + background-color: #7289da; + border: 2px solid #7289da; + color: #fff; + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 36px; + min-width: 0px; + max-width: 100%; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); +} + +.webhook-button:hover { + transform: translateY(1px); +} + +.webhook-button2:hover { + transform: translateY(1px); +} + +.dropbtn { + background: transparent; + border: none !important; + color: white; + padding: 16px; + font-size: 16px; + border: none; + cursor: pointer; +} + +.dropdown { + display: inline-block; + position: absolute; + top: 0; + right: 0; +} + +.dropdown-content { + display: none; + position: absolute; + right: 0; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); + z-index: 1; +} + +.dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; +} + +.dropdown-content a:hover { + background-color: #f1f1f1; +} + +.dropdown:hover .dropdown-content { + display: block; +} + +.dropdown:hover .dropbtn { + background-color: #2f2f2f; +} + +@keyframes webhookBtnFade { + from { + opacity: 0; + } +} + +.webhook>button { + margin: 0; + border: none; + opacity: 1; + animation: webhookBtnFade 1s ease; +} + +.webhook>button+button { + margin-left: 50px; +} + +.hook>h5 { + margin-top: 10px; + font-weight: 600; + text-transform: uppercase; + font-size: 13px; + line-height: 16px; + color: #8e9297ad; + font-family: var(--font2); +} + +.done:not(:hover) .hook { + display: none; +} + +.done .channels .selectOptions { + width: 100%; +} + +.dropbtn:not(:hover) { + color: #dcdddec7; +} + +.dropdown-content { + border-radius: 3px; + background: #202225; + margin-right: 15px; +} + +.dropdown-content a { + color: #dcdddec7; +} + +.dropdown-content a:hover { + background-color: #1c1d1f; +} \ No newline at end of file diff --git a/dashboard/static/css/embed.css b/dashboard/static/css/embed.css new file mode 100644 index 00000000..8b2b4227 --- /dev/null +++ b/dashboard/static/css/embed.css @@ -0,0 +1,168 @@ +a.patreon-link { + display: flex; + box-sizing: border-box; + width: 100%; + height: auto; + z-index: 10; + text-decoration: none; +} +.no-js { +background: #f44336; +font-family: Roboto-Thin; +color: #fff; +text-align: center; +display: -ms-flexbox; +display: -webkit-flex; +display: flex; +-ms-flex-align: center; +-webkit-box-align: center; +align-items: center; +justify-content: center; +position: fixed; +user-select: none; +height: 100%; +width: 100%; +top: 0; +left: 0; +right: 0; +bottom: 0; +z-index: 999999; +} +.badge-container { + width: 100%; + display: flex; + flex-direction: column; + padding: 5px 10px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.5); + text-align: center; +} +.badge-container .badge-icon { + background: url("https://s3.amazonaws.com/patreon_public_assets/toolbox/patreon_white.png") center center no-repeat; + background-size: contain; + width: 100%; + height: 20px; +} +.badge-container .badge-text { + font-family: "Lato", sans-serif; + font-size: 12px; + padding: 2px; + color: #fff; +} +.badge-container .badge-text.badge-text-bottom { + position: relative; + top: -2px; +} + +.preview { + background: #36393e; + display: flex; + box-orient: vertical; + flex-direction: column; +} + +.wrapper { + display: flex; + max-width: 520px; +} + +.container { + margin-top: 50px; +} + +.side-colored { + width: 4px; + border-radius: 3px 0 0 3px; + background: #4f545c; +} + +.embed { + border-radius: 0 3px 3px 0; + background: rgba(46, 48, 54, 0.3); + border-color: rgba(46, 48, 54, 0.6); + display: flex; + padding: 8px 10px; + color: rgba(255, 255, 255, 0.6); + font-size: 14px; +} +.embed .card-block { + padding: 0; + display: flex; + margin-bottom: 10px; +} +.embed a { + color: #0096cf; +} +.embed img.embed-thumb { + max-height: 80px; + max-width: 80px; + border-radius: 3px; + flex-shrink: 0; + width: auto; + -o-object-fit: contain; + object-fit: contain; + margin-left: 20px; +} +.embed .embed-footer { + font-size: 12px; +} +.embed .embed-footer span { + color: rgba(255, 255, 255, 0.6); +} +.embed .embed-inner .embed-title { + color: #fff; +} +.embed .embed-inner .embed-author { + display: flex; + align-items: center; + margin-bottom: 5px; +} +.embed .embed-inner .embed-author img.embed-author-icon { + margin-right: 9px; + width: 20px; + height: 20px; + -o-object-fit: contain; + object-fit: contain; + border-radius: 50%; +} +.embed .embed-inner .embed-author .embed-author-name { + display: inline-block; + font-weight: 600; + font-size: 14px; + color: #fff !important; +} +.embed .embed-inner .fields { + display: flex; + flex-wrap: wrap; + flex-direction: row; + box-lines: miltiple; + margin-top: -10px; +} +.embed .embed-inner .fields .field { + flex: 0; + box-flex: 1; + padding-top: 10px; + max-width: 506px; + min-width: 100%; +} +.embed .embed-inner .fields .field.inline { + box-flex: 1; + flex: 1; + min-width: 150px; + flex-basis: auto; +} +.embed .embed-inner .fields .field .field-name { + color: #fff; + font-size: 14px; + margin-bottom: 4px; + font-weight: 600; +} +.embed .embed-inner .fields .field .field-value { + color: rgba(255, 255, 255, 0.7); + font-size: 14px; + font-weight: 500; + line-height: 1.1em; + white-space: pre-wrap; + margin-top: 6px; + word-wrap: break-word; +} \ No newline at end of file diff --git a/dashboard/static/css/index.css b/dashboard/static/css/index.css new file mode 100644 index 00000000..60541d48 --- /dev/null +++ b/dashboard/static/css/index.css @@ -0,0 +1,2426 @@ +* { + outline: none; + box-sizing: border-box; +} + +:root { + --link: #00b0f4; + --embedTextColor: #dcddde; + --embedTextColor2: #72767d; + --embedBackground: #2f3136; + --fullEmbedBackground: #36393f; + --side1Background: #2c2e33; + --side1Background: #2f3136; + --background-secondary: #2f3136; + --background-tertiary: #202225; + --header-secondary: #b9bbbe; + --interactive-muted: #4f545c; +} + +body { + line-height: 1; + margin: 0px; + padding: 0px; + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + overflow: hidden; + background-color: var(--fullEmbedBackground); + color: #fff; +} + +.main { + position: absolute; + width: 100%; + height: 100%; + display: grid; + grid-template-columns: 45% 55%; +} + +.top pre>code .hltChars { + color: #b96a97; + color: #b36391; +} + +.top pre>code .hltInt { + color: #a474e8; + color: #7658c8; +} + +.top pre>code .hltBool { + color: #d679c6; +} + +.top pre>code .hltStr1 { + color: #68b7c8; +} + +.top pre>code .hltStr2 { + color: #b58900; + color: #aab060; +} + +.main section { + min-height: 0; + padding-right: 0; + position: relative; +} + +.main .side1 { + width: 100%; + height: 100%; + background-color: var(--side1Background); + border-right: 1px solid var(--background-tertiary); + padding: 20px; +} + +.side1 .bottom .box { + background-color: #27282d; +} + +.top { + width: 100%; + height: 55%; + border: none; + padding: 5px; + outline: none; + border-radius: 5px; + background-color: #292b2f; + color: rgb(228, 225, 225); + border: 1px solid var(--background-tertiary); + overflow: auto; +} + +.side1 .item.top { + background-color: #292b2f; + width: 100%; + height: 94%; + border-radius: 5px; + transform: translateY(10px); +} + +body.gui .side1 .item.top { + transform: translateY(20px); +} + +.top, .bottom { + margin: auto; +} + +.main .side2 { + height: 100%; + background-color: var(--fullEmbedBackground); + justify-content: center; + vertical-align: center; + overflow: auto; + scrollbar-color: #26272d #36393f; + scrollbar-width: thin; +} + +::-webkit-scrollbar { + width: 7px; + background: #36393f; +} + +.main .side2::-webkit-scrollbar-thumb { + background: #26272d; +} + +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, q, s, samp, small, span, strike, strong, table, tbody, td, tfoot, th, thead, tr, tt, ul, var { + margin: 0px; + padding: 0px; + border: 0px; + font-weight: inherit; + font-style: inherit; + font-family: inherit; + font-size: 100%; + vertical-align: baseline; +} + +.hljs-comment, .hljs-quote { + color: var(--interactive-muted); +} + +.hljs-addition, .hljs-keyword, .hljs-selector-tag { + color: #859900; +} + +.hljs-doctag, .hljs-literal, .hljs-meta .hljs-meta-string, .hljs-number, .hljs-regexp, .hljs-string { + color: #2aa198; +} + +.hljs-name, .hljs-section, .hljs-selector-class, .hljs-selector-id, .hljs-title { + color: #268bd2; +} + +.hljs-attr, .hljs-attribute, .hljs-class .hljs-title, .hljs-template-variable, .hljs-type, .hljs-variable { + color: #b58900; +} + +.hljs-bullet, .hljs-link, .hljs-meta, .hljs-meta .hljs-keyword, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-subst, .hljs-symbol { + color: #cb4b16; +} + +.hljs-built_in, .hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #073642; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: 700; +} + +.cm-string { + color: #92deea!important; +} + +.cm-string~.cm-string { + color: #c3e88d!important; +} + +.cm-number { + color: #d19a66!important; +} + +code, [class^="cm-"] { + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + font-size: 14px; + line-height: 16px; +} + +a img { + border: none; +} + +::-webkit-input-placeholder, body, button, input, select, textarea { + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + text-rendering: optimizelegibility; +} + +::placeholder, body, button, input, select, textarea { + font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; + text-rendering: optimizelegibility; +} + +a, button, div, input, label, select, span, strong, textarea { + outline: 0px; +} + +img[alt] { + text-indent: -9999px; +} + +.msgEmbed { + min-height: 2.75rem; + position: absolute; + overflow-wrap: break-word; + user-select: text; + width: 100%; + margin: 10px 0 0 0; + padding: calc(0.125rem + 10px) 20px 20px 92px; +} + +.msgEmbed:hover { + background-color: #04040512; +} + +.embedTitle>* { + line-height: 1.375rem; +} + +.contents { + position: static; + margin-left: 0px; + padding-left: 0px; + text-indent: 0px; +} + +.avatar { + position: absolute; + left: 36px; + margin-top: calc(4px - 0.125rem); + width: 40px; + height: 40px; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + user-select: none; + flex: 0 0 auto; + z-index: 1; +} + +.timeText { + font-size: 0.75rem; + line-height: 1.375rem; + color: var(--embedTextColor2); + vertical-align: baseline; + margin-left: 0.25rem; + display: inline-block; + height: 1.25rem; + cursor: default; + pointer-events: none; + font-weight: 500; +} + +.botTag { + height: 0.9375rem; + padding: 0px 0.275rem; + margin-top: 0.075em; + border-radius: 0.1875rem; + background: rgb(114, 137, 218); + font-size: 0.625rem; + text-transform: uppercase; + vertical-align: top; + display: inline-flex; + align-items: center; + flex-shrink: 0; + text-indent: 0px; + position: relative; + top: 0.1rem; + margin-left: 0.25rem; + line-height: 1.375rem; + white-space: break-spaces; + overflow-wrap: break-word; +} + +.botText { + position: relative; + font-size: 10px; + line-height: 15px; + text-transform: uppercase; + text-indent: 0px; + color: rgb(255, 255, 255); + font-weight: 500; +} + +.username { + cursor: pointer; + font-size: 1rem; + font-weight: 500; + line-height: 1.375rem; + color: #fff; + display: inline; + vertical-align: baseline; + position: relative; +} + +.imageWrapper { + display: block; + position: relative; + user-select: text; + overflow: hidden; + border-radius: 3px; +} + +.imageWrapper img { + position: absolute; +} + +.clickable { + cursor: pointer; +} + +.embed { + position: relative; + display: grid; + max-width: 520px; + box-sizing: border-box; + border-radius: 4px; + border-left: 4px solid var(--fullEmbedBackground); + background: var(--embedBackground); + border-color: #1e2327; +} + +.embedAuthorName, .embedAuthorNameLink, .embedDescription, .embedFieldName, .embedFieldValue, .embedFooterText, .embedLink, .embedProvider-3k5pfl, .embedTitle, .embedTitleLink-1Zla9e { + unicode-bidi: plaintext; + text-align: left; +} + +.emoji { + object-fit: contain; + width: 1.375em; + height: 1.375em; + vertical-align: bottom; +} + +.embed .emoji { + width: 18px; + height: 18px; +} + +.embedGrid { + overflow: hidden; + max-width: 516px; + padding: 0.5rem 1rem 1rem 0.75rem; + display: inline-grid; + grid-template-columns: auto; + grid-template-rows: auto; + grid-template-columns: auto min-content; +} + +.embedMargin { + margin-top: 8px; +} + +.embedLink { + text-decoration: none; + cursor: pointer; +} + +.embedAuthor { + display: flex; + align-items: center; + grid-column: 1 / 1; +} + +.embedAuthorName { + font-size: 0.875rem; + font-weight: 600; +} + +.embedAuthorIcon { + margin-right: 8px; + width: 24px; + height: 24px; + object-fit: contain; + border-radius: 50%; +} + +.embedTitle { + font-size: 1rem; + font-weight: 600; + display: inline-block; + grid-column: 1 / 1; +} + +.embedDescription { + font-size: 0.875rem; + line-height: 1.125rem; + font-weight: 400; + white-space: pre-line; + grid-column: 1 / 1; +} + +.embedImage { + margin-top: 16px; + grid-column: 1 / 1; + border-radius: 4px; + contain: paint; + grid-column: 1 / 3; + max-width: 100%; +} + +.embedImage, .embedThumbnail { + display: block; + object-fit: fill; +} + +.embedImage, .embedThumbnail { + display: block; + border-radius: 4px; +} + +.embedThumbnail { + width: 80px; + height: 80px; +} + +.embedThumbnail { + grid-area: 1 / 2 / 8 / 2; + margin-left: 16px; + margin-top: 8px; + flex-shrink: 0; + justify-self: end; + width: 80px; + height: 80px; +} + +.embedFooter { + display: flex; + align-items: center; + grid-area: auto / 1 / auto / 1; +} + +.embedFooter { + grid-column: 1 / 3; +} + +.embedFooterText { + font-size: 0.75rem; + line-height: 1rem; + font-weight: 500; + color: var(--embedTextColor); +} + +.embedFooterSeparator { + font-weight: 500; + color: var(--embedTextColor); + display: inline-block; + margin: 0px 4px; +} + +.embedFooterIcon { + margin-right: 8px; + width: 20px; + height: 20px; + object-fit: contain; + border-radius: 50%; +} + +.embedFields { + display: grid; + grid-column: 1 / 1; + margin-top: 8px; + gap: 8px; + min-width: 0px; + grid-gap: 8px; +} + +.embedField { + font-weight: 400; + font-size: 0.875rem; + line-height: 1.125rem; + min-width: 0px; +} + +.embedFieldName { + font-weight: 600; + margin-bottom: 2px; +} + +.embedFieldValue { + font-size: 0.875rem; + line-height: 1.125rem; + font-weight: 400; + white-space: pre-line; + min-width: 0px; +} + +.embedDescription, .embedFieldValue { + color: var(--embedTextColor); +} + +.embedAuthorName, .embedFieldName, .embedTitle { + color: #fff; +} + +.embedGrid>* { + display: none; +} + +.messageContent { + user-select: text; + margin-left: -72px; + padding-left: 72px; +} + +.messageContent.markup { + font-size: 1rem; + line-height: 1.375rem; + white-space: pre-wrap; + white-space: break-spaces; + word-wrap: break-word; + user-select: text; + font-weight: 400; +} + +strong { + font-weight: 600; +} + +u { + text-decoration: underline; +} + +.markup em { + font-style: italic; +} + +.markup strong { + font-weight: 700; +} + +.markup { + font-size: 1rem; + line-height: 1.375rem; + user-select: text; + color: var(--embedTextColor); + font-weight: 400; +} + +.markup a { + word-break: break-word; + text-decoration: none; + cursor: pointer; +} + +.anchor { + color: var(--link); +} + +.markup a:hover { + text-decoration: underline; +} + +.markup code { + font-size: 0.875rem; + line-height: 1.125rem; + text-indent: 0; + white-space: pre-wrap; + scrollbar-width: thin; + scrollbar-color: var(--background-tertiary) var(--background-secondary); + background: #2f3136; + border: 1px solid #202225; +} + +.markup pre>code { + display: block; + overflow-x: auto; + padding: .5em; + border-radius: 4px; + color: var(--header-secondary); + text-size-adjust: none; +} + +.embed blockquote { + max-width: 100%; +} + +.blockquote { + display: flex; +} + +.blockquote blockquote { + padding: 0 8px 0 12px; + box-sizing: border-box; + text-indent: 0; +} + +.blockquote .blockquoteDivider { + width: 4px; + border-radius: 4px; +} + +.blockquoteDivider { + background-color: var(--interactive-muted); +} + +.container { + display: grid; + grid-auto-flow: row; + row-gap: 0.25rem; + text-indent: 0px; + min-height: 0px; + min-width: 0px; + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.container>* { + place-self: start; +} + +.markup code { + font-size: 0.875rem; + line-height: 1.125rem; + text-indent: 0; + white-space: pre-wrap; + background: var(--background-secondary); + border: 1px solid var(--background-tertiary); +} + +.markup code.inline { + width: auto; + height: auto; + padding: .2em; + margin: -.2em 0; + border-radius: 3px; + font-size: 85%; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + text-indent: 0; + border: none; + white-space: pre-wrap; +} + +.markup pre, .markup blockquote { + max-width: 90%; +} + +.markup pre { + border-radius: 4px; + padding: 0; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + font-size: 0.75rem; + line-height: 1rem; + margin-top: 6px; + white-space: pre-wrap; + background-clip: border-box; +} + +.embed code { + border: none; + background: var(--background-tertiary); +} + +.CodeMirror { + background-color: #212121; + color: #eff; + width: 100%!important; + height: 100%!important; + background-color: inherit!important; +} + +.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { + background-image: none!important; +} + +.CodeMirror-lint-marker-error:after, .CodeMirror-lint-message-error:before { + content: "!"; + color: #f45711; + font-size: 20px; + position: relative; + left: 10px; + top: -3px; +} + +.CodeMirror-lint-message-error:before { + content: "!"; + color: #f45711; + font-size: 20px; + position: relative; + left: -15px!important; + top: 1px!important; +} + +.CodeMirror-lint-tooltip { + box-shadow: 1px 10px 15px rgb(0 0 0 / 17%); + background-color: #202225!important; + border: 1px solid #373a40!important; + color: #cacaca!important; +} + +.CodeMirror-lint-message { + padding: 5px 5px 10px 18px; +} + +.CodeMirror-code .CodeMirror-gutter-wrapper .CodeMirror-gutter-elt { + left: 0px!important; +} + +.CodeMirror-gutters { + background: #292b2f!important; + display: none; +} + +.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { + padding: 0 12px; +} + +.CodeMirror-lint-marker.CodeMirror-lint-marker-error { + left: 15px!important; +} + +.CodeMirror pre.CodeMirror-line, .CodeMirror pre.CodeMirror-line-like { + padding: 0 15px!important; +} + +.CodeMirror-foldmarker { + color: #e5ecff!important; + text-shadow: none!important; + font-size: 20px; +} + +.CodeMirror-cursor { + border-left: 2px solid #6ba6ff !important; + height: 17px!important; +} + +.CodeMirror-scrollbar-filler { + display: none!important; +} + +.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + background: #202225!important; +} + +.cm-s-material-darker .cm-comment { + color: #5d616b!important; +} + +.cm-s-material-darker .CodeMirror-matchingbracket { + text-decoration: none!important; + background-color: rgb(173 192 212 / 3%)!important; + color: #b9c3d6 !important; + border-bottom: 1px solid #c2d6ff!important; + /* border: 1px solid #bacdf347; */ +} + +.notification { + position: relative; + bottom: 0; + left: 50%; + transform: translateX(-50%); + text-align: center; + position: fixed; + bottom: 0px; +} + +.notification .inline { + width: auto; + height: auto; + padding: .2em; + margin: -.2em 0; + border-radius: 3px; + font-size: 85%; + font-family: Consolas, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Monaco, Courier New, Courier, monospace; + text-indent: 0; + border: none; + overflow: hidden; + white-space: pre-wrap; + background-color: #4a3535; + color: white; + color: inherit; + background-color: inherit; + border: 1px dashed; +} + +@keyframes notifAn { + from { + opacity: 0; + bottom: -50px; + } +} + +.notification { + margin-top: 5px; + animation: notifAn .5s ease; + background-color: #202225; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding: 10px; + color: #8c4949; + display: none; + width: 100%; + z-index: 5; +} + +.col.cm-string.cm-property::before { + content: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 512 512' xml:space='preserve'%3E%3Cpath style='fill:%23D8D8DA;' d='M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256s256-114.615,256-256S397.385,0,256,0z M256,336.842c-44.648,0-80.842-36.194-80.842-80.842s36.194-80.842,80.842-80.842s80.842,36.194,80.842,80.842 S300.648,336.842,256,336.842z'/%3E%3Cpath style='fill:%23D4B6E6;' d='M282.947,188.632h220.076C485.09,122.726,441.507,67.394,383.64,34.044L229.053,188.632H282.947z'/%3E%3Cpath style='fill:%23EBAFD1;/*! fill: %23e592bf; */' d='M229.053,188.632L383.639,34.044C346.068,12.39,302.482,0,256,0c-23.319,0-45.899,3.135-67.368,8.978 v220.075L229.053,188.632z'/%3E%3Cpath style='fill:%23E07188;' d='M188.632,229.053V8.978C122.726,26.91,67.394,70.493,34.045,128.36l154.586,154.588V229.053z'/%3E%3Cg%3E%3Cpolygon style='fill:%23D8D8DA;' points='188.632,229.053 229.053,188.633 282.947,188.633 282.947,188.632 229.053,188.632 '/%3E%3Cpolygon style='fill:%23D8D8DA;' points='229.053,323.367 188.632,282.947 229.053,323.368 282.947,323.368 323.368,282.947 282.947,323.367 '/%3E%3C/g%3E%3Cpath style='fill:%23B4D8F1;' d='M503.024,188.632H282.947v0.001h0.958l39.463,40.42L477.955,383.64 C499.611,346.068,512,302.482,512,256C512,232.681,508.865,210.099,503.024,188.632z'/%3E%3Cpath style='fill:%23ACFFF4;' d='M323.368,282.947v220.075c65.905-17.932,121.238-61.517,154.586-119.382L323.368,229.053V282.947z'/%3E%3Cpath style='fill:%2395D5A7;' d='M282.947,323.368L128.361,477.956C165.932,499.61,209.518,512,256,512 c23.319,0,45.899-3.135,67.368-8.977V282.947L282.947,323.368z'/%3E%3Cpath style='fill:%23F8E99B;' d='M229.053,323.368H8.976C26.91,389.274,70.493,444.606,128.36,477.956l154.588-154.588H229.053z'/%3E%3Cpath style='fill:%23EFC27B;' d='M188.632,282.947L34.045,128.36C12.389,165.932,0,209.518,0,256c0,23.319,3.135,45.901,8.976,67.368 h220.076L188.632,282.947z'/%3E%3Cpolygon style='fill:%23E3E3E3;' points='283.905,188.633 282.947,188.633 323.368,229.053 '/%3E%3Cpath style='fill:%23B681D5;' d='M503.024,188.632C485.09,122.726,441.507,67.394,383.64,34.044L256,161.684v26.947h26.947H503.024z'/%3E%3Cpath style='fill:%23E592BF;' d='M383.639,34.044C346.068,12.39,302.482,0,256,0v161.684L383.639,34.044z'/%3E%3Cpath style='fill:%2380CB93;' d='M256,350.316V512c23.319,0,45.899-3.135,67.368-8.977V282.947l-40.421,40.421L256,350.316z'/%3E%3Cpolygon style='fill:%23F6E27D;' points='282.947,323.368 256,323.368 256,350.316 '/%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3Cg%3E%3C/g%3E%3C/svg%3E"); + width: 15px; + height: 100px; + display: block; + background-repeat: no-repeat; + position: absolute; + top: 0; + left: 40px; + cursor: pointer; + opacity: .5; + transition: 1s ease; +} + +.CodeMirror:hover .col.cm-string.cm-property::before { + opacity: 1; +} + +body.gui .side1 .item.top { + max-width: 90%; + height: 70%; + border-radius: 15px; +} + +body.gui .top>.CodeMirror { + display: none; +} + +.top>.gui { + height: 100%; + width: 100%; + background: #292b2f; + border-radius: 5px; + overflow-y: scroll; + overflow-x: hidden; + scrollbar-color: #202225 #292b2f; + scrollbar-width: thin; + margin-top: 15px; +} + +body:not(.gui) .top>.gui, body:not(.gui) .bottom, body:not(.gui) .pickerToggle { + display: none; +} + +.chooser { + display: flex; + height: 40px; + width: 100px; + border-radius: 5px; + margin-bottom: 10px; + padding: 7px; + background: #1b1c2061; + box-shadow: -2px -2px 10px 0px #0000; +} + +.chooser>.opt { + width: 50px; + cursor: pointer; + background: #292b2f; + border-radius: 4px; +} + +body.gui .chooser>.gui { + background: #41444a; +} + +body:not(.gui) .chooser>.json { + background: #41444a; +} + +.chooser>.back { + position: absolute; + height: 26px; + width: 43px; + border-radius: 4px; + background: #41444a; + transition: .5s ease-out; + pointer-events: none; +} + +body:not(.gui) .chooser>.back { + transform: translateX(43px); +} + +.chooser>.opt p { + display: flex; + justify-content: center; + font-size: 10px; + position: relative; + top: 50%; + transform: translateY(-50%); + pointer-events: none; +} + +.bottom { + /* margin: 40px auto auto auto!important; */ + max-width: 90%; +} + +@keyframes colrsAn { + 0% { + transform: translateX(-200px); + opacity: 0; + } +} + +.bottom .colrs { + animation: colrsAn .5s ease-out; + background: #212226; + border-radius: 10px; + width: 250px; + height: 130px; + position: absolute; + bottom: 20px; + box-shadow: -3px 3px 5px 0px #00000029; + display: grid; + grid-template-columns: 27% 73%; + grid-template-columns: 5% 27.5% 67.5%; +} + +.bottom .colrs .colr { + background: #41f097; +} + +.bottom .colrs.display { + display: grid; +} + +.colLeft { + border-radius: 15px; +} + +.colLeft .picker { + background: #292b2f; + border: 1px solid #ffffff24; +} + +.colLeft .picker>svg { + top: 7px; + right: 10px; + width: 16px; + height: 16px; + position: absolute; +} + +.col.colLeft>* { + border-radius: 8px; + cursor: pointer; +} + +.colRight { + margin: 0 10px; +} + +.cTop { + width: 100%; +} + +.cTop>h2 { + font-weight: 900; + margin-top: 10px; +} + +.cTop .desc { + font-size: 12px; + opacity: .6; + margin-top: 5px; +} + +.col { + display: grid; + grid-template-rows: 45% 45%; + gap: 10px; + height: 80%; + transform: translateY(-50%); + top: 50%; + position: relative; +} + +.pallets { + width: 100%; + display: grid; + /* grid-template-columns: repeat(8, 1fr); */ + grid-template-columns: repeat(6, minmax(25px, 1fr)); + gap: 5px 0px; + /* opacity: .7; */ + transition: .5s; +} + +.colrs:hover .pallets { + opacity: 1; +} + +.pallets>* { + background: black; + width: 17px; + height: 17px; + margin-left: 5px; + border-radius: 2px; + cursor: pointer; +} + +.color-picker { + transform: none; + width: 100%; + height: 100%; + top: 0!important; + left: 0!important; + border-radius: 10px; + overflow: hidden; +} + +.color-picker>div { + height: 100%!important; +} + +.colRight.picking .cTop>*:not(.color-picker), .colRight.picking .pallets, .colRight:not(.picking) .colBack { + display: none; +} + +.color-picker\:a { + display: none!important; +} + +@keyframes colBackAn { + from { + right: 50px; + } +} + +.colBack { + animation: colBackAn .2s ease-out; + position: absolute; + right: 0; + transform: translateX(40px); + z-index: 1000; + cursor: pointer; +} + +.colBack svg { + width: 20px; + height: 20px; + opacity: .6; +} + +.top { + scrollbar-color: #202225 #292b2f; + scrollbar-width: thin; + overflow: hidden; +} + +.top>.gui>.item { + cursor: pointer; + background: #212226; + height: 40px; + width: 90%; + margin: 8px auto; + border-radius: 7px; + background: linear-gradient(90deg, #212226, #21222600); + position: relative; + z-index: 2; +} + +.top>.gui>.item.active .ttle::after { + transform: scale(.8) rotate(180deg); +} + +.top>.gui>.item.active .ttle::after { + transform: scale(.8) rotate(180deg); +} + +.top>.gui>.item.inlineField.active .ttle, .top>.gui>.item:not(.active) .ttle~input { + display: none; +} + +.ttle, .ttle~input { + font-size: 12px; + font-weight: 900; + text-transform: uppercase; + position: relative; + top: 50%; + transform: translateY(-50%); + margin-left: 15px; +} + +.top>.gui>.item.active .ttle~input:not(:placeholder-shown) { + font-weight: normal; + text-transform: none; + font-size: 12px; +} + +input, textarea { + background: transparent; + border: none; + color: inherit; +} + +.ttle~input { + width: 100%; +} + +.ttle::after { + content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' viewBox='0 0 24 24' height='30'%3E%3Cpath clip-rule='evenodd' fill='%23fff' d='M16.59 8.59004L12 13.17L7.41 8.59004L6 10L12 16L18 10L16.59 8.59004Z'%3E%3C/path%3E%3C/svg%3E"); + position: absolute; + right: 0; + top: -12px; + transform: scale(.8); + opacity: .1; + pointer-events: none; + transition: .2s ease; +} + +@keyframes editAn { + from { + opacity: 0; + transform: translateY(-40px); + } +} + +.top>.gui>.item~.edit { + animation: editAn .3s ease; + height: 40px; + width: 90%; + margin: 8px auto; + position: relative; + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px; + margin-top: 0; + background: #212226; +} + +.top>.gui>.item~.edit input { + align-self: start; + font-size: 13px; + position: relative; + margin-left: 15px; + transform: translateY(4px); +} + +.top>.gui>.item:not(.active)+.edit { + display: none; +} + +.top>.gui>.item:not(.inlineField).active { + margin-bottom: 0; + background: #212226; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.edit { + padding-left: 15px; +} + +.item:not(.rows2)+.edit { + display: flex; +} + +.editIcon { + display: flex; +} + +.editIcon, .editName, .editIcon input, .editName input { + width: 100%; + overflow: hidden; +} + +.editIcon .imgParent { + width: 24px; + height: 24px; + object-fit: contain; + border-radius: 50%; +} + +.editIcon>* { + display: inline-flex; +} + +.pickerToggle { + display: none; + bottom: 15px; + left: 15px; + position: absolute; + cursor: pointer; + z-index: 5; +} + +.pickerToggle>svg { + width: 20px; + height: 100%; +} + +textarea { + font-size: 13px; + min-width: 100%; + max-width: 100%!important; + height: 75px; + max-height: 200px; +} + +.top>.gui>.item.description+.edit, .top>.gui>.item.content+.edit { + height: auto; +} + +.top>.gui>.item.content+.edit textarea { + height: 80px; +} + +.browse { + margin-top: 25px; + font-size: 13px; + display: flex; + cursor: pointer; + position: absolute; + opacity: .5; +} + +.browse:hover { + opacity: 1; +} + +.browse>svg { + width: 20px; + position: relative; + z-index: 6; + height: 20px; + transform: translateY(-5px); + margin-right: 5px; +} + +.browse>p::after { + content: "Browse"; +} + +.browse.loading>svg:first-of-type, .browse:not(.loading)>svg:last-of-type, .browse.error>svg { + display: none; +} + +.browse.loading>p::after { + content: "Loading..."; +} + +.browse.error>p::after { + color: #ee9191; + content: "Request failed. (Check dev-tools)"; +} + +.linkName { + display: flex; +} + +.linkName, .linkName .txtCol, .linkName .txtCol>input[type="text"] { + width: 100%; + text-overflow: ellipsis; +} + +.txtCol>input[type="text"] { + overflow: auto; +} + +.top>.gui>.item.rows2+.edit { + height: 80px; +} + +input[type="file"], button[type="submit"] { + display: none; +} + +.largeImg+.edit .editIcon .imgParent { + width: 80px; + height: 80px; + border-radius: 4px; + object-fit: fill; + margin-top: 0; + margin-bottom: 15px; +} + +.top>.gui>.largeImg+.edit input { + transform: none; +} + +.largeImg+.edit .browse { + margin-top: 40px; + font-size: 13px; + display: flex; + cursor: pointer; + position: relative; + opacity: .5; + margin-left: 15px; +} + +.largeImg.image+.edit .browse { + margin-top: 35px; +} + +.largeImg+.edit .editIcon>* { + display: block; +} + +.largeImg+.edit { + height: auto!important; +} + +.largeImg.image+.edit .editIcon .imgParent { + width: 130px; + object-fit: contain; + border-radius: 4px; + object-fit: cover; +} + +.top>.gui>.item.fields+.edit input { + margin-left: 0; +} + +.top>.gui>.item.fields+.edit input[type="text"] { + width: 100%; +} + +.top>.gui>.item.fields+.edit { + height: auto; + padding-bottom: 15px; +} + +.top>.gui>.item.fields.active+.edit { + display: block; +} + +.designerFieldName { + width: 95%; + min-height: 30px; + border-radius: 5px; +} + +.designerFieldValue textarea { + padding: 5px 10px; +} + +.designerFieldName { + width: 100%; + min-height: 30px; + padding: 5px 10px; + margin-bottom: 2px; +} + +.designerFieldName>input[type="text"] { + font-weight: 700; +} + +.field~.field { + margin-top: 10px; +} + +.field .fieldInner { + width: 95%; + height: 100%; + border-radius: 4px; + background: #292b2f; + border-radius: 5px; + margin-bottom: 2px; + transition: .3s ease; +} + +@keyframes lastFieldSlide { + from { + opacity: 0; + transform: translateY(100px); + } +} + +.gui>.item.fields+.edit>.field { + animation: lastFieldSlide .5s ease; +} + +.fields+.edit .fieldInner .designerFieldName { + background: #2d2e33; +} + +body { + counter-reset: fieldCount; +} + +.fieldNumber { + position: absolute; +} + +.fields+.edit { + z-index: 2; +} + +@keyframes fieldNumberFadeInAn { + from { + opacity: 0; + transition: opacity 1s ease; + } +} + +.fieldNumber::before { + animation: fieldNumberFadeInAn .2s ease-in; + counter-increment: fieldCount; + content: counter(fieldCount); + position: relative; + font-size: 20px; + right: 41px; + top: 22px; + z-index: -2; + opacity: .15; +} + +.inlineCheck, .removeBtn { + font-size: 11px; + font-weight: bold; + text-transform: uppercase; + cursor: pointer; + display: inline-block; + margin-top: 3px; +} + +#inlineCheck, [for="inlineCheck"] { + cursor: pointer; +} + +.removeBtn { + margin-left: 20PX; +} + +.removeBtn>svg { + width: 10px; + height: 10px; + transition: .5s ease; +} + +.removeBtn>span { + margin-left: 3px; + position: relative; + top: -1px; + transition: .5s ease; +} + +.removeBtn:hover>span, .removeBtn:hover>svg path { + color: #ff9191; + fill: #ff9191; +} + +.inlineCheck input[type="checkbox"] { + scale: .8; + cursor: pointer; +} + +.inlineCheck input[type="checkbox"]+span { + cursor: pointer; +} + +.sep { + width: 100%; + height: 2px; + background: linear-gradient(to right, #2f313600, #2f3136, #2f313600); +} + +.imgParent { + border-radius: 4px; + object-fit: fill; + margin-top: 0; + content: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0' y='0' width='1400' height='780' viewBox='0, 0, 1400, 780'%3E%3Cg id='Background'%3E%3Crect x='0' y='0' width='1400' height='780' style='fill: %23212226;' fill='%23363A3E'/%3E%3C/g%3E%3Cg id='Background'/%3E%3Cg id='Background'%3E%3Cg%3E%3Cpath d='M463.326,212.495 L936.674,212.495 L936.674,567.505 L463.326,567.505 z' fill-opacity='0' stroke='%2343474B' stroke-width='30' stroke-miterlimit='10' style='stroke: %23888789;fill: %23888789;'/%3E%3Cpath d='M605.33,309.136 C605.33,328.961 589.259,345.032 569.435,345.032 C549.61,345.032 533.539,328.961 533.539,309.136 C533.539,289.312 549.61,273.241 569.435,273.241 C589.259,273.241 605.33,289.312 605.33,309.136 z' fill='%2343474B' style='fill: %23888789;'/%3E%3Cpath d='M878.689,507.548 L523.284,507.548 L570.618,406.173 L600.597,450.352 L700.789,298.092 L772.58,405.778 L806.503,368.699 z' fill='%2343474B' style='fill: %23888789;'/%3E%3C/g%3E%3C/g%3E%3Cstyle xmlns='http://www.w3.org/1999/xhtml' type='text/css'%3E%3C/style%3E%3C/svg%3E"); +} + +.largeImg+.edit .imgParent { + margin-bottom: 15px; +} + +.item:not(.largeImg)+.edit .imgParent[style*="content"] { + transform: scale(1); +} + +.item:not(.largeImg)+.edit .imgParent { + transform: scale(2); +} + +@keyframes addFieldFade { + from { + opacity: 0; + } +} + +.addField { + animation: addFieldFade .5s ease; + font-size: 13px; + display: flex; + cursor: pointer; + opacity: .5; + padding-top: 15px; + transition: .5s ease; +} + +.field+.addField { + margin-top: 5px; +} + +.addField>svg { + width: 16px; + position: relative; + z-index: 6; + height: 100%; + transform: translateY(-3px); + margin-left: 5px; + opacity: .8; +} + +.addField:hover, .addField:hover>svg { + opacity: 1; +} + +.clear { + left: 140px; + position: absolute; + cursor: pointer; + z-index: 5; + transform: translate(0, -5px); + padding: 8.5px; + border-radius: 100%; + background: #27282e; + width: 35px; + height: 35px; + transition: .5s ease; +} + +@keyframes emptyTxtAn { + from { + opacity: 0; + } +} + +.emptyTxt { + animation: emptyTxtAn 1s ease; + font-weight: 600; + text-transform: uppercase; + font-size: 30px; + line-height: 16px; + color: #41444a; + font-family: var(--font2); + padding: 10px 0; + top: 50%; + position: absolute; + left: 50%; + transform: translate(-50%, -50%); + pointer-events: none; +} + +@keyframes clearAn { + 0% { + transform: rotate(10deg); + } + 25% { + transform: rotate(-10deg); + } + 50% { + transform: rotate(10deg); + } + 75% { + transform: rotate(-13deg); + } +} + +.clear:hover>svg { + animation: clearAn 1s ease-in-out forwards; + transform-origin: top right; +} + +.messageContent.empty, .messageContent+.container.empty, .emptyTxt { + display: none; +} + +.messageContent.empty+.container.empty+.emptyTxt { + display: block; + position: absolute; + top: 800%; +} + +.clear>svg { + width: 20px; + height: 100%; + position: relative; + left: -2.5px; + top: -2px; +} + +::-webkit-scrollbar { + width: 7px; + background: #292b2f00; +} + +::-webkit-scrollbar-thumb { + background: #202225; +} + +@media screen and (max-width: 1270px) { + .fieldNumber::before { + right: 300%; + } +} + +@media screen and (max-width: 530px) { + .msgEmbed { + margin: 20px 0px; + padding: 0.125rem 0 20px 65px; + } + .avatar { + left: 10px; + } + .main .side1 { + padding: 10px; + } +} + +@media screen and (max-height: 760px) { + .bottom .colrs { + bottom: 10px; + } + body.gui .side1 .item.top { + height: 65%; + max-width: 100%; + width: 100%; + } + .bottom { + margin: 40px 0 0 0 !important; + } +} + +@media screen and (max-width: 1015px) { + .clear { + position: absolute; + cursor: pointer; + z-index: 5; + left: 135px; + } + .main { + display: flex; + flex-direction: column; + } + .side1 .item.top { + height: 100%; + } + .notification .inline { + display: block; + margin-top: 5px; + } + .bottom .colrs { + bottom: 40px; + left: 200px; + display: none; + top: 0; + animation: colrsAn .1s ease-out; + box-shadow: 0px 5px 15px 0px #0000004f; + } + body.gui .side1 .item.top { + height: 85%; + max-width: 100%; + width: 100%; + } + .bottom { + margin: 40px 0 0 0 !important; + } + .pickerToggle { + display: block; + position: absolute; + cursor: pointer; + z-index: 5; + left: 170px; + border-left: 2px solid #4c5057; + padding-left: 15px; + bottom: auto; + margin-left: 15px; + } + .pickerToggle>svg { + width: 17px; + } + .side1 .item.top { + padding-top: 10px; + transform: translateY(10px); + } +} + +@media screen and (max-width: 460px) { + .bottom .colrs { + top: 70px; + left: 10px; + } + .top>.gui { + margin-top: 5px; + } +} +.container { + display: flex; + height: 100vh; + width: 100vw; + flex-wrap: wrap; + overflow: hidden; +} +.main { + height: calc(100% - 50px); + display: flex; + flex: 1; +} +.sidebar { + height: 100%; + width: 220px; + box-sizing: border-box; + box-shadow: 0 0 2rem 0 rgb(0 0 0 / 5%); + overflow: hidden; + transition: width 0.5s ease; + overflow-y: scroll; +} +.container.nav-closed .sidebar, +.container.nav-closed .header-logo { + width: 0; +} +.sidebar ul { + display: flex; + flex-direction: column; + padding: 5px; +} +.sidebar ul li { + display: flex; + align-items: center; +} +.sidebar ul li a { + color: #fff; + text-decoration: none; + display: flex; + align-items: center; + width: 100%; + padding: 10px; + white-space: nowrap; +} +.sidebar ul li a.active, +.sidebar ul li a:hover { + background: #2f2f2f; +} +.sidebar ul li span { + margin-left: 16px; + font-size: 16px; + font-weight: 100; +} +.sidebar ul li i { + font-size: 18px; + color: #111; + font-weight: normal; +} +.header { + height: 50px; + background: #2f2f2f; + width: 100%; + display: flex; + align-items: center; + flex-basis: 100%; +} +.sidebar ul li a.active i { + color: purple; +} +.site-logo { + height: 32px; + width: 32px; + min-height: 32px; + min-width: 32px; + margin: 0 18px 0 15px; +} +.site-logo path { + fill: #fff; +} +.site-title { + color: #fff; + font-size: 24px; + letter-spacing: 1px; + font-weight: 400; +} +.header-search { + height: 100%; + align-items: center; + display: flex; + padding: 0 20px; + flex: 1; +} +.header-search .button-menu { + width: 23px; + height: 23px; + margin-right: 15px; + background-color: #2f2f2f; + border: 0; + cursor: pointer; +} +.header-logo { + display: flex; + align-items: center; + width: 220px; + overflow: hidden; + transition: width 0.5s ease; +} +.header-search input[type="search"] { + height: 100%; + width: 300px; + padding: 10px 20px; + box-sizing: border-box; + font-size: 14px; + font-weight: 100; + background: none; + border: none; + color: #fff; +} +.header-search input[type="search"]:focus { + outline: none; +} +.header-search input[type="search"]::placeholder { + color: #ccc; +} +.header-search .button-menu:focus { + outline: none; + border: none; +} +.header-search .button-menu svg path { + fill: #fff; +} +@media screen and (max-width: 991px) { + .page-content { + width: 100vw; + } +} +@media screen and (max-width: 767px) { + .header-logo { + display: none; + } +} +.drop { + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.drop.open { + z-index: 100; +} +.drop.open .drop-screen { + z-index: 100; + display: block; +} +.drop.open .drop-options { + z-index: 200; + max-height: 200px; +} +.drop.open .drop-display { + z-index: 200; + border-color: #465; +} +.drop select { + display: none; +} +.drop .drop-screen { + position: fixed; + width: 100%; + height: 100%; + background: #fff; + top: 0px; + left: 0px; + opacity: 0; + display: none; + z-index: 1; +} + +.link { + text-align: center; + margin: 20px 0px; + color:#8CACD7; +} + + +.drop .drop-display { + position: relative; + padding: 0px 20px 5px 5px; + border: 4px solid #444; + width: 100%; + background: #FFF; + z-index: 1; + margin: 0px; + font-size: 16px; + min-height: 58px; +} +.drop .drop-display:hover:after { + opacity: 0.75; +} +.drop .drop-display:after { + font-family: 'Material Icons'; + content: "\e5c6"; + position: absolute; + right: 10px; + top: 12px; + font-size: 24px; + color: #444; +} +.drop .drop-display .item { + position: relative; + display: inline-block; + border: 2px solid #333; + margin: 5px 5px -4px 0px; + padding: 0px 25px 0px 10px; + overflow: hidden; + height: 40px; + line-height: 36px; +} +.drop .drop-display .item .btnclose { + color: #444; + position: absolute; + font-size: 16px; + right: 5px; + top: 10px; + cursor: pointer; +} +.drop .drop-display .item .btnclose:hover { + opacity: 0.75; +} +.drop .drop-display .item.remove { + -webkit-animation: removeSelected 0.2s, hide 1s infinite; + animation: removeSelected 0.2s, hide 1s infinite; + -webkit-animation-delay: 0s, 0.2s; + animation-delay: 0s, 0.2s; +} +.drop .drop-display .item.add { + -webkit-animation: addSelected 0.2s; + animation: addSelected 0.2s; +} +.drop .drop-display .item.hide { + display: none; +} +.drop .drop-options { + background: #444; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.25); + position: absolute; + width: 100%; + max-height: 0px; + overflow-y: auto; + transition: all 0.25s linear; + z-index: 1; +} +.drop .drop-options a { + display: block; + height: 40px; + line-height: 40px; + padding: 0px 20px; + color: white; + position: relative; + max-height: 40px; + transition: all 1s; + overflow: hidden; +} +.drop .drop-options a:hover { + background: #465; + cursor: pointer; +} +.drop .drop-options a.remove { + -webkit-animation: removeOption 0.2s; + animation: removeOption 0.2s; + max-height: 0px; +} +.drop .drop-options a.add { + -webkit-animation: addOption 0.2s; + animation: addOption 0.2s; +} +.drop .drop-options a.hide { + display: none; +} + +@-webkit-keyframes pop { + from { + -webkit-transform: scale(0); + transform: scale(0); + } + to { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes pop { + from { + -webkit-transform: scale(0); + transform: scale(0); + } + to { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes removeOption { + from { + max-height: 40px; + } + to { + max-height: 0px; + } +} +@keyframes removeOption { + from { + max-height: 40px; + } + to { + max-height: 0px; + } +} +@-webkit-keyframes addOption { + from { + max-height: 0px; + } + to { + max-height: 40px; + } +} +@keyframes addOption { + from { + max-height: 0px; + } + to { + max-height: 40px; + } +} +@-webkit-keyframes removeSelected { + from { + -webkit-transform: scale(1); + transform: scale(1); + } + to { + -webkit-transform: scale(0); + transform: scale(0); + } +} +@keyframes removeSelected { + from { + -webkit-transform: scale(1); + transform: scale(1); + } + to { + -webkit-transform: scale(0); + transform: scale(0); + } +} +@-webkit-keyframes addSelected { + from { + -webkit-transform: scale(0); + transform: scale(0); + } + to { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes addSelected { + from { + -webkit-transform: scale(0); + transform: scale(0); + } + to { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes hide { + from, to { + max-height: 0px; + max-width: 0px; + padding: 0px; + margin: 0px; + border-width: 0px; + } +} +@keyframes hide { + from, to { + max-height: 0px; + max-width: 0px; + padding: 0px; + margin: 0px; + border-width: 0px; + } +} + +.fa{ + line-height:30px; + font-size:30px; + display:inline-bloxk; + width:35px; + height:35px; +} +.hidden{ + display:none; +} + +input[type=checkbox] + label { + position:relative; +} + +input[type=checkbox]:checked + label { + animation: closing 0.3s forwards ease-in-out, + moving 0.3s forwards ease-in-out; +} +.pointer-cursor{ + cursor: pointer; cursor: hand; +} +.close{ + + float:right; + color: #b94b45; + cursor: pointer; cursor: hand; +} + +.alert-message{ + background-color: #f2dede; + border: 1px solid rgba(#34495e, 0.25); + color: #b94b45; + border-radius: 3px; + line-height:30px; + position: absolute; + top: 0; left: 0; + display:block; + width:100%; + padding: 12px; + box-sizing: border-box; + color: rgba(255, 255, 255, .9); + box-shadow: 0px 10px 50px rgba(0,0,0,.6); + background:#34495e; +} + +@keyframes closing { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes moving { + 0%, 90% { top: 0; left: 0; } + 100% { top: -100px; left: 0; } +} + +* { + box-sizing: border-box; +} +.tooltip { + position: relative; + display: inline-block; +} + +.tooltip .tooltiptext { + visibility: hidden; + width: 120px; + background-color: black; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 3px 0; + position: absolute; + z-index: 1; + bottom: 100%; + left: 50%; + margin-left: -60px; +} + +.tooltip .tooltiptext::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: black transparent transparent transparent; +} + +.tooltip:hover .tooltiptext { + visibility: visible; +} +.alertpremium { + width: 1000px; + padding: 12px 16px; + border-radius: 4px; + border-style: solid; + border-width: 1px; + margin-bottom: 12px; + font-size: 16px; +} +.alertpremium.premium{ + background-color: rgba(248, 215, 218, 1); + border-color: rgba(220, 53, 69, 1); + color: rgba(114, 28, 36,1); +} +.alertparagraph{ + display: inline; +} +/* Create three equal columns that floats next to each other */ +.column { + float: left; + width: 33.33%; + padding: 10px; + height: 300px; /* Should be removed. Only for demonstration */ +} + +/* Clear floats after the columns */ +.row:after { + content: ""; + display: table; + clear: both; +} + +/* Responsive layout - makes the three columns stack on top of each other instead of next to each other */ +@media screen and (max-width: 600px) { + .column { + width: 100%; + } +} + + +.pogy:hover { + opacity: 0.5; +-box-shadow: 0px 5px 40px -10px rgba(0,0,0,0.57); +box-shadow: 5px 40px -10px rgba(0,0,0,0.57); +transition: all 0.4s ease 0s; +} +.server-image { +width: 119px; +margin-left: 0; +margin-right: 0; +height: 119px; +border-radius: 50%; +transition: transform .2s; /* Animation */ +} +.server-image:hover { +transform: scale(1.1); +} + +.guild { +text-align: center; +} + +.members { +display: flex; +-webkit-box-align: center; +align-items: center; +} + + + /* +===== +DEPENDENCES +===== +*/ + +/* +helper to reset default browser's styles from headings +*/ + +.r-title{ + margin-top: var(--rTitleMarginTop, 0) !important; + margin-bottom: var(--rTitleMarginBottom, 0) !important; +} + +/* +helper to hide elements that are available only for screen readers. +*/ + +.screen-reader{ + width: var(--screenReaderWidth, 1px) !important; + height: var(--screenReaderHeight, 1px) !important; + padding: var(--screenReaderPadding, 0) !important; + border: var(--screenReaderBorder, none) !important; + + position: var(--screenReaderPosition, absolute) !important; + clip: var(--screenReaderClip, rect(1px, 1px, 1px, 1px)) !important; + overflow: var(--screenReaderOverflow, hidden) !important; +} + +/* +===== +POPUP +===== +*/ + +/* +1. Creating the top and bottom gaps for the modal so that content doesn't touches window's edges +*/ + +.popup:not(:target){ + display: none; +} + +.popup:target{ + width: 100%; + height: 100vh; + + display: flex; + + position: fixed; + top: 0; + right: 0; +} + +.popup::before{ + content: ""; + box-sizing: border-box; + width: 100%; + background-color: #fff; + + position: fixed; + left: 0; + top: 50%; +} + +.popup::after{ + content: ""; + width: 0; + height: 2px; + background-color: #f0f0f0; + + position: absolute; + top: 50%; + left: 0; + margin-top: -1px; +} + +.popup__container{ + box-sizing: border-box; + padding: 5% 15%; + + height: calc(100vh - 40px); /* 1 */ + margin: auto; /* 1 */ + overflow: auto; /* 1 */ + overscroll-behavior: contain; /* 1 */ +} + +.popup__title{ + --rTitleMarginBottom: 1.5rem; + font-size: 1.5rem; +} + +.popup__close{ + width: 2rem; + height: 2rem; + + position: fixed; + top: 1.5rem; + right: 1.5rem; + + background-repeat: no-repeat; + background-position: center center; + background-size: contain; + background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMDAwMDAwIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4gICAgPHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiLz4gICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==); +} + +/* +animation +*/ + +.popup::before{ + will-change: height, top; + animation: open-animation .6s cubic-bezier(0.83, 0.04, 0, 1.16) .65s both; +} + +.popup::after{ + will-change: width, opacity; + animation: line-animation .6s cubic-bezier(0.83, 0.04, 0, 1.16) both; +} + +@keyframes line-animation{ + + 0%{ + width: 0; + opacity: 1; + } + + 99%{ + width: 100%; + opacity: 1; + } + + 100%{ + width: 100%; + opacity: 0; + } +} + +@keyframes open-animation{ + + 0%{ + height: 0; + top: 50%; + } + + 100%{ + height: 100vh; + top: 0; + } +} + +.popup__container{ + animation: fade .5s ease-out 1.3s both; +} + +@keyframes fade{ + + 0%{ + opacity: 0; + } + + 100%{ + opacity: 1; + } +} + + diff --git a/dashboard/static/css/leaveembed.css b/dashboard/static/css/leaveembed.css new file mode 100644 index 00000000..02c0ea2e --- /dev/null +++ b/dashboard/static/css/leaveembed.css @@ -0,0 +1,147 @@ +a.patreon-link { + display: flex; + box-sizing: border-box; + width: 100%; + height: auto; + z-index: 10; + text-decoration: none; +} + +.badge-container { + width: 100%; + display: flex; + flex-direction: column; + padding: 5px 10px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.5); + text-align: center; +} +.badge-container .badge-icon { + background: url("https://s3.amazonaws.com/patreon_public_assets/toolbox/patreon_white.png") center center no-repeat; + background-size: contain; + width: 100%; + height: 20px; +} +.badge-container .badge-text { + font-family: "Lato", sans-serif; + font-size: 12px; + padding: 2px; + color: #fff; +} +.badge-container .badge-text.badge-text-bottom { + position: relative; + top: -2px; +} + +.preview { + background: #36393e; + display: flex; + box-orient: vertical; + flex-direction: column; +} + +.wrapper { + display: flex; + max-width: 520px; +} + +.container { + margin-top: 50px; +} + +.side-colored { + width: 4px; + border-radius: 3px 0 0 3px; + background: #4f545c; +} + +.embedd { + border-radius: 0 3px 3px 0; + background: rgba(46, 48, 54, 0.3); + border-color: rgba(46, 48, 54, 0.6); + display: flex; + padding: 8px 10px; + color: rgba(255, 255, 255, 0.6); + font-size: 14px; +} +.embedd .card-block { + padding: 0; + display: flex; + margin-bottom: 10px; +} +.embedd a { + color: #0096cf; +} +.embedd img.embed-thumb { + max-height: 80px; + max-width: 80px; + border-radius: 3px; + flex-shrink: 0; + width: auto; + -o-object-fit: contain; + object-fit: contain; + margin-left: 20px; +} +.embedd .embed-footer { + font-size: 12px; +} +.embedd .embed-footer span { + color: rgba(255, 255, 255, 0.6); +} +.embedd .embed-innerr .embed-title { + color: #fff; +} +.embed .embed-innerr .embed-author { + display: flex; + align-items: center; + margin-bottom: 5px; +} +.embedd .embed-innerr .embed-author img.embed-author-icon { + margin-right: 9px; + width: 20px; + height: 20px; + -o-object-fit: contain; + object-fit: contain; + border-radius: 50%; +} +.embedd .embed-innerr .embed-author .embed-author-name { + display: inline-block; + font-weight: 600; + font-size: 14px; + color: #fff !important; +} +.embedd .embed-innerr .fields { + display: flex; + flex-wrap: wrap; + flex-direction: row; + box-lines: miltiple; + margin-top: -10px; +} +.embedd .embed-innerr .fields .field { + flex: 0; + box-flex: 1; + padding-top: 10px; + max-width: 506px; + min-width: 100%; +} +.embedd .embed-innerr .fields .field.inline { + box-flex: 1; + flex: 1; + min-width: 150px; + flex-basis: auto; +} +.embedd .embed-innerr .fields .field .field-name { + color: #fff; + font-size: 14px; + margin-bottom: 4px; + font-weight: 600; +} +.embedd .embed-innerr .fields .field .field-value { + color: rgba(255, 255, 255, 0.7); + font-size: 14px; + font-weight: 500; + line-height: 1.1em; + white-space: pre-wrap; + margin-top: 6px; + word-wrap: break-word; +} \ No newline at end of file diff --git a/dashboard/static/css/members.css b/dashboard/static/css/members.css new file mode 100644 index 00000000..e79bc951 --- /dev/null +++ b/dashboard/static/css/members.css @@ -0,0 +1,41 @@ +body { + background: #2a2d32; +} + +.roleBox { + border-radius: 3px; + padding: 0px 3px; + font-size: 0.8em; + white-space: nowrap; +} + +.status { + box-sizing: border-box; + border-width: 2px; + border-radius: 50%; + height: 15px; + width: 15px; + float: left; + vertical-align: middle; + margin: 5px; +} + +.online { + background-color: #42b581; + border-color: #69c49a; +} + +.idle { + background-color: #faa61a; + border-color: #fbb848; +} + +.dnd { + background-color: #f04747; + border-color: #f36c6c; +} + +.offline { + background-color: #747f8d; + border-color: #9099a4; +} \ No newline at end of file diff --git a/dashboard/static/css/report.css b/dashboard/static/css/report.css new file mode 100644 index 00000000..526020fe --- /dev/null +++ b/dashboard/static/css/report.css @@ -0,0 +1,366 @@ +@import url(https://fonts.googleapis.com/css?family=Heebo|Ubuntu:700&display=swap); +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); +:root { + --mainBackground: #21222C; + --font1: 'Heebo', sans-serif; + --font2: 'Ubuntu', sans-serif; + --font3: 'Poppins', sans-serif; + --font4: Montserrat, sans-serif; + --defaultColor: rgb(192, 204, 209); + --font5: "Open Sans", "Helvetica Neue", "Segoe UI", "Calibri", "Arial", sans-serif; + --scrollbar: #222; +--scrollbar-thumb: #2b2b2b; +--scrollbar-hover: #363636; +--scrollbar-active: #454545; +} + +* { + margin: 0; + padding: 0; + color: white; + box-sizing: border-box; + box-sizing: border-box; + font-family: var(--font3); +scrollbar-color: #353535 transparent; +scrollbar-width: thin; +} + +::-webkit-scrollbar { +width: 16px; +background-color: var(--scrollbar); +cursor: pointer; +} + +::-webkit-scrollbar-thumb { +background-color: var(--scrollbar-thumb); +height: 16px; +background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { +background-color: var(--scrollbar-hover); +} + +::-webkit-scrollbar-thumb:active { +background-color: var(--scrollbar-active); +} + + + +body { + background-color: #2f2f2f; +} + +a { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; + transition: all .4s; +} + +a:focus { + outline: none!important; +} + +a:hover { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0; +} + +p { + margin: 0; + color: #666; + font-size: 14px; + line-height: 1.7; +} + +ul, li { + margin: 0; + list-style-type: none; +} + +input { + border: none; + outline: none; +} + +textarea { + border: none; + outline: none; + max-width: 100%; + min-width: 100%; + max-height: 200px; +} + +textarea:focus, input:focus { + border-color: transparent!important; +} + +button { + display: inline-block; + font-family: Whitney, "Open Sans", Helvetica, sans-serif; + font-weight: 400; + font-size: 11pt; + border-radius: 3px; + cursor: pointer; + height: 45px; + width: 200px; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); + background-color: #43b581; + border: 2px solid #43b581; + color: #fff; +} + + +button:hover { + cursor: pointer; + transform: translateY(1px); +} + +iframe { + border: none!important; +} + +.container { + max-width: 1200px +} + +.container-contact { + z-index: 1; + width: 100%; + display: flex; + padding: 15px; + flex-wrap: wrap; + background: 0 0; + min-height: 100vh; + position: relative; + align-items: center; + justify-content: center; +} + + + + + + + + +.contact-map { + top: 0; + left: 0; + z-index: -2; + width: 100%; + height: 100%; + position: absolute; +} + +.wrap-contact { + width: 1170px; + position: relative; + border-radius: 10px; + background: #222222; + padding: 82px 180px 33px; + box-shadow: 0px 0px 20px 15px rgba(0, 0, 0, 0.103); +} + +.contact-form { + width: 100%; + display: flex; + flex-wrap: wrap; + padding-bottom: 68px; + justify-content: space-between; +} + +.contact-form-title::after { + content: "Report a User"; +} + +.contact-form-title { + width: 100%; + color: #fff; + display: block; + font-size: 39px; + font-weight: 700; + line-height: 1.2; + text-align: left; + padding-bottom: 44px; + font-family: var(--font3); +} + +.wrap-input { + width: 100%; + position: relative; + margin-bottom: 65px; + padding-bottom: 13px; +} + +.rs1-wrap-input { + width: calc((100% - 30px)/2); +} + +.label { + color: #fff; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + padding-left: 5px; +} + +.input { + width: 100%; + color: #fff; + display: block; + padding: 0 5px; + font-size: 18px; + background: 0 0; + line-height: 1.2; + font-weight: 500; +} + +.input-line { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: none; +} + +.input-line::before { + content: ""; + display: block; + position: absolute; + bottom: -2px; + left: 0; + width: 100%; + height: 2px; + transition: all .4s; + background: linear-gradient(90deg, #5a5460, #4f4c62); +} + +input.input { + height: 40px; + margin-top: 10px; + border-radius: 5px; +} + +textarea.input { + padding-top: 9px; + margin-top: 10px; + min-height: 110px; + border-radius: 5px; + padding-bottom: 13px; +} + +.container-contact-form-btn { + width: 100%; + display: flex; + flex-wrap: wrap; + margin-top: -25px; +} + +.contact-form-btn { + height: 50px; + color: #fff; + display: flex; + font-size: 16px; + padding: 0 20px; + line-height: 1.2; + min-width: 160px; + transition: all .5s; + border-radius: 25px; + align-items: center; + justify-content: center; + box-shadow: 0 10px 10px 0 #0000000f; + background: linear-gradient(150deg, #3f3b44, #3c3748); +} + +.contact-form-btn:hover { + box-shadow: 0 10px 10px 0 #1f1d2275; +} + +.contact-form-btn:hover i { + transform: translateX(10px); +} + +@media(max-width:992px) { + .wrap-contact { + padding: 82px 80px 33px; + } +} + +@media(max-width:768px) { + .rs1-wrap-input { + width: 100%; + } +} + +@media(max-width:576px) { + .wrap-contact { + padding: 82px 15px 33px; + } + .contact-form-title::after { + font-size: 35px; + font-weight: 600; + content: "Contact Us"; + } +} + +.validate-input { + position: relative; +} + +.alert-validate::before { + top: 58%; + right: 2px; + opacity: 0; + max-width: 70%; + font-size: 13px; + color: #c80000; + line-height: 1.4; + text-align: left; + visibility: hidden; + position: absolute; + border-radius: 2px; + pointer-events: none; + background-color: #fff; + transition: opacity .4s; + padding: 4px 25px 4px 10px; + transform: translateY(-50%); + border: 1px solid #c80000; + content: attr(data-validate); +} + +.contact-more { + color: #757184; + font-size: 14px; + line-height: 1.5; +} + +.contact-more-highlight { + color: #8a7b9d; +} + +body.full-screen .wrap-contact { + width: 100%; + height: 100%; +} + +body.full-screen .container-contact { + padding: 0; + width: 100%; + height: 100%; +} + +body.done form>div { + display: none !important; +} + +body.done .contact-form-title::after { + content: "Your Report was Recieved."!important; +} \ No newline at end of file diff --git a/dashboard/static/css/style.css b/dashboard/static/css/style.css new file mode 100644 index 00000000..871c82a4 --- /dev/null +++ b/dashboard/static/css/style.css @@ -0,0 +1,712 @@ + +/* credit: https://github.com/aurolia-css/majo-rebuild */ + + +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap'); + + +:root { +--white: #222; +--preloader: #222; +--spinner: #888; +--spinner-border: #333; +--link: #fff; +--server-hover: #2b2b2b; +--logout: 240, 71, 71; +--logout-background: 240, 71, 71, 0.1; +--edit: 68, 179, 127; +--edit-hover: 47, 124, 88; +--button: #44474c; +--button-hover: #3b3e42; +--svg: #fff; +--text: #fff; +--scrollbar: #222; +--scrollbar-thumb: #2b2b2b; +--scrollbar-hover: #363636; +--scrollbar-active: #454545; +} + +.no-js { +background: #f44336; +font-family: 'Roboto', sans-serif; +color: #fff; +text-align: center; +display: -ms-flexbox; +display: -webkit-flex; +display: flex; +-ms-flex-align: center; +-webkit-box-align: center; +align-items: center; +justify-content: center; +position: fixed; +user-select: none; +height: 100%; +width: 100%; +top: 0; +left: 0; +right: 0; +bottom: 0; +z-index: 999999; +} + +.preloader { +height: 100%; +width: 100%; +background: var(--preloader); +position: fixed; +left: 0; +top: 0; +z-index: 10000; +perspective: 1600px; +perspective-origin: 20% 50%; +transition: 0.5s all; +opacity: 1; +} + +.spinner { +width: 550px; +height: 550px; +position: absolute; +background: url(https://i.imgur.com/83q5LqX.png); +top: 0; +bottom: 0; +left: 0; +right: 0; +margin: auto; +animation: spinning 3s infinite linear; +} + +.preloader.fade { +opacity: 0 +} + +@keyframes spinning { + 0% {top: 0px; background: url(https://i.imgur.com/83q5LqX.png)} + 12% {top: 0px; background: url(https://i.imgur.com/83q5LqX.png) } + 15% {top: 0px; background: url(https://i.imgur.com/kPAqFEM.png) } + 17% {top: 0px; background: url(https://i.imgur.com/kPAqFEM.png) } + 50% {top: 80px; background: url(https://i.imgur.com/83q5LqX.png)} + 100% {top: 0px; background: url(https://i.imgur.com/83q5LqX.png)} +} + +@keyframes comeUp { + from { + opacity: 0; + bottom: -50px; + } +} +/* + +@keyframes spin { + 0% {top: 0px; left: 0px; } + 25% {top: 0px; left: 100px; } + 50% {top: 100px; left: 100px; } + 75% {top: 100px; left: 0px; } + 100% {top: 0px; left: 0px;} +} + +*/ +@keyframes ico { +from { +transform: rotateY(0); +} +to { +transform: rotateY(360deg); +} +} + +* { + +box-sizing: border-box; +font-family: 'Roboto', sans-serif; +scrollbar-color: #353535 transparent; +scrollbar-width: thin; +} + +body { +background: var(--white); +margin: 0 0; +padding: 0 0; +transition: 300ms all; + +} + +.page-content { +display: flex; +text-align: center; +align-items: center; +justify-content: center; +margin-right: auto; +margin-left: auto; +} + +.content { +margin-right: auto; +margin-left: auto; +display: flex; +flex-direction: column; +-webkit-box-align: center; +align-items: center; +max-width: 800px; +padding: 20px 0px; +margin: auto; +margin-top: 60px; +} + +img:not(.img, .server-icon) { +z-index: -50; +opacity: 0.65; +} + +.img { +border-radius: 50%; +display: inline-block; +width: 144px; +height: 144px; +margin-top: 10px; +background-color: #202225; +background-size: 144px; +background-position: 50%; +background-repeat: no-repeat; +position: relative; +-webkit-box-sizing: border-box; +box-sizing: border-box; +-webkit-transition: -webkit-box-shadow 0.1s; +transition: -webkit-box-shadow 0.1s; +transition: box-shadow 0.1s; +transition: box-shadow 0.1s, -webkit-box-shadow 0.1s; +margin-left: auto; +margin-right: auto; +} + +.page-content h1 { +margin-bottom: -10px; +} + +h1, h2, h3, h4, h5, h6 { +font-weight: 500; +color: #ffffff; +} + +p, a { +font-weight: 300; +color: #ffffff; +} + + +.nav { +position: fixed; +background-color: var(--white); +width: 100%; +top: 0; +transition: 500ms all !important; +z-index: 9999; +box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.08); +} + +.nav ul { +margin: 0; +padding: 0; +list-style: none; +overflow: scroll; +overflow-x: hidden; +} + +.logout { +color: rgb(var(--logout)) !important; +} + +.logout:hover { +background-color: rgba(var(--logout-background)) !important; +} + +.nav li a { +display: block; +font-size: 20px; +padding: 20px 20px; +text-decoration: none; +transition: 500ms all; +color: #fff; +} + + + +.nav .logo .name { +display: block; +float: left; +padding: 20px 20px !important; +font-size: 20px; +padding: 10px 20px; +text-decoration: none; +} + +a { +position: relative; +text-decoration: none; +background-position: 50% 100%; +background-size: 0 2px; +} + +a:hover { +background-size: 100% 2px; +} + +@media screen and (max-width: 950px) { +a:hover { +background-size: 0; +} +.dropdown-li { +padding: 20px !important; +} +.cross { +display: flex !important; +} +.dropdown-actived { +background-size: 0; +} +.avatar-container { +padding: 20px 20px !important; +text-align: center; +justify-content: center; +} +.dropdown { +right: 0 !important; +top: 0; +margin-left: auto !important; +margin-right: auto !important; +left: 0; +text-align: center; +height: 100%; +width: calc(90% - 50px) !important; +} +.nav ul { +width: 100%; +} +.nav ul:hover { +opacity: 1.0; +} + +.nav .menu { +display: block !important; +} +} + +.nav .logo a:hover { +background-size: 0%; +} + +.nav .menu { +clear: both; +max-height: 0; +transition: 500ms background-color, 500ms background, 400ms max-height, 1s color !important; +display: flex; +} + +.nav .menu-icon { +cursor: pointer; +display: inline-block; +padding: 28px 20px; +position: relative; +user-select: none; +} + +.nav .menu-icon .navicon { +background-color: #fff; +display: block; +height: 2px; +position: relative; +transition: background 0.2s ease-out; +width: 18px; +} + +.nav .menu-icon .navicon:before, .nav .menu-icon .navicon:after { +background-color: #fff; +content: ''; +display: block; +height: 100%; +position: absolute; +transition: all 0.2s ease-out; +width: 100%; +} + +.nav .menu-icon .navicon:before { +top: 5px; +} + +.nav .menu-icon .navicon:after { +top: -5px; +} + +.nav .menu-btn { +display: none; +} + +.nav .menu-btn:checked ~ .menu { +max-height: 500px; +} + +.nav .menu-btn:checked { +box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.08); +} + +.nav .menu-btn:checked ~ .menu-icon .navicon { +background-color: transparent; +} + +.nav .menu-btn:checked ~ .menu-icon .navicon:before { +transform: rotate(-45deg); +} + +.nav .menu-btn:checked ~ .menu-icon .navicon:after { +transform: rotate(45deg); +} + +.nav .menu-btn:checked ~ .menu-icon .navicon:before, .nav .menu-btn:checked ~ .menu-icon .navicon:after { +top: 0; +} + +@media (min-width: 950px) { +.nav li { +float: left; +} +.nav li a { +padding: 20px 30px; +} +.nav .menu { +clear: none; +float: right; +max-height: none; +} +.nav .menu-icon { +display: none; +} +} + +[hidden] { +display: none; +} + +.logo { +transition: 500ms all; +} + +ul, li { +list-style: none; +} + +.menu-icon svg { +stroke: #ccc; +} + +main a { +color: #fff !important; +transition: 500ms; +} + +.tag { +color: #72767d; +flex-grow: 0; +flex-shrink: 0; +} + +.name { +line-height: 20px; +flex-grow: 0; +flex-shrink: 1; +} + +.navbar a:not(:last-child) { +margin-right: 12px; +} + +.navbar .right { +float: right; +} + + +.server-icon { +width: 60px; +height: 60px; +border-radius: 50%; +margin-left: 20px; +} + +.user-avatar { +width: 35px; +height: 35px; +border-radius: 50%; +} + +.avatar-container { +display: flex; +-webkit-box-align: center; +align-items: center; +cursor: pointer; +padding: 0px 20px; +font-size: 20px; +} + + +.button { +white-space: nowrap; +user-select: none; +line-height: 1; +font-weight: 400; +display: flex; +border-radius: 3px; +font-size: 13px; +-webkit-box-pack: center; +justify-content: center; +-webkit-box-align: center; +align-items: center; +padding: 10px 25px; +transition: border 180ms ease-out 0s, background 180ms ease-out 0s; +color: #fff; +background-color: var(--button); +border: none; +cursor: pointer; +min-height: 32px; +min-width: 60px; +margin-bottom: 5px; +} + +.button:hover { +background-color: var(--button-hover); +background-size: 0; +} + +.edit { +background: rgb(var(--edit)); +} + +.edit:hover { +background-color: rgb(var(--edit-hover)); +} + +.server { +display: flex; +flex: 1 1 0%; +height: 60px; +-webkit-box-align: center; +align-items: center; +-webkit-box-pack: justify; +justify-content: space-between; +padding: 1em; +border-radius: 5px; +transition: border 180ms ease-out 0s, background 180ms ease-out 0s; +margin-bottom: 5px; +} + +.server:hover { +background-color: var(--server-hover); +} + +.servers { +display: flex; +flex: 1 1 0%; +flex-direction: column; +padding: 0px 0.5em; +align-self: stretch; +} + +.icon-and-name { +display: flex; +flex-flow: row wrap; +-webkit-box-align: center; +align-items: center; +-webkit-box-pack: start; +justify-content: flex-start; +margin-left: -20px; +} + +.guild-name { +margin: 0px 1em; +font-weight: bold; +} + +.user-name { +margin-left: 0.5rem; +} + +.dropdown { +visibility: hidden; +z-index: 1999999; +position: absolute; +opacity: 0; +transition: 300ms all; +background-color: var(--white); +box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.29); +border-radius: 4px; +list-style: none; +pointer-events: none; +padding: 4px; +margin-top: -50px; +right: 20px; +} + +.dropdown-li { +display: flex; +margin: 5px; +padding: 5px 15px 5px 0px; +font-size: 20px; +font-weight: 400; +color: rgb(166, 170, 181); +-webkit-box-align: center; +align-items: center; +cursor: pointer; +transition: 300ms; +border-radius: 4px; +} + +.dropdown-li:hover { +background-color: var(--server-hover); +background-size: 0; +} + +.dropdown-actived { +background-size: 100% 2px; +} + +.dropdown-hidden { +opacity: 1; +visibility: visible; +pointer-events: all; +margin-top: 60px !important; +} + +.disabled { +opacity: 0.5; +cursor: not-allowed; +} + +svg { +fill: var(--svg); +margin: 0px 10px; +} + +.logout svg { +fill: rgb(var(--logout)); +} + +.command-container { +padding: 20px; +margin-bottom: 20px; +background-color: var(--server-hover); +width: 100%; +box-shadow: 3px 3px 5px 0 var(--white); +border-radius: 3px; +font-size: 17px; +} + +.command-description { +color: #fff; +} + +.command-aliases { +color: #afafaf; +} + +.command-name { +padding: 0; +margin: 0; +} + +.bold { +font-weight: bold +} + +.italic { +font-style: italic; +} + +.note { +color: #afafaf; +font-style: italic; +} + +.none { +cursor: not-allowed; +font-style: italic; +} + +code { +background-color: var(--server-hover); +padding: 3px 5px; +border-radius: 5px; +font-style: normal; +} + +.blur { +position: fixed; +z-index: 9998; +left: 0; +top: 0; +width: 100%; +height: 100%; +background-color: rgba(0, 0, 0, 0.35); +transition: 300ms all; +filter: blur(0px) !important; +opacity: 0; +visibility: hidden; +} + +.blur.visible { +display: table; +opacity: 1; +visibility: visible; +} + +.cross-container { +width: 100%; +display: inline-block; +} + +.cross { +position: relative; +height: 20px; +cursor: pointer; +width: 20px; +display: none; +flex-direction: column; +justify-content: center; +float: right; +margin: 10px; +padding: 10px 5px; +} + +.cross::before, .cross::after { +position: absolute; +content: ''; +width: 100%; +height: 2px; +background-color: var(--text); +} + +.cross::before { +transform: rotate(45deg); +} + +.cross::after { +transform: rotate(-45deg); +} + +::-webkit-scrollbar { +width: 16px; +background-color: var(--scrollbar); +cursor: pointer; +} + +::-webkit-scrollbar-thumb { +background-color: var(--scrollbar-thumb); +height: 16px; +background-clip: padding-box; +} + +::-webkit-scrollbar-thumb:hover { +background-color: var(--scrollbar-hover); +} + +::-webkit-scrollbar-thumb:active { +background-color: var(--scrollbar-active); +} + diff --git a/dashboard/static/fonts/roboto-thin.eot b/dashboard/static/fonts/roboto-thin.eot new file mode 100644 index 00000000..2284a3b3 Binary files /dev/null and b/dashboard/static/fonts/roboto-thin.eot differ diff --git a/dashboard/static/fonts/roboto-thin.otf b/dashboard/static/fonts/roboto-thin.otf new file mode 100644 index 00000000..edbd51d2 Binary files /dev/null and b/dashboard/static/fonts/roboto-thin.otf differ diff --git a/dashboard/static/fonts/roboto-thin.ttf b/dashboard/static/fonts/roboto-thin.ttf new file mode 100644 index 00000000..8779333b Binary files /dev/null and b/dashboard/static/fonts/roboto-thin.ttf differ diff --git a/dashboard/static/fonts/roboto-thin.woff b/dashboard/static/fonts/roboto-thin.woff new file mode 100644 index 00000000..2a98c1e4 Binary files /dev/null and b/dashboard/static/fonts/roboto-thin.woff differ diff --git a/dashboard/static/fonts/roboto-thin.woff2 b/dashboard/static/fonts/roboto-thin.woff2 new file mode 100644 index 00000000..a38025a1 Binary files /dev/null and b/dashboard/static/fonts/roboto-thin.woff2 differ diff --git a/dashboard/static/js/404.js b/dashboard/static/js/404.js new file mode 100644 index 00000000..1120b190 --- /dev/null +++ b/dashboard/static/js/404.js @@ -0,0 +1,103 @@ +'use strict'; + +var cnvs = document.querySelector('canvas'); +var ctx = cnvs.getContext('2d'); + +function resize() { + cnvs.width = innerWidth; + cnvs.height = innerHeight; +} + +var memes = []; +var cap = 250; +var hyper = false; + +function hyperEnable() { + hyper = true; + cap = 1000; + document.querySelector('#memeplane').style.animationName = 'fly-plane-extreme'; +} + +function hyperDisable() { + hyper = false; + cap = 250; + document.querySelector('#memeplane').style.animationName = 'fly-plane'; +} + +function draw() { + ctx.clearRect(0, 0, cnvs.width, cnvs.height); + + if (hyper) { + let h = (Date.now() / 10) % 360; + ctx.fillStyle = `hsla(${h}, 100%, 50%, 1)`; + } else { + ctx.fillStyle = '#7289DA'; // blurple + } + ctx.fillRect(0, 0, cnvs.width, cnvs.height); + + for (var i = 0; i < memes.length; i++) { + let meme = memes[i]; + ctx.save(); + ctx.translate(meme.x, meme.y); + ctx.drawImage(meme.image, meme.x, meme.y, meme.width, meme.height); + ctx.restore(); + + meme.y += meme.speed; + meme.x -= meme.speed; + } + + // remove sprites that fall off of the screen + for (var i = memes.length - 1; i > 0; i--) { + if (memes[i].y > innerHeight + memes[i].image.height) { + memes.splice(i, 1); + } + } + + // draw again + requestAnimationFrame(draw); +} + +setInterval(function() { + if (hyper) { + for (var i = 0; i < 3; i++) { + spawnMeme(); + } + } else { + spawnMeme(); + } +}, 8); + +// resize the canvas +resize(); +window.addEventListener('resize', function() { + memes = []; + resize(); +}); + +var images = document.querySelectorAll('.images img'); + +function spawnMeme() { + // cap at 200 sprites + if (memes.length > cap) { + return; + } + + var far = Math.random(); + if (far > 0.35) far = 0.35; + var img = images[Math.floor(Math.random() * images.length)]; + var x = Math.floor(Math.random() * innerWidth); + var y = 0 - img.height * 2; + + memes.push({ + image: img, + x: x, y: y, + width: img.width * far, + height: img.height * far, + speed: img.width * far / 15, + rot: Math.random() * 2 + }); +} + +// draw +draw(); +requestAnimationFrame(draw); \ No newline at end of file diff --git a/dashboard/static/js/commands.js b/dashboard/static/js/commands.js new file mode 100644 index 00000000..9767ad4d --- /dev/null +++ b/dashboard/static/js/commands.js @@ -0,0 +1,77 @@ +window.onload = () => { + const cmdsBoxInner = document.querySelector('.cmdsBoxInner'), + newTab = document.querySelector('.newTab'), + cmdFilters = document.querySelector('.cmdsBoxCmdsContainer .cmdFilters'); + if (window.location.search.includes('min=true')) document.body.classList.remove('zoomed'); // ?min=true for minimized mode + if (window.self === window.top) cmdsBoxInner.querySelector('header').style.display = 'block'; + else { + newTab.style.display = 'block'; + if (window.top.location.origin === window.self.location.origin) window.top.document.querySelector('.loader').style.display = 'none'; + } + if (window.location.hash) { + let id = window.location.hash; + if (document.querySelector(id)) { + if (document.querySelector(`.cmdFilter.${id.slice(1)}Selector`)) { + cmdFilters.querySelector('.cmdFilter.active').classList.remove('active') + document.querySelector(`.cmdFilter.${id.slice(1)}Selector`).classList.add('active'); + } + } + cmdFilters.style.transform = cmdsBoxInner.scrollTop > 100 && `translateY(${cmdsBoxInner.scrollTop - 55}px)` || cmdsBoxInner.scrollTop <= 2980 && 'translateY(55px)'; + } + const ifrNum = window.self !== window.top && 110 || 0; + + cmdsBoxInner.addEventListener('scroll', () => cmdFilters.style.transform = cmdsBoxInner.scrollTop > 100 && `translateY(${(cmdsBoxInner.scrollTop - 55) + ifrNum}px)` || cmdsBoxInner.scrollTop <= 2980 && 'translateY(55px)'); + + cmdFilters.querySelectorAll('.cmdFilter').forEach(e => + e.addEventListener('click', el => { + let a = el.target.querySelector('a[href]'); + if (a) window.location = a.href; + cmdFilters.querySelector('.cmdFilter.active').classList.remove('active') + el.target.closest('.cmdFilter').classList.add('active') + }) + ); + + + + cmdsBoxInner.addEventListener('click', () => { + let win = document.querySelector('.win2'), cls = document.body.classList; + if (cls.contains('shoWin2')) { + cmdsBoxInner.style.removeProperty('left'); + cls.remove('shoWin2'); + win.classList.add('aside'); + return false; + } + }); + + document.querySelectorAll('.cmds .cmd:not(.ccmd)').forEach(elem => { + elem.addEventListener('click', clicked => { + if (window.getSelection().toString().length === 0 && clicked.target.classList.contains('cmd')) { + clicked.target.querySelector('.cmdData').classList.toggle('active'); + }; + }); + }); + + let lst = [ + "For commands that require a user, you can say the users ID or name (in quotation marks if it has spaces) instead of pinging the user.", + "You can use the feeback command to send feedbck to the bot developer. You can also upload screenshots together with the command if needed." + ] + + + document.querySelectorAll('.emojiImage') + .forEach(e => e.src = `https://cdn.discordapp.com/emojis/${e.classList[1]}.png`) + + window.matchMedia('(max-width: 1215px)').addEventListener('change', (e) => { + if (e.matches) { + cls = document.body.classList, win = document.querySelector('.win2'), inner = win.querySelector('.inner'); + win.style.display = 'unset', inner.style.right = '-100px'; + setTimeout(() => { + inner.style.removeProperty('right'); + win.style.removeProperty('display'); + }, 1000); + if (cls.contains('shoWin2')) { + cls.remove('shoWin2'); + win.classList.add('aside'); + } + } + }); +}; \ No newline at end of file diff --git a/dashboard/static/js/components.js b/dashboard/static/js/components.js new file mode 100644 index 00000000..12ad8547 --- /dev/null +++ b/dashboard/static/js/components.js @@ -0,0 +1,4741 @@ +var emojis = { + "open_hands": "👐", + "open_hands_tone1": "👐🏻", + "open_hands_tone2": "👐🏼", + "open_hands_tone3": "👐🏽", + "open_hands_tone4": "👐🏾", + "open_hands_tone5": "👐🏿", + "raised_hands": "🙌", + "raised_hands_tone1": "🙌🏻", + "raised_hands_tone2": "🙌🏼", + "raised_hands_tone3": "🙌🏽", + "raised_hands_tone4": "🙌🏾", + "raised_hands_tone5": "🙌🏿", + "clap": "👏", + "clap_tone1": "👏🏻", + "clap_tone2": "👏🏼", + "clap_tone3": "👏🏽", + "clap_tone4": "👏🏾", + "clap_tone5": "👏🏿", + "handshake": "🤝", + "shaking_hands": "🤝", + "thumbsup": "👍", + "+1": "👍", + "thumbup": "👍", + "thumbsup_tone1": "👍🏻", + "+1_tone1": "👍🏻", + "thumbup_tone1": "👍🏻", + "thumbsup_tone2": "👍🏼", + "+1_tone2": "👍🏼", + "thumbup_tone2": "👍🏼", + "thumbsup_tone3": "👍🏽", + "+1_tone3": "👍🏽", + "thumbup_tone3": "👍🏽", + "thumbsup_tone4": "👍🏾", + "+1_tone4": "👍🏾", + "thumbup_tone4": "👍🏾", + "thumbsup_tone5": "👍🏿", + "+1_tone5": "👍🏿", + "thumbup_tone5": "👍🏿", + "thumbsdown": "👎", + "-1": "👎", + "thumbdown": "👎", + "thumbsdown_tone1": "👎🏻", + "_1_tone1": "👎🏻", + "thumbdown_tone1": "👎🏻", + "thumbsdown_tone2": "👎🏼", + "_1_tone2": "👎🏼", + "thumbdown_tone2": "👎🏼", + "thumbsdown_tone3": "👎🏽", + "_1_tone3": "👎🏽", + "thumbdown_tone3": "👎🏽", + "thumbsdown_tone4": "👎🏾", + "_1_tone4": "👎🏾", + "thumbdown_tone4": "👎🏾", + "thumbsdown_tone5": "👎🏿", + "_1_tone5": "👎🏿", + "thumbdown_tone5": "👎🏿", + "punch": "👊", + "punch_tone1": "👊🏻", + "punch_tone2": "👊🏼", + "punch_tone3": "👊🏽", + "punch_tone4": "👊🏾", + "punch_tone5": "👊🏿", + "fist": "✊", + "fist_tone1": "✊🏻", + "fist_tone2": "✊🏼", + "fist_tone3": "✊🏽", + "fist_tone4": "✊🏾", + "fist_tone5": "✊🏿", + "left_facing_fist": "🤛", + "left_fist": "🤛", + "left_facing_fist_tone1": "🤛🏻", + "left_fist_tone1": "🤛🏻", + "left_facing_fist_tone2": "🤛🏼", + "left_fist_tone2": "🤛🏼", + "left_facing_fist_tone3": "🤛🏽", + "left_fist_tone3": "🤛🏽", + "left_facing_fist_tone4": "🤛🏾", + "left_fist_tone4": "🤛🏾", + "left_facing_fist_tone5": "🤛🏿", + "left_fist_tone5": "🤛🏿", + "right_facing_fist": "🤜", + "right_fist": "🤜", + "right_facing_fist_tone1": "🤜🏻", + "right_fist_tone1": "🤜🏻", + "right_facing_fist_tone2": "🤜🏼", + "right_fist_tone2": "🤜🏼", + "right_facing_fist_tone3": "🤜🏽", + "right_fist_tone3": "🤜🏽", + "right_facing_fist_tone4": "🤜🏾", + "right_fist_tone4": "🤜🏾", + "right_facing_fist_tone5": "🤜🏿", + "right_fist_tone5": "🤜🏿", + "fingers_crossed": "🤞", + "hand_with_index_and_middle_finger_crossed": "🤞", + "fingers_crossed_tone1": "🤞🏻", + "hand_with_index_and_middle_fingers_crossed_tone1": "🤞🏻", + "fingers_crossed_tone2": "🤞🏼", + "hand_with_index_and_middle_fingers_crossed_tone2": "🤞🏼", + "fingers_crossed_tone3": "🤞🏽", + "hand_with_index_and_middle_fingers_crossed_tone3": "🤞🏽", + "fingers_crossed_tone4": "🤞🏾", + "hand_with_index_and_middle_fingers_crossed_tone4": "🤞🏾", + "fingers_crossed_tone5": "🤞🏿", + "hand_with_index_and_middle_fingers_crossed_tone5": "🤞🏿", + "v": "✌️", + "v_tone1": "✌🏻", + "v_tone2": "✌🏼", + "v_tone3": "✌🏽", + "v_tone4": "✌🏾", + "v_tone5": "✌🏿", + "love_you_gesture": "🤟", + "love_you_gesture_tone1": "🤟🏻", + "love_you_gesture_light_skin_tone": "🤟🏻", + "love_you_gesture_tone2": "🤟🏼", + "love_you_gesture_medium_light_skin_tone": "🤟🏼", + "love_you_gesture_tone3": "🤟🏽", + "love_you_gesture_medium_skin_tone": "🤟🏽", + "love_you_gesture_tone4": "🤟🏾", + "love_you_gesture_medium_dark_skin_tone": "🤟🏾", + "love_you_gesture_tone5": "🤟🏿", + "love_you_gesture_dark_skin_tone": "🤟🏿", + "metal": "🤘", + "sign_of_the_horns": "🤘", + "metal_tone1": "🤘🏻", + "sign_of_the_horns_tone1": "🤘🏻", + "metal_tone2": "🤘🏼", + "sign_of_the_horns_tone2": "🤘🏼", + "metal_tone3": "🤘🏽", + "sign_of_the_horns_tone3": "🤘🏽", + "metal_tone4": "🤘🏾", + "sign_of_the_horns_tone4": "🤘🏾", + "metal_tone5": "🤘🏿", + "sign_of_the_horns_tone5": "🤘🏿", + "ok_hand": "👌", + "ok_hand_tone1": "👌🏻", + "ok_hand_tone2": "👌🏼", + "ok_hand_tone3": "👌🏽", + "ok_hand_tone4": "👌🏾", + "ok_hand_tone5": "👌🏿", + "pinching_hand": "🤏", + "pinching_hand_tone1": "🤏🏻", + "pinching_hand_light_skin_tone": "🤏🏻", + "pinching_hand_tone2": "🤏🏼", + "pinching_hand_medium_light_skin_tone": "🤏🏼", + "pinching_hand_tone3": "🤏🏽", + "pinching_hand_medium_skin_tone": "🤏🏽", + "pinching_hand_tone4": "🤏🏾", + "pinching_hand_medium_dark_skin_tone": "🤏🏾", + "pinching_hand_tone5": "🤏🏿", + "pinching_hand_dark_skin_tone": "🤏🏿", + "pinched_fingers": "🤌", + "pinched_fingers_tone2": "🤌🏼", + "pinched_fingers_medium_light_skin_tone": "🤌🏼", + "pinched_fingers_tone1": "🤌🏻", + "pinched_fingers_light_skin_tone": "🤌🏻", + "pinched_fingers_tone3": "🤌🏽", + "pinched_fingers_medium_skin_tone": "🤌🏽", + "pinched_fingers_tone4": "🤌🏾", + "pinched_fingers_medium_dark_skin_tone": "🤌🏾", + "pinched_fingers_tone5": "🤌🏿", + "pinched_fingers_dark_skin_tone": "🤌🏿", + "point_left": "👈", + "point_left_tone1": "👈🏻", + "point_left_tone2": "👈🏼", + "point_left_tone3": "👈🏽", + "point_left_tone4": "👈🏾", + "point_left_tone5": "👈🏿", + "point_right": "👉", + "point_right_tone1": "👉🏻", + "point_right_tone2": "👉🏼", + "point_right_tone3": "👉🏽", + "point_right_tone4": "👉🏾", + "point_right_tone5": "👉🏿", + "point_up_2": "👆", + "point_up_2_tone1": "👆🏻", + "point_up_2_tone2": "👆🏼", + "point_up_2_tone3": "👆🏽", + "point_up_2_tone4": "👆🏾", + "point_up_2_tone5": "👆🏿", + "point_down": "👇", + "point_down_tone1": "👇🏻", + "point_down_tone2": "👇🏼", + "point_down_tone3": "👇🏽", + "point_down_tone4": "👇🏾", + "point_down_tone5": "👇🏿", + "point_up": "☝️", + "point_up_tone1": "☝🏻", + "point_up_tone2": "☝🏼", + "point_up_tone3": "☝🏽", + "point_up_tone4": "☝🏾", + "point_up_tone5": "☝🏿", + "raised_hand": "✋", + "raised_hand_tone1": "✋🏻", + "raised_hand_tone2": "✋🏼", + "raised_hand_tone3": "✋🏽", + "raised_hand_tone4": "✋🏾", + "raised_hand_tone5": "✋🏿", + "raised_back_of_hand": "🤚", + "back_of_hand": "🤚", + "raised_back_of_hand_tone1": "🤚🏻", + "back_of_hand_tone1": "🤚🏻", + "raised_back_of_hand_tone2": "🤚🏼", + "back_of_hand_tone2": "🤚🏼", + "raised_back_of_hand_tone3": "🤚🏽", + "back_of_hand_tone3": "🤚🏽", + "raised_back_of_hand_tone4": "🤚🏾", + "back_of_hand_tone4": "🤚🏾", + "raised_back_of_hand_tone5": "🤚🏿", + "back_of_hand_tone5": "🤚🏿", + "hand_splayed": "🖐️", + "raised_hand_with_fingers_splayed": "🖐️", + "hand_splayed_tone1": "🖐🏻", + "raised_hand_with_fingers_splayed_tone1": "🖐🏻", + "hand_splayed_tone2": "🖐🏼", + "raised_hand_with_fingers_splayed_tone2": "🖐🏼", + "hand_splayed_tone3": "🖐🏽", + "raised_hand_with_fingers_splayed_tone3": "🖐🏽", + "hand_splayed_tone4": "🖐🏾", + "raised_hand_with_fingers_splayed_tone4": "🖐🏾", + "hand_splayed_tone5": "🖐🏿", + "raised_hand_with_fingers_splayed_tone5": "🖐🏿", + "vulcan": "🖖", + "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", + "vulcan_tone1": "🖖🏻", + "raised_hand_with_part_between_middle_and_ring_fingers_tone1": "🖖🏻", + "vulcan_tone2": "🖖🏼", + "raised_hand_with_part_between_middle_and_ring_fingers_tone2": "🖖🏼", + "vulcan_tone3": "🖖🏽", + "raised_hand_with_part_between_middle_and_ring_fingers_tone3": "🖖🏽", + "vulcan_tone4": "🖖🏾", + "raised_hand_with_part_between_middle_and_ring_fingers_tone4": "🖖🏾", + "vulcan_tone5": "🖖🏿", + "raised_hand_with_part_between_middle_and_ring_fingers_tone5": "🖖🏿", + "wave": "👋", + "wave_tone1": "👋🏻", + "wave_tone2": "👋🏼", + "wave_tone3": "👋🏽", + "wave_tone4": "👋🏾", + "wave_tone5": "👋🏿", + "call_me": "🤙", + "call_me_hand": "🤙", + "call_me_tone1": "🤙🏻", + "call_me_hand_tone1": "🤙🏻", + "call_me_tone2": "🤙🏼", + "call_me_hand_tone2": "🤙🏼", + "call_me_tone3": "🤙🏽", + "call_me_hand_tone3": "🤙🏽", + "call_me_tone4": "🤙🏾", + "call_me_hand_tone4": "🤙🏾", + "call_me_tone5": "🤙🏿", + "call_me_hand_tone5": "🤙🏿", + "muscle": "💪", + "muscle_tone1": "💪🏻", + "muscle_tone2": "💪🏼", + "muscle_tone3": "💪🏽", + "muscle_tone4": "💪🏾", + "muscle_tone5": "💪🏿", + "mechanical_arm": "🦾", + "middle_finger": "🖕", + "reversed_hand_with_middle_finger_extended": "🖕", + "middle_finger_tone1": "🖕🏻", + "reversed_hand_with_middle_finger_extended_tone1": "🖕🏻", + "middle_finger_tone2": "🖕🏼", + "reversed_hand_with_middle_finger_extended_tone2": "🖕🏼", + "middle_finger_tone3": "🖕🏽", + "reversed_hand_with_middle_finger_extended_tone3": "🖕🏽", + "middle_finger_tone4": "🖕🏾", + "reversed_hand_with_middle_finger_extended_tone4": "🖕🏾", + "middle_finger_tone5": "🖕🏿", + "reversed_hand_with_middle_finger_extended_tone5": "🖕🏿", + "writing_hand": "✍️", + "writing_hand_tone1": "✍🏻", + "writing_hand_tone2": "✍🏼", + "writing_hand_tone3": "✍🏽", + "writing_hand_tone4": "✍🏾", + "writing_hand_tone5": "✍🏿", + "pray": "🙏", + "pray_tone1": "🙏🏻", + "pray_tone2": "🙏🏼", + "pray_tone3": "🙏🏽", + "pray_tone4": "🙏🏾", + "pray_tone5": "🙏🏿", + "foot": "🦶", + "foot_tone1": "🦶🏻", + "foot_light_skin_tone": "🦶🏻", + "foot_tone2": "🦶🏼", + "foot_medium_light_skin_tone": "🦶🏼", + "foot_tone3": "🦶🏽", + "foot_medium_skin_tone": "🦶🏽", + "foot_tone4": "🦶🏾", + "foot_medium_dark_skin_tone": "🦶🏾", + "foot_tone5": "🦶🏿", + "foot_dark_skin_tone": "🦶🏿", + "leg": "🦵", + "leg_tone1": "🦵🏻", + "leg_light_skin_tone": "🦵🏻", + "leg_tone2": "🦵🏼", + "leg_medium_light_skin_tone": "🦵🏼", + "leg_tone3": "🦵🏽", + "leg_medium_skin_tone": "🦵🏽", + "leg_tone4": "🦵🏾", + "leg_medium_dark_skin_tone": "🦵🏾", + "leg_tone5": "🦵🏿", + "leg_dark_skin_tone": "🦵🏿", + "mechanical_leg": "🦿", + "lipstick": "💄", + "kiss": "💋", + "lips": "👄", + "tooth": "🦷", + "bone": "🦴", + "tongue": "👅", + "ear": "👂", + "ear_tone1": "👂🏻", + "ear_tone2": "👂🏼", + "ear_tone3": "👂🏽", + "ear_tone4": "👂🏾", + "ear_tone5": "👂🏿", + "ear_with_hearing_aid": "🦻", + "ear_with_hearing_aid_tone1": "🦻🏻", + "ear_with_hearing_aid_light_skin_tone": "🦻🏻", + "ear_with_hearing_aid_tone2": "🦻🏼", + "ear_with_hearing_aid_medium_light_skin_tone": "🦻🏼", + "ear_with_hearing_aid_tone3": "🦻🏽", + "ear_with_hearing_aid_medium_skin_tone": "🦻🏽", + "ear_with_hearing_aid_tone4": "🦻🏾", + "ear_with_hearing_aid_medium_dark_skin_tone": "🦻🏾", + "ear_with_hearing_aid_tone5": "🦻🏿", + "ear_with_hearing_aid_dark_skin_tone": "🦻🏿", + "nose": "👃", + "nose_tone1": "👃🏻", + "nose_tone2": "👃🏼", + "nose_tone3": "👃🏽", + "nose_tone4": "👃🏾", + "nose_tone5": "👃🏿", + "footprints": "👣", + "eye": "👁️", + "eyes": "👀", + "brain": "🧠", + "anatomical_heart": "🫀", + "lungs": "🫁", + "speaking_head": "🗣️", + "speaking_head_in_silhouette": "🗣️", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "people_hugging": "🫂", + "baby": "👶", + "baby_tone1": "👶🏻", + "baby_tone2": "👶🏼", + "baby_tone3": "👶🏽", + "baby_tone4": "👶🏾", + "baby_tone5": "👶🏿", + "girl": "👧", + "girl_tone1": "👧🏻", + "girl_tone2": "👧🏼", + "girl_tone3": "👧🏽", + "girl_tone4": "👧🏾", + "girl_tone5": "👧🏿", + "child": "🧒", + "child_tone1": "🧒🏻", + "child_light_skin_tone": "🧒🏻", + "child_tone2": "🧒🏼", + "child_medium_light_skin_tone": "🧒🏼", + "child_tone3": "🧒🏽", + "child_medium_skin_tone": "🧒🏽", + "child_tone4": "🧒🏾", + "child_medium_dark_skin_tone": "🧒🏾", + "child_tone5": "🧒🏿", + "child_dark_skin_tone": "🧒🏿", + "boy": "👦", + "boy_tone1": "👦🏻", + "boy_tone2": "👦🏼", + "boy_tone3": "👦🏽", + "boy_tone4": "👦🏾", + "boy_tone5": "👦🏿", + "woman": "👩", + "woman_tone1": "👩🏻", + "woman_tone2": "👩🏼", + "woman_tone3": "👩🏽", + "woman_tone4": "👩🏾", + "woman_tone5": "👩🏿", + "adult": "🧑", + "adult_tone1": "🧑🏻", + "adult_light_skin_tone": "🧑🏻", + "adult_tone2": "🧑🏼", + "adult_medium_light_skin_tone": "🧑🏼", + "adult_tone3": "🧑🏽", + "adult_medium_skin_tone": "🧑🏽", + "adult_tone4": "🧑🏾", + "adult_medium_dark_skin_tone": "🧑🏾", + "adult_tone5": "🧑🏿", + "adult_dark_skin_tone": "🧑🏿", + "man": "👨", + "man_tone1": "👨🏻", + "man_tone2": "👨🏼", + "man_tone3": "👨🏽", + "man_tone4": "👨🏾", + "man_tone5": "👨🏿", + "person_curly_hair": "🧑‍🦱", + "person_tone1_curly_hair": "🧑🏻‍🦱", + "person_light_skin_tone_curly_hair": "🧑🏻‍🦱", + "person_tone2_curly_hair": "🧑🏼‍🦱", + "person_medium_light_skin_tone_curly_hair": "🧑🏼‍🦱", + "person_tone3_curly_hair": "🧑🏽‍🦱", + "person_medium_skin_tone_curly_hair": "🧑🏽‍🦱", + "person_tone4_curly_hair": "🧑🏾‍🦱", + "person_medium_dark_skin_tone_curly_hair": "🧑🏾‍🦱", + "person_tone5_curly_hair": "🧑🏿‍🦱", + "person_dark_skin_tone_curly_hair": "🧑🏿‍🦱", + "woman_curly_haired": "👩‍🦱", + "woman_curly_haired_tone1": "👩🏻‍🦱", + "woman_curly_haired_light_skin_tone": "👩🏻‍🦱", + "woman_curly_haired_tone2": "👩🏼‍🦱", + "woman_curly_haired_medium_light_skin_tone": "👩🏼‍🦱", + "woman_curly_haired_tone3": "👩🏽‍🦱", + "woman_curly_haired_medium_skin_tone": "👩🏽‍🦱", + "woman_curly_haired_tone4": "👩🏾‍🦱", + "woman_curly_haired_medium_dark_skin_tone": "👩🏾‍🦱", + "woman_curly_haired_tone5": "👩🏿‍🦱", + "woman_curly_haired_dark_skin_tone": "👩🏿‍🦱", + "man_curly_haired": "👨‍🦱", + "man_curly_haired_tone1": "👨🏻‍🦱", + "man_curly_haired_light_skin_tone": "👨🏻‍🦱", + "man_curly_haired_tone2": "👨🏼‍🦱", + "man_curly_haired_medium_light_skin_tone": "👨🏼‍🦱", + "man_curly_haired_tone3": "👨🏽‍🦱", + "man_curly_haired_medium_skin_tone": "👨🏽‍🦱", + "man_curly_haired_tone4": "👨🏾‍🦱", + "man_curly_haired_medium_dark_skin_tone": "👨🏾‍🦱", + "man_curly_haired_tone5": "👨🏿‍🦱", + "man_curly_haired_dark_skin_tone": "👨🏿‍🦱", + "person_red_hair": "🧑‍🦰", + "person_tone1_red_hair": "🧑🏻‍🦰", + "person_light_skin_tone_red_hair": "🧑🏻‍🦰", + "person_tone2_red_hair": "🧑🏼‍🦰", + "person_medium_light_skin_tone_red_hair": "🧑🏼‍🦰", + "person_tone3_red_hair": "🧑🏽‍🦰", + "person_medium_skin_tone_red_hair": "🧑🏽‍🦰", + "person_tone4_red_hair": "🧑🏾‍🦰", + "person_medium_dark_skin_tone_red_hair": "🧑🏾‍🦰", + "person_tone5_red_hair": "🧑🏿‍🦰", + "person_dark_skin_tone_red_hair": "🧑🏿‍🦰", + "woman_red_haired": "👩‍🦰", + "woman_red_haired_tone1": "👩🏻‍🦰", + "woman_red_haired_light_skin_tone": "👩🏻‍🦰", + "woman_red_haired_tone2": "👩🏼‍🦰", + "woman_red_haired_medium_light_skin_tone": "👩🏼‍🦰", + "woman_red_haired_tone3": "👩🏽‍🦰", + "woman_red_haired_medium_skin_tone": "👩🏽‍🦰", + "woman_red_haired_tone4": "👩🏾‍🦰", + "woman_red_haired_medium_dark_skin_tone": "👩🏾‍🦰", + "woman_red_haired_tone5": "👩🏿‍🦰", + "woman_red_haired_dark_skin_tone": "👩🏿‍🦰", + "man_red_haired": "👨‍🦰", + "man_red_haired_tone1": "👨🏻‍🦰", + "man_red_haired_light_skin_tone": "👨🏻‍🦰", + "man_red_haired_tone2": "👨🏼‍🦰", + "man_red_haired_medium_light_skin_tone": "👨🏼‍🦰", + "man_red_haired_tone3": "👨🏽‍🦰", + "man_red_haired_medium_skin_tone": "👨🏽‍🦰", + "man_red_haired_tone4": "👨🏾‍🦰", + "man_red_haired_medium_dark_skin_tone": "👨🏾‍🦰", + "man_red_haired_tone5": "👨🏿‍🦰", + "man_red_haired_dark_skin_tone": "👨🏿‍🦰", + "blond_haired_woman": "👱‍♀️", + "blond_haired_woman_tone1": "👱🏻‍♀️", + "blond_haired_woman_light_skin_tone": "👱🏻‍♀️", + "blond_haired_woman_tone2": "👱🏼‍♀️", + "blond_haired_woman_medium_light_skin_tone": "👱🏼‍♀️", + "blond_haired_woman_tone3": "👱🏽‍♀️", + "blond_haired_woman_medium_skin_tone": "👱🏽‍♀️", + "blond_haired_woman_tone4": "👱🏾‍♀️", + "blond_haired_woman_medium_dark_skin_tone": "👱🏾‍♀️", + "blond_haired_woman_tone5": "👱🏿‍♀️", + "blond_haired_woman_dark_skin_tone": "👱🏿‍♀️", + "blond_haired_person": "👱", + "person_with_blond_hair": "👱", + "blond_haired_person_tone1": "👱🏻", + "person_with_blond_hair_tone1": "👱🏻", + "blond_haired_person_tone2": "👱🏼", + "person_with_blond_hair_tone2": "👱🏼", + "blond_haired_person_tone3": "👱🏽", + "person_with_blond_hair_tone3": "👱🏽", + "blond_haired_person_tone4": "👱🏾", + "person_with_blond_hair_tone4": "👱🏾", + "blond_haired_person_tone5": "👱🏿", + "person_with_blond_hair_tone5": "👱🏿", + "blond_haired_man": "👱‍♂️", + "blond_haired_man_tone1": "👱🏻‍♂️", + "blond_haired_man_light_skin_tone": "👱🏻‍♂️", + "blond_haired_man_tone2": "👱🏼‍♂️", + "blond_haired_man_medium_light_skin_tone": "👱🏼‍♂️", + "blond_haired_man_tone3": "👱🏽‍♂️", + "blond_haired_man_medium_skin_tone": "👱🏽‍♂️", + "blond_haired_man_tone4": "👱🏾‍♂️", + "blond_haired_man_medium_dark_skin_tone": "👱🏾‍♂️", + "blond_haired_man_tone5": "👱🏿‍♂️", + "blond_haired_man_dark_skin_tone": "👱🏿‍♂️", + "person_white_hair": "🧑‍🦳", + "person_tone1_white_hair": "🧑🏻‍🦳", + "person_light_skin_tone_white_hair": "🧑🏻‍🦳", + "person_tone2_white_hair": "🧑🏼‍🦳", + "person_medium_light_skin_tone_white_hair": "🧑🏼‍🦳", + "person_tone3_white_hair": "🧑🏽‍🦳", + "person_medium_skin_tone_white_hair": "🧑🏽‍🦳", + "person_tone4_white_hair": "🧑🏾‍🦳", + "person_medium_dark_skin_tone_white_hair": "🧑🏾‍🦳", + "person_tone5_white_hair": "🧑🏿‍🦳", + "person_dark_skin_tone_white_hair": "🧑🏿‍🦳", + "woman_white_haired": "👩‍🦳", + "woman_white_haired_tone1": "👩🏻‍🦳", + "woman_white_haired_light_skin_tone": "👩🏻‍🦳", + "woman_white_haired_tone2": "👩🏼‍🦳", + "woman_white_haired_medium_light_skin_tone": "👩🏼‍🦳", + "woman_white_haired_tone3": "👩🏽‍🦳", + "woman_white_haired_medium_skin_tone": "👩🏽‍🦳", + "woman_white_haired_tone4": "👩🏾‍🦳", + "woman_white_haired_medium_dark_skin_tone": "👩🏾‍🦳", + "woman_white_haired_tone5": "👩🏿‍🦳", + "woman_white_haired_dark_skin_tone": "👩🏿‍🦳", + "man_white_haired": "👨‍🦳", + "man_white_haired_tone1": "👨🏻‍🦳", + "man_white_haired_light_skin_tone": "👨🏻‍🦳", + "man_white_haired_tone2": "👨🏼‍🦳", + "man_white_haired_medium_light_skin_tone": "👨🏼‍🦳", + "man_white_haired_tone3": "👨🏽‍🦳", + "man_white_haired_medium_skin_tone": "👨🏽‍🦳", + "man_white_haired_tone4": "👨🏾‍🦳", + "man_white_haired_medium_dark_skin_tone": "👨🏾‍🦳", + "man_white_haired_tone5": "👨🏿‍🦳", + "man_white_haired_dark_skin_tone": "👨🏿‍🦳", + "person_bald": "🧑‍🦲", + "person_tone1_bald": "🧑🏻‍🦲", + "person_light_skin_tone_bald": "🧑🏻‍🦲", + "person_tone2_bald": "🧑🏼‍🦲", + "person_medium_light_skin_tone_bald": "🧑🏼‍🦲", + "person_tone3_bald": "🧑🏽‍🦲", + "person_medium_skin_tone_bald": "🧑🏽‍🦲", + "person_tone4_bald": "🧑🏾‍🦲", + "person_medium_dark_skin_tone_bald": "🧑🏾‍🦲", + "person_tone5_bald": "🧑🏿‍🦲", + "person_dark_skin_tone_bald": "🧑🏿‍🦲", + "woman_bald": "👩‍🦲", + "woman_bald_tone1": "👩🏻‍🦲", + "woman_bald_light_skin_tone": "👩🏻‍🦲", + "woman_bald_tone2": "👩🏼‍🦲", + "woman_bald_medium_light_skin_tone": "👩🏼‍🦲", + "woman_bald_tone3": "👩🏽‍🦲", + "woman_bald_medium_skin_tone": "👩🏽‍🦲", + "woman_bald_tone4": "👩🏾‍🦲", + "woman_bald_medium_dark_skin_tone": "👩🏾‍🦲", + "woman_bald_tone5": "👩🏿‍🦲", + "woman_bald_dark_skin_tone": "👩🏿‍🦲", + "man_bald": "👨‍🦲", + "man_bald_tone1": "👨🏻‍🦲", + "man_bald_light_skin_tone": "👨🏻‍🦲", + "man_bald_tone2": "👨🏼‍🦲", + "man_bald_medium_light_skin_tone": "👨🏼‍🦲", + "man_bald_tone3": "👨🏽‍🦲", + "man_bald_medium_skin_tone": "👨🏽‍🦲", + "man_bald_tone4": "👨🏾‍🦲", + "man_bald_medium_dark_skin_tone": "👨🏾‍🦲", + "man_bald_tone5": "👨🏿‍🦲", + "man_bald_dark_skin_tone": "👨🏿‍🦲", + "bearded_person": "🧔", + "bearded_person_tone1": "🧔🏻", + "bearded_person_light_skin_tone": "🧔🏻", + "bearded_person_tone2": "🧔🏼", + "bearded_person_medium_light_skin_tone": "🧔🏼", + "bearded_person_tone3": "🧔🏽", + "bearded_person_medium_skin_tone": "🧔🏽", + "bearded_person_tone4": "🧔🏾", + "bearded_person_medium_dark_skin_tone": "🧔🏾", + "bearded_person_tone5": "🧔🏿", + "bearded_person_dark_skin_tone": "🧔🏿", + "older_woman": "👵", + "grandma": "👵", + "older_woman_tone1": "👵🏻", + "grandma_tone1": "👵🏻", + "older_woman_tone2": "👵🏼", + "grandma_tone2": "👵🏼", + "older_woman_tone3": "👵🏽", + "grandma_tone3": "👵🏽", + "older_woman_tone4": "👵🏾", + "grandma_tone4": "👵🏾", + "older_woman_tone5": "👵🏿", + "grandma_tone5": "👵🏿", + "older_adult": "🧓", + "older_adult_tone1": "🧓🏻", + "older_adult_light_skin_tone": "🧓🏻", + "older_adult_tone2": "🧓🏼", + "older_adult_medium_light_skin_tone": "🧓🏼", + "older_adult_tone3": "🧓🏽", + "older_adult_medium_skin_tone": "🧓🏽", + "older_adult_tone4": "🧓🏾", + "older_adult_medium_dark_skin_tone": "🧓🏾", + "older_adult_tone5": "🧓🏿", + "older_adult_dark_skin_tone": "🧓🏿", + "older_man": "👴", + "older_man_tone1": "👴🏻", + "older_man_tone2": "👴🏼", + "older_man_tone3": "👴🏽", + "older_man_tone4": "👴🏾", + "older_man_tone5": "👴🏿", + "man_with_chinese_cap": "👲", + "man_with_gua_pi_mao": "👲", + "man_with_chinese_cap_tone1": "👲🏻", + "man_with_gua_pi_mao_tone1": "👲🏻", + "man_with_chinese_cap_tone2": "👲🏼", + "man_with_gua_pi_mao_tone2": "👲🏼", + "man_with_chinese_cap_tone3": "👲🏽", + "man_with_gua_pi_mao_tone3": "👲🏽", + "man_with_chinese_cap_tone4": "👲🏾", + "man_with_gua_pi_mao_tone4": "👲🏾", + "man_with_chinese_cap_tone5": "👲🏿", + "man_with_gua_pi_mao_tone5": "👲🏿", + "person_wearing_turban": "👳", + "man_with_turban": "👳", + "person_wearing_turban_tone1": "👳🏻", + "man_with_turban_tone1": "👳🏻", + "person_wearing_turban_tone2": "👳🏼", + "man_with_turban_tone2": "👳🏼", + "person_wearing_turban_tone3": "👳🏽", + "man_with_turban_tone3": "👳🏽", + "person_wearing_turban_tone4": "👳🏾", + "man_with_turban_tone4": "👳🏾", + "person_wearing_turban_tone5": "👳🏿", + "man_with_turban_tone5": "👳🏿", + "woman_wearing_turban": "👳‍♀️", + "woman_wearing_turban_tone1": "👳🏻‍♀️", + "woman_wearing_turban_light_skin_tone": "👳🏻‍♀️", + "woman_wearing_turban_tone2": "👳🏼‍♀️", + "woman_wearing_turban_medium_light_skin_tone": "👳🏼‍♀️", + "woman_wearing_turban_tone3": "👳🏽‍♀️", + "woman_wearing_turban_medium_skin_tone": "👳🏽‍♀️", + "woman_wearing_turban_tone4": "👳🏾‍♀️", + "woman_wearing_turban_medium_dark_skin_tone": "👳🏾‍♀️", + "woman_wearing_turban_tone5": "👳🏿‍♀️", + "woman_wearing_turban_dark_skin_tone": "👳🏿‍♀️", + "man_wearing_turban": "👳‍♂️", + "man_wearing_turban_tone1": "👳🏻‍♂️", + "man_wearing_turban_light_skin_tone": "👳🏻‍♂️", + "man_wearing_turban_tone2": "👳🏼‍♂️", + "man_wearing_turban_medium_light_skin_tone": "👳🏼‍♂️", + "man_wearing_turban_tone3": "👳🏽‍♂️", + "man_wearing_turban_medium_skin_tone": "👳🏽‍♂️", + "man_wearing_turban_tone4": "👳🏾‍♂️", + "man_wearing_turban_medium_dark_skin_tone": "👳🏾‍♂️", + "man_wearing_turban_tone5": "👳🏿‍♂️", + "man_wearing_turban_dark_skin_tone": "👳🏿‍♂️", + "woman_with_headscarf": "🧕", + "woman_with_headscarf_tone1": "🧕🏻", + "woman_with_headscarf_light_skin_tone": "🧕🏻", + "woman_with_headscarf_tone2": "🧕🏼", + "woman_with_headscarf_medium_light_skin_tone": "🧕🏼", + "woman_with_headscarf_tone3": "🧕🏽", + "woman_with_headscarf_medium_skin_tone": "🧕🏽", + "woman_with_headscarf_tone4": "🧕🏾", + "woman_with_headscarf_medium_dark_skin_tone": "🧕🏾", + "woman_with_headscarf_tone5": "🧕🏿", + "woman_with_headscarf_dark_skin_tone": "🧕🏿", + "police_officer": "👮", + "cop": "👮", + "police_officer_tone1": "👮🏻", + "cop_tone1": "👮🏻", + "police_officer_tone2": "👮🏼", + "cop_tone2": "👮🏼", + "police_officer_tone3": "👮🏽", + "cop_tone3": "👮🏽", + "police_officer_tone4": "👮🏾", + "cop_tone4": "👮🏾", + "police_officer_tone5": "👮🏿", + "cop_tone5": "👮🏿", + "woman_police_officer": "👮‍♀️", + "woman_police_officer_tone1": "👮🏻‍♀️", + "woman_police_officer_light_skin_tone": "👮🏻‍♀️", + "woman_police_officer_tone2": "👮🏼‍♀️", + "woman_police_officer_medium_light_skin_tone": "👮🏼‍♀️", + "woman_police_officer_tone3": "👮🏽‍♀️", + "woman_police_officer_medium_skin_tone": "👮🏽‍♀️", + "woman_police_officer_tone4": "👮🏾‍♀️", + "woman_police_officer_medium_dark_skin_tone": "👮🏾‍♀️", + "woman_police_officer_tone5": "👮🏿‍♀️", + "woman_police_officer_dark_skin_tone": "👮🏿‍♀️", + "man_police_officer": "👮‍♂️", + "man_police_officer_tone1": "👮🏻‍♂️", + "man_police_officer_light_skin_tone": "👮🏻‍♂️", + "man_police_officer_tone2": "👮🏼‍♂️", + "man_police_officer_medium_light_skin_tone": "👮🏼‍♂️", + "man_police_officer_tone3": "👮🏽‍♂️", + "man_police_officer_medium_skin_tone": "👮🏽‍♂️", + "man_police_officer_tone4": "👮🏾‍♂️", + "man_police_officer_medium_dark_skin_tone": "👮🏾‍♂️", + "man_police_officer_tone5": "👮🏿‍♂️", + "man_police_officer_dark_skin_tone": "👮🏿‍♂️", + "construction_worker": "👷", + "construction_worker_tone1": "👷🏻", + "construction_worker_tone2": "👷🏼", + "construction_worker_tone3": "👷🏽", + "construction_worker_tone4": "👷🏾", + "construction_worker_tone5": "👷🏿", + "woman_construction_worker": "👷‍♀️", + "woman_construction_worker_tone1": "👷🏻‍♀️", + "woman_construction_worker_light_skin_tone": "👷🏻‍♀️", + "woman_construction_worker_tone2": "👷🏼‍♀️", + "woman_construction_worker_medium_light_skin_tone": "👷🏼‍♀️", + "woman_construction_worker_tone3": "👷🏽‍♀️", + "woman_construction_worker_medium_skin_tone": "👷🏽‍♀️", + "woman_construction_worker_tone4": "👷🏾‍♀️", + "woman_construction_worker_medium_dark_skin_tone": "👷🏾‍♀️", + "woman_construction_worker_tone5": "👷🏿‍♀️", + "woman_construction_worker_dark_skin_tone": "👷🏿‍♀️", + "man_construction_worker": "👷‍♂️", + "man_construction_worker_tone1": "👷🏻‍♂️", + "man_construction_worker_light_skin_tone": "👷🏻‍♂️", + "man_construction_worker_tone2": "👷🏼‍♂️", + "man_construction_worker_medium_light_skin_tone": "👷🏼‍♂️", + "man_construction_worker_tone3": "👷🏽‍♂️", + "man_construction_worker_medium_skin_tone": "👷🏽‍♂️", + "man_construction_worker_tone4": "👷🏾‍♂️", + "man_construction_worker_medium_dark_skin_tone": "👷🏾‍♂️", + "man_construction_worker_tone5": "👷🏿‍♂️", + "man_construction_worker_dark_skin_tone": "👷🏿‍♂️", + "guard": "💂", + "guardsman": "💂", + "guard_tone1": "💂🏻", + "guardsman_tone1": "💂🏻", + "guard_tone2": "💂🏼", + "guardsman_tone2": "💂🏼", + "guard_tone3": "💂🏽", + "guardsman_tone3": "💂🏽", + "guard_tone4": "💂🏾", + "guardsman_tone4": "💂🏾", + "guard_tone5": "💂🏿", + "guardsman_tone5": "💂🏿", + "woman_guard": "💂‍♀️", + "woman_guard_tone1": "💂🏻‍♀️", + "woman_guard_light_skin_tone": "💂🏻‍♀️", + "woman_guard_tone2": "💂🏼‍♀️", + "woman_guard_medium_light_skin_tone": "💂🏼‍♀️", + "woman_guard_tone3": "💂🏽‍♀️", + "woman_guard_medium_skin_tone": "💂🏽‍♀️", + "woman_guard_tone4": "💂🏾‍♀️", + "woman_guard_medium_dark_skin_tone": "💂🏾‍♀️", + "woman_guard_tone5": "💂🏿‍♀️", + "woman_guard_dark_skin_tone": "💂🏿‍♀️", + "man_guard": "💂‍♂️", + "man_guard_tone1": "💂🏻‍♂️", + "man_guard_light_skin_tone": "💂🏻‍♂️", + "man_guard_tone2": "💂🏼‍♂️", + "man_guard_medium_light_skin_tone": "💂🏼‍♂️", + "man_guard_tone3": "💂🏽‍♂️", + "man_guard_medium_skin_tone": "💂🏽‍♂️", + "man_guard_tone4": "💂🏾‍♂️", + "man_guard_medium_dark_skin_tone": "💂🏾‍♂️", + "man_guard_tone5": "💂🏿‍♂️", + "man_guard_dark_skin_tone": "💂🏿‍♂️", + "detective": "🕵️", + "spy": "🕵️", + "sleuth_or_spy": "🕵️", + "detective_tone1": "🕵🏻", + "spy_tone1": "🕵🏻", + "sleuth_or_spy_tone1": "🕵🏻", + "detective_tone2": "🕵🏼", + "spy_tone2": "🕵🏼", + "sleuth_or_spy_tone2": "🕵🏼", + "detective_tone3": "🕵🏽", + "spy_tone3": "🕵🏽", + "sleuth_or_spy_tone3": "🕵🏽", + "detective_tone4": "🕵🏾", + "spy_tone4": "🕵🏾", + "sleuth_or_spy_tone4": "🕵🏾", + "detective_tone5": "🕵🏿", + "spy_tone5": "🕵🏿", + "sleuth_or_spy_tone5": "🕵🏿", + "woman_detective": "🕵️‍♀️", + "woman_detective_tone1": "🕵🏻‍♀️", + "woman_detective_light_skin_tone": "🕵🏻‍♀️", + "woman_detective_tone2": "🕵🏼‍♀️", + "woman_detective_medium_light_skin_tone": "🕵🏼‍♀️", + "woman_detective_tone3": "🕵🏽‍♀️", + "woman_detective_medium_skin_tone": "🕵🏽‍♀️", + "woman_detective_tone4": "🕵🏾‍♀️", + "woman_detective_medium_dark_skin_tone": "🕵🏾‍♀️", + "woman_detective_tone5": "🕵🏿‍♀️", + "woman_detective_dark_skin_tone": "🕵🏿‍♀️", + "man_detective": "🕵️‍♂️", + "man_detective_tone1": "🕵🏻‍♂️", + "man_detective_light_skin_tone": "🕵🏻‍♂️", + "man_detective_tone2": "🕵🏼‍♂️", + "man_detective_medium_light_skin_tone": "🕵🏼‍♂️", + "man_detective_tone3": "🕵🏽‍♂️", + "man_detective_medium_skin_tone": "🕵🏽‍♂️", + "man_detective_tone4": "🕵🏾‍♂️", + "man_detective_medium_dark_skin_tone": "🕵🏾‍♂️", + "man_detective_tone5": "🕵🏿‍♂️", + "man_detective_dark_skin_tone": "🕵🏿‍♂️", + "health_worker": "🧑‍⚕️", + "health_worker_tone1": "🧑🏻‍⚕️", + "health_worker_light_skin_tone": "🧑🏻‍⚕️", + "health_worker_tone2": "🧑🏼‍⚕️", + "health_worker_medium_light_skin_tone": "🧑🏼‍⚕️", + "health_worker_tone3": "🧑🏽‍⚕️", + "health_worker_medium_skin_tone": "🧑🏽‍⚕️", + "health_worker_tone4": "🧑🏾‍⚕️", + "health_worker_medium_dark_skin_tone": "🧑🏾‍⚕️", + "health_worker_tone5": "🧑🏿‍⚕️", + "health_worker_dark_skin_tone": "🧑🏿‍⚕️", + "woman_health_worker": "👩‍⚕️", + "woman_health_worker_tone1": "👩🏻‍⚕️", + "woman_health_worker_light_skin_tone": "👩🏻‍⚕️", + "woman_health_worker_tone2": "👩🏼‍⚕️", + "woman_health_worker_medium_light_skin_tone": "👩🏼‍⚕️", + "woman_health_worker_tone3": "👩🏽‍⚕️", + "woman_health_worker_medium_skin_tone": "👩🏽‍⚕️", + "woman_health_worker_tone4": "👩🏾‍⚕️", + "woman_health_worker_medium_dark_skin_tone": "👩🏾‍⚕️", + "woman_health_worker_tone5": "👩🏿‍⚕️", + "woman_health_worker_dark_skin_tone": "👩🏿‍⚕️", + "man_health_worker": "👨‍⚕️", + "man_health_worker_tone1": "👨🏻‍⚕️", + "man_health_worker_light_skin_tone": "👨🏻‍⚕️", + "man_health_worker_tone2": "👨🏼‍⚕️", + "man_health_worker_medium_light_skin_tone": "👨🏼‍⚕️", + "man_health_worker_tone3": "👨🏽‍⚕️", + "man_health_worker_medium_skin_tone": "👨🏽‍⚕️", + "man_health_worker_tone4": "👨🏾‍⚕️", + "man_health_worker_medium_dark_skin_tone": "👨🏾‍⚕️", + "man_health_worker_tone5": "👨🏿‍⚕️", + "man_health_worker_dark_skin_tone": "👨🏿‍⚕️", + "farmer": "🧑‍🌾", + "farmer_tone1": "🧑🏻‍🌾", + "farmer_light_skin_tone": "🧑🏻‍🌾", + "farmer_tone2": "🧑🏼‍🌾", + "farmer_medium_light_skin_tone": "🧑🏼‍🌾", + "farmer_tone3": "🧑🏽‍🌾", + "farmer_medium_skin_tone": "🧑🏽‍🌾", + "farmer_tone4": "🧑🏾‍🌾", + "farmer_medium_dark_skin_tone": "🧑🏾‍🌾", + "farmer_tone5": "🧑🏿‍🌾", + "farmer_dark_skin_tone": "🧑🏿‍🌾", + "woman_farmer": "👩‍🌾", + "woman_farmer_tone1": "👩🏻‍🌾", + "woman_farmer_light_skin_tone": "👩🏻‍🌾", + "woman_farmer_tone2": "👩🏼‍🌾", + "woman_farmer_medium_light_skin_tone": "👩🏼‍🌾", + "woman_farmer_tone3": "👩🏽‍🌾", + "woman_farmer_medium_skin_tone": "👩🏽‍🌾", + "woman_farmer_tone4": "👩🏾‍🌾", + "woman_farmer_medium_dark_skin_tone": "👩🏾‍🌾", + "woman_farmer_tone5": "👩🏿‍🌾", + "woman_farmer_dark_skin_tone": "👩🏿‍🌾", + "man_farmer": "👨‍🌾", + "man_farmer_tone1": "👨🏻‍🌾", + "man_farmer_light_skin_tone": "👨🏻‍🌾", + "man_farmer_tone2": "👨🏼‍🌾", + "man_farmer_medium_light_skin_tone": "👨🏼‍🌾", + "man_farmer_tone3": "👨🏽‍🌾", + "man_farmer_medium_skin_tone": "👨🏽‍🌾", + "man_farmer_tone4": "👨🏾‍🌾", + "man_farmer_medium_dark_skin_tone": "👨🏾‍🌾", + "man_farmer_tone5": "👨🏿‍🌾", + "man_farmer_dark_skin_tone": "👨🏿‍🌾", + "cook": "🧑‍🍳", + "cook_tone1": "🧑🏻‍🍳", + "cook_light_skin_tone": "🧑🏻‍🍳", + "cook_tone2": "🧑🏼‍🍳", + "cook_medium_light_skin_tone": "🧑🏼‍🍳", + "cook_tone3": "🧑🏽‍🍳", + "cook_medium_skin_tone": "🧑🏽‍🍳", + "cook_tone4": "🧑🏾‍🍳", + "cook_medium_dark_skin_tone": "🧑🏾‍🍳", + "cook_tone5": "🧑🏿‍🍳", + "cook_dark_skin_tone": "🧑🏿‍🍳", + "woman_cook": "👩‍🍳", + "woman_cook_tone1": "👩🏻‍🍳", + "woman_cook_light_skin_tone": "👩🏻‍🍳", + "woman_cook_tone2": "👩🏼‍🍳", + "woman_cook_medium_light_skin_tone": "👩🏼‍🍳", + "woman_cook_tone3": "👩🏽‍🍳", + "woman_cook_medium_skin_tone": "👩🏽‍🍳", + "woman_cook_tone4": "👩🏾‍🍳", + "woman_cook_medium_dark_skin_tone": "👩🏾‍🍳", + "woman_cook_tone5": "👩🏿‍🍳", + "woman_cook_dark_skin_tone": "👩🏿‍🍳", + "man_cook": "👨‍🍳", + "man_cook_tone1": "👨🏻‍🍳", + "man_cook_light_skin_tone": "👨🏻‍🍳", + "man_cook_tone2": "👨🏼‍🍳", + "man_cook_medium_light_skin_tone": "👨🏼‍🍳", + "man_cook_tone3": "👨🏽‍🍳", + "man_cook_medium_skin_tone": "👨🏽‍🍳", + "man_cook_tone4": "👨🏾‍🍳", + "man_cook_medium_dark_skin_tone": "👨🏾‍🍳", + "man_cook_tone5": "👨🏿‍🍳", + "man_cook_dark_skin_tone": "👨🏿‍🍳", + "student": "🧑‍🎓", + "student_tone1": "🧑🏻‍🎓", + "student_light_skin_tone": "🧑🏻‍🎓", + "student_tone2": "🧑🏼‍🎓", + "student_medium_light_skin_tone": "🧑🏼‍🎓", + "student_tone3": "🧑🏽‍🎓", + "student_medium_skin_tone": "🧑🏽‍🎓", + "student_tone4": "🧑🏾‍🎓", + "student_medium_dark_skin_tone": "🧑🏾‍🎓", + "student_tone5": "🧑🏿‍🎓", + "student_dark_skin_tone": "🧑🏿‍🎓", + "woman_student": "👩‍🎓", + "woman_student_tone1": "👩🏻‍🎓", + "woman_student_light_skin_tone": "👩🏻‍🎓", + "woman_student_tone2": "👩🏼‍🎓", + "woman_student_medium_light_skin_tone": "👩🏼‍🎓", + "woman_student_tone3": "👩🏽‍🎓", + "woman_student_medium_skin_tone": "👩🏽‍🎓", + "woman_student_tone4": "👩🏾‍🎓", + "woman_student_medium_dark_skin_tone": "👩🏾‍🎓", + "woman_student_tone5": "👩🏿‍🎓", + "woman_student_dark_skin_tone": "👩🏿‍🎓", + "man_student": "👨‍🎓", + "man_student_tone1": "👨🏻‍🎓", + "man_student_light_skin_tone": "👨🏻‍🎓", + "man_student_tone2": "👨🏼‍🎓", + "man_student_medium_light_skin_tone": "👨🏼‍🎓", + "man_student_tone3": "👨🏽‍🎓", + "man_student_medium_skin_tone": "👨🏽‍🎓", + "man_student_tone4": "👨🏾‍🎓", + "man_student_medium_dark_skin_tone": "👨🏾‍🎓", + "man_student_tone5": "👨🏿‍🎓", + "man_student_dark_skin_tone": "👨🏿‍🎓", + "singer": "🧑‍🎤", + "singer_tone1": "🧑🏻‍🎤", + "singer_light_skin_tone": "🧑🏻‍🎤", + "singer_tone2": "🧑🏼‍🎤", + "singer_medium_light_skin_tone": "🧑🏼‍🎤", + "singer_tone3": "🧑🏽‍🎤", + "singer_medium_skin_tone": "🧑🏽‍🎤", + "singer_tone4": "🧑🏾‍🎤", + "singer_medium_dark_skin_tone": "🧑🏾‍🎤", + "singer_tone5": "🧑🏿‍🎤", + "singer_dark_skin_tone": "🧑🏿‍🎤", + "woman_singer": "👩‍🎤", + "woman_singer_tone1": "👩🏻‍🎤", + "woman_singer_light_skin_tone": "👩🏻‍🎤", + "woman_singer_tone2": "👩🏼‍🎤", + "woman_singer_medium_light_skin_tone": "👩🏼‍🎤", + "woman_singer_tone3": "👩🏽‍🎤", + "woman_singer_medium_skin_tone": "👩🏽‍🎤", + "woman_singer_tone4": "👩🏾‍🎤", + "woman_singer_medium_dark_skin_tone": "👩🏾‍🎤", + "woman_singer_tone5": "👩🏿‍🎤", + "woman_singer_dark_skin_tone": "👩🏿‍🎤", + "man_singer": "👨‍🎤", + "man_singer_tone1": "👨🏻‍🎤", + "man_singer_light_skin_tone": "👨🏻‍🎤", + "man_singer_tone2": "👨🏼‍🎤", + "man_singer_medium_light_skin_tone": "👨🏼‍🎤", + "man_singer_tone3": "👨🏽‍🎤", + "man_singer_medium_skin_tone": "👨🏽‍🎤", + "man_singer_tone4": "👨🏾‍🎤", + "man_singer_medium_dark_skin_tone": "👨🏾‍🎤", + "man_singer_tone5": "👨🏿‍🎤", + "man_singer_dark_skin_tone": "👨🏿‍🎤", + "teacher": "🧑‍🏫", + "teacher_tone1": "🧑🏻‍🏫", + "teacher_light_skin_tone": "🧑🏻‍🏫", + "teacher_tone2": "🧑🏼‍🏫", + "teacher_medium_light_skin_tone": "🧑🏼‍🏫", + "teacher_tone3": "🧑🏽‍🏫", + "teacher_medium_skin_tone": "🧑🏽‍🏫", + "teacher_tone4": "🧑🏾‍🏫", + "teacher_medium_dark_skin_tone": "🧑🏾‍🏫", + "teacher_tone5": "🧑🏿‍🏫", + "teacher_dark_skin_tone": "🧑🏿‍🏫", + "woman_teacher": "👩‍🏫", + "woman_teacher_tone1": "👩🏻‍🏫", + "woman_teacher_light_skin_tone": "👩🏻‍🏫", + "woman_teacher_tone2": "👩🏼‍🏫", + "woman_teacher_medium_light_skin_tone": "👩🏼‍🏫", + "woman_teacher_tone3": "👩🏽‍🏫", + "woman_teacher_medium_skin_tone": "👩🏽‍🏫", + "woman_teacher_tone4": "👩🏾‍🏫", + "woman_teacher_medium_dark_skin_tone": "👩🏾‍🏫", + "woman_teacher_tone5": "👩🏿‍🏫", + "woman_teacher_dark_skin_tone": "👩🏿‍🏫", + "man_teacher": "👨‍🏫", + "man_teacher_tone1": "👨🏻‍🏫", + "man_teacher_light_skin_tone": "👨🏻‍🏫", + "man_teacher_tone2": "👨🏼‍🏫", + "man_teacher_medium_light_skin_tone": "👨🏼‍🏫", + "man_teacher_tone3": "👨🏽‍🏫", + "man_teacher_medium_skin_tone": "👨🏽‍🏫", + "man_teacher_tone4": "👨🏾‍🏫", + "man_teacher_medium_dark_skin_tone": "👨🏾‍🏫", + "man_teacher_tone5": "👨🏿‍🏫", + "man_teacher_dark_skin_tone": "👨🏿‍🏫", + "factory_worker": "🧑‍🏭", + "factory_worker_tone1": "🧑🏻‍🏭", + "factory_worker_light_skin_tone": "🧑🏻‍🏭", + "factory_worker_tone2": "🧑🏼‍🏭", + "factory_worker_medium_light_skin_tone": "🧑🏼‍🏭", + "factory_worker_tone3": "🧑🏽‍🏭", + "factory_worker_medium_skin_tone": "🧑🏽‍🏭", + "factory_worker_tone4": "🧑🏾‍🏭", + "factory_worker_medium_dark_skin_tone": "🧑🏾‍🏭", + "factory_worker_tone5": "🧑🏿‍🏭", + "factory_worker_dark_skin_tone": "🧑🏿‍🏭", + "woman_factory_worker": "👩‍🏭", + "woman_factory_worker_tone1": "👩🏻‍🏭", + "woman_factory_worker_light_skin_tone": "👩🏻‍🏭", + "woman_factory_worker_tone2": "👩🏼‍🏭", + "woman_factory_worker_medium_light_skin_tone": "👩🏼‍🏭", + "woman_factory_worker_tone3": "👩🏽‍🏭", + "woman_factory_worker_medium_skin_tone": "👩🏽‍🏭", + "woman_factory_worker_tone4": "👩🏾‍🏭", + "woman_factory_worker_medium_dark_skin_tone": "👩🏾‍🏭", + "woman_factory_worker_tone5": "👩🏿‍🏭", + "woman_factory_worker_dark_skin_tone": "👩🏿‍🏭", + "man_factory_worker": "👨‍🏭", + "man_factory_worker_tone1": "👨🏻‍🏭", + "man_factory_worker_light_skin_tone": "👨🏻‍🏭", + "man_factory_worker_tone2": "👨🏼‍🏭", + "man_factory_worker_medium_light_skin_tone": "👨🏼‍🏭", + "man_factory_worker_tone3": "👨🏽‍🏭", + "man_factory_worker_medium_skin_tone": "👨🏽‍🏭", + "man_factory_worker_tone4": "👨🏾‍🏭", + "man_factory_worker_medium_dark_skin_tone": "👨🏾‍🏭", + "man_factory_worker_tone5": "👨🏿‍🏭", + "man_factory_worker_dark_skin_tone": "👨🏿‍🏭", + "technologist": "🧑‍💻", + "technologist_tone1": "🧑🏻‍💻", + "technologist_light_skin_tone": "🧑🏻‍💻", + "technologist_tone2": "🧑🏼‍💻", + "technologist_medium_light_skin_tone": "🧑🏼‍💻", + "technologist_tone3": "🧑🏽‍💻", + "technologist_medium_skin_tone": "🧑🏽‍💻", + "technologist_tone4": "🧑🏾‍💻", + "technologist_medium_dark_skin_tone": "🧑🏾‍💻", + "technologist_tone5": "🧑🏿‍💻", + "technologist_dark_skin_tone": "🧑🏿‍💻", + "woman_technologist": "👩‍💻", + "woman_technologist_tone1": "👩🏻‍💻", + "woman_technologist_light_skin_tone": "👩🏻‍💻", + "woman_technologist_tone2": "👩🏼‍💻", + "woman_technologist_medium_light_skin_tone": "👩🏼‍💻", + "woman_technologist_tone3": "👩🏽‍💻", + "woman_technologist_medium_skin_tone": "👩🏽‍💻", + "woman_technologist_tone4": "👩🏾‍💻", + "woman_technologist_medium_dark_skin_tone": "👩🏾‍💻", + "woman_technologist_tone5": "👩🏿‍💻", + "woman_technologist_dark_skin_tone": "👩🏿‍💻", + "man_technologist": "👨‍💻", + "man_technologist_tone1": "👨🏻‍💻", + "man_technologist_light_skin_tone": "👨🏻‍💻", + "man_technologist_tone2": "👨🏼‍💻", + "man_technologist_medium_light_skin_tone": "👨🏼‍💻", + "man_technologist_tone3": "👨🏽‍💻", + "man_technologist_medium_skin_tone": "👨🏽‍💻", + "man_technologist_tone4": "👨🏾‍💻", + "man_technologist_medium_dark_skin_tone": "👨🏾‍💻", + "man_technologist_tone5": "👨🏿‍💻", + "man_technologist_dark_skin_tone": "👨🏿‍💻", + "office_worker": "🧑‍💼", + "office_worker_tone1": "🧑🏻‍💼", + "office_worker_light_skin_tone": "🧑🏻‍💼", + "office_worker_tone2": "🧑🏼‍💼", + "office_worker_medium_light_skin_tone": "🧑🏼‍💼", + "office_worker_tone3": "🧑🏽‍💼", + "office_worker_medium_skin_tone": "🧑🏽‍💼", + "office_worker_tone4": "🧑🏾‍💼", + "office_worker_medium_dark_skin_tone": "🧑🏾‍💼", + "office_worker_tone5": "🧑🏿‍💼", + "office_worker_dark_skin_tone": "🧑🏿‍💼", + "woman_office_worker": "👩‍💼", + "woman_office_worker_tone1": "👩🏻‍💼", + "woman_office_worker_light_skin_tone": "👩🏻‍💼", + "woman_office_worker_tone2": "👩🏼‍💼", + "woman_office_worker_medium_light_skin_tone": "👩🏼‍💼", + "woman_office_worker_tone3": "👩🏽‍💼", + "woman_office_worker_medium_skin_tone": "👩🏽‍💼", + "woman_office_worker_tone4": "👩🏾‍💼", + "woman_office_worker_medium_dark_skin_tone": "👩🏾‍💼", + "woman_office_worker_tone5": "👩🏿‍💼", + "woman_office_worker_dark_skin_tone": "👩🏿‍💼", + "man_office_worker": "👨‍💼", + "man_office_worker_tone1": "👨🏻‍💼", + "man_office_worker_light_skin_tone": "👨🏻‍💼", + "man_office_worker_tone2": "👨🏼‍💼", + "man_office_worker_medium_light_skin_tone": "👨🏼‍💼", + "man_office_worker_tone3": "👨🏽‍💼", + "man_office_worker_medium_skin_tone": "👨🏽‍💼", + "man_office_worker_tone4": "👨🏾‍💼", + "man_office_worker_medium_dark_skin_tone": "👨🏾‍💼", + "man_office_worker_tone5": "👨🏿‍💼", + "man_office_worker_dark_skin_tone": "👨🏿‍💼", + "mechanic": "🧑‍🔧", + "mechanic_tone1": "🧑🏻‍🔧", + "mechanic_light_skin_tone": "🧑🏻‍🔧", + "mechanic_tone2": "🧑🏼‍🔧", + "mechanic_medium_light_skin_tone": "🧑🏼‍🔧", + "mechanic_tone3": "🧑🏽‍🔧", + "mechanic_medium_skin_tone": "🧑🏽‍🔧", + "mechanic_tone4": "🧑🏾‍🔧", + "mechanic_medium_dark_skin_tone": "🧑🏾‍🔧", + "mechanic_tone5": "🧑🏿‍🔧", + "mechanic_dark_skin_tone": "🧑🏿‍🔧", + "woman_mechanic": "👩‍🔧", + "woman_mechanic_tone1": "👩🏻‍🔧", + "woman_mechanic_light_skin_tone": "👩🏻‍🔧", + "woman_mechanic_tone2": "👩🏼‍🔧", + "woman_mechanic_medium_light_skin_tone": "👩🏼‍🔧", + "woman_mechanic_tone3": "👩🏽‍🔧", + "woman_mechanic_medium_skin_tone": "👩🏽‍🔧", + "woman_mechanic_tone4": "👩🏾‍🔧", + "woman_mechanic_medium_dark_skin_tone": "👩🏾‍🔧", + "woman_mechanic_tone5": "👩🏿‍🔧", + "woman_mechanic_dark_skin_tone": "👩🏿‍🔧", + "man_mechanic": "👨‍🔧", + "man_mechanic_tone1": "👨🏻‍🔧", + "man_mechanic_light_skin_tone": "👨🏻‍🔧", + "man_mechanic_tone2": "👨🏼‍🔧", + "man_mechanic_medium_light_skin_tone": "👨🏼‍🔧", + "man_mechanic_tone3": "👨🏽‍🔧", + "man_mechanic_medium_skin_tone": "👨🏽‍🔧", + "man_mechanic_tone4": "👨🏾‍🔧", + "man_mechanic_medium_dark_skin_tone": "👨🏾‍🔧", + "man_mechanic_tone5": "👨🏿‍🔧", + "man_mechanic_dark_skin_tone": "👨🏿‍🔧", + "scientist": "🧑‍🔬", + "scientist_tone1": "🧑🏻‍🔬", + "scientist_light_skin_tone": "🧑🏻‍🔬", + "scientist_tone2": "🧑🏼‍🔬", + "scientist_medium_light_skin_tone": "🧑🏼‍🔬", + "scientist_tone3": "🧑🏽‍🔬", + "scientist_medium_skin_tone": "🧑🏽‍🔬", + "scientist_tone4": "🧑🏾‍🔬", + "scientist_medium_dark_skin_tone": "🧑🏾‍🔬", + "scientist_tone5": "🧑🏿‍🔬", + "scientist_dark_skin_tone": "🧑🏿‍🔬", + "woman_scientist": "👩‍🔬", + "woman_scientist_tone1": "👩🏻‍🔬", + "woman_scientist_light_skin_tone": "👩🏻‍🔬", + "woman_scientist_tone2": "👩🏼‍🔬", + "woman_scientist_medium_light_skin_tone": "👩🏼‍🔬", + "woman_scientist_tone3": "👩🏽‍🔬", + "woman_scientist_medium_skin_tone": "👩🏽‍🔬", + "woman_scientist_tone4": "👩🏾‍🔬", + "woman_scientist_medium_dark_skin_tone": "👩🏾‍🔬", + "woman_scientist_tone5": "👩🏿‍🔬", + "woman_scientist_dark_skin_tone": "👩🏿‍🔬", + "man_scientist": "👨‍🔬", + "man_scientist_tone1": "👨🏻‍🔬", + "man_scientist_light_skin_tone": "👨🏻‍🔬", + "man_scientist_tone2": "👨🏼‍🔬", + "man_scientist_medium_light_skin_tone": "👨🏼‍🔬", + "man_scientist_tone3": "👨🏽‍🔬", + "man_scientist_medium_skin_tone": "👨🏽‍🔬", + "man_scientist_tone4": "👨🏾‍🔬", + "man_scientist_medium_dark_skin_tone": "👨🏾‍🔬", + "man_scientist_tone5": "👨🏿‍🔬", + "man_scientist_dark_skin_tone": "👨🏿‍🔬", + "artist": "🧑‍🎨", + "artist_tone1": "🧑🏻‍🎨", + "artist_light_skin_tone": "🧑🏻‍🎨", + "artist_tone2": "🧑🏼‍🎨", + "artist_medium_light_skin_tone": "🧑🏼‍🎨", + "artist_tone3": "🧑🏽‍🎨", + "artist_medium_skin_tone": "🧑🏽‍🎨", + "artist_tone4": "🧑🏾‍🎨", + "artist_medium_dark_skin_tone": "🧑🏾‍🎨", + "artist_tone5": "🧑🏿‍🎨", + "artist_dark_skin_tone": "🧑🏿‍🎨", + "woman_artist": "👩‍🎨", + "woman_artist_tone1": "👩🏻‍🎨", + "woman_artist_light_skin_tone": "👩🏻‍🎨", + "woman_artist_tone2": "👩🏼‍🎨", + "woman_artist_medium_light_skin_tone": "👩🏼‍🎨", + "woman_artist_tone3": "👩🏽‍🎨", + "woman_artist_medium_skin_tone": "👩🏽‍🎨", + "woman_artist_tone4": "👩🏾‍🎨", + "woman_artist_medium_dark_skin_tone": "👩🏾‍🎨", + "woman_artist_tone5": "👩🏿‍🎨", + "woman_artist_dark_skin_tone": "👩🏿‍🎨", + "man_artist": "👨‍🎨", + "man_artist_tone1": "👨🏻‍🎨", + "man_artist_light_skin_tone": "👨🏻‍🎨", + "man_artist_tone2": "👨🏼‍🎨", + "man_artist_medium_light_skin_tone": "👨🏼‍🎨", + "man_artist_tone3": "👨🏽‍🎨", + "man_artist_medium_skin_tone": "👨🏽‍🎨", + "man_artist_tone4": "👨🏾‍🎨", + "man_artist_medium_dark_skin_tone": "👨🏾‍🎨", + "man_artist_tone5": "👨🏿‍🎨", + "man_artist_dark_skin_tone": "👨🏿‍🎨", + "firefighter": "🧑‍🚒", + "firefighter_tone1": "🧑🏻‍🚒", + "firefighter_light_skin_tone": "🧑🏻‍🚒", + "firefighter_tone2": "🧑🏼‍🚒", + "firefighter_medium_light_skin_tone": "🧑🏼‍🚒", + "firefighter_tone3": "🧑🏽‍🚒", + "firefighter_medium_skin_tone": "🧑🏽‍🚒", + "firefighter_tone4": "🧑🏾‍🚒", + "firefighter_medium_dark_skin_tone": "🧑🏾‍🚒", + "firefighter_tone5": "🧑🏿‍🚒", + "firefighter_dark_skin_tone": "🧑🏿‍🚒", + "woman_firefighter": "👩‍🚒", + "woman_firefighter_tone1": "👩🏻‍🚒", + "woman_firefighter_light_skin_tone": "👩🏻‍🚒", + "woman_firefighter_tone2": "👩🏼‍🚒", + "woman_firefighter_medium_light_skin_tone": "👩🏼‍🚒", + "woman_firefighter_tone3": "👩🏽‍🚒", + "woman_firefighter_medium_skin_tone": "👩🏽‍🚒", + "woman_firefighter_tone4": "👩🏾‍🚒", + "woman_firefighter_medium_dark_skin_tone": "👩🏾‍🚒", + "woman_firefighter_tone5": "👩🏿‍🚒", + "woman_firefighter_dark_skin_tone": "👩🏿‍🚒", + "man_firefighter": "👨‍🚒", + "man_firefighter_tone1": "👨🏻‍🚒", + "man_firefighter_light_skin_tone": "👨🏻‍🚒", + "man_firefighter_tone2": "👨🏼‍🚒", + "man_firefighter_medium_light_skin_tone": "👨🏼‍🚒", + "man_firefighter_tone3": "👨🏽‍🚒", + "man_firefighter_medium_skin_tone": "👨🏽‍🚒", + "man_firefighter_tone4": "👨🏾‍🚒", + "man_firefighter_medium_dark_skin_tone": "👨🏾‍🚒", + "man_firefighter_tone5": "👨🏿‍🚒", + "man_firefighter_dark_skin_tone": "👨🏿‍🚒", + "pilot": "🧑‍✈️", + "pilot_tone1": "🧑🏻‍✈️", + "pilot_light_skin_tone": "🧑🏻‍✈️", + "pilot_tone2": "🧑🏼‍✈️", + "pilot_medium_light_skin_tone": "🧑🏼‍✈️", + "pilot_tone3": "🧑🏽‍✈️", + "pilot_medium_skin_tone": "🧑🏽‍✈️", + "pilot_tone4": "🧑🏾‍✈️", + "pilot_medium_dark_skin_tone": "🧑🏾‍✈️", + "pilot_tone5": "🧑🏿‍✈️", + "pilot_dark_skin_tone": "🧑🏿‍✈️", + "woman_pilot": "👩‍✈️", + "woman_pilot_tone1": "👩🏻‍✈️", + "woman_pilot_light_skin_tone": "👩🏻‍✈️", + "woman_pilot_tone2": "👩🏼‍✈️", + "woman_pilot_medium_light_skin_tone": "👩🏼‍✈️", + "woman_pilot_tone3": "👩🏽‍✈️", + "woman_pilot_medium_skin_tone": "👩🏽‍✈️", + "woman_pilot_tone4": "👩🏾‍✈️", + "woman_pilot_medium_dark_skin_tone": "👩🏾‍✈️", + "woman_pilot_tone5": "👩🏿‍✈️", + "woman_pilot_dark_skin_tone": "👩🏿‍✈️", + "man_pilot": "👨‍✈️", + "man_pilot_tone1": "👨🏻‍✈️", + "man_pilot_light_skin_tone": "👨🏻‍✈️", + "man_pilot_tone2": "👨🏼‍✈️", + "man_pilot_medium_light_skin_tone": "👨🏼‍✈️", + "man_pilot_tone3": "👨🏽‍✈️", + "man_pilot_medium_skin_tone": "👨🏽‍✈️", + "man_pilot_tone4": "👨🏾‍✈️", + "man_pilot_medium_dark_skin_tone": "👨🏾‍✈️", + "man_pilot_tone5": "👨🏿‍✈️", + "man_pilot_dark_skin_tone": "👨🏿‍✈️", + "astronaut": "🧑‍🚀", + "astronaut_tone1": "🧑🏻‍🚀", + "astronaut_light_skin_tone": "🧑🏻‍🚀", + "astronaut_tone2": "🧑🏼‍🚀", + "astronaut_medium_light_skin_tone": "🧑🏼‍🚀", + "astronaut_tone3": "🧑🏽‍🚀", + "astronaut_medium_skin_tone": "🧑🏽‍🚀", + "astronaut_tone4": "🧑🏾‍🚀", + "astronaut_medium_dark_skin_tone": "🧑🏾‍🚀", + "astronaut_tone5": "🧑🏿‍🚀", + "astronaut_dark_skin_tone": "🧑🏿‍🚀", + "woman_astronaut": "👩‍🚀", + "woman_astronaut_tone1": "👩🏻‍🚀", + "woman_astronaut_light_skin_tone": "👩🏻‍🚀", + "woman_astronaut_tone2": "👩🏼‍🚀", + "woman_astronaut_medium_light_skin_tone": "👩🏼‍🚀", + "woman_astronaut_tone3": "👩🏽‍🚀", + "woman_astronaut_medium_skin_tone": "👩🏽‍🚀", + "woman_astronaut_tone4": "👩🏾‍🚀", + "woman_astronaut_medium_dark_skin_tone": "👩🏾‍🚀", + "woman_astronaut_tone5": "👩🏿‍🚀", + "woman_astronaut_dark_skin_tone": "👩🏿‍🚀", + "man_astronaut": "👨‍🚀", + "man_astronaut_tone1": "👨🏻‍🚀", + "man_astronaut_light_skin_tone": "👨🏻‍🚀", + "man_astronaut_tone2": "👨🏼‍🚀", + "man_astronaut_medium_light_skin_tone": "👨🏼‍🚀", + "man_astronaut_tone3": "👨🏽‍🚀", + "man_astronaut_medium_skin_tone": "👨🏽‍🚀", + "man_astronaut_tone4": "👨🏾‍🚀", + "man_astronaut_medium_dark_skin_tone": "👨🏾‍🚀", + "man_astronaut_tone5": "👨🏿‍🚀", + "man_astronaut_dark_skin_tone": "👨🏿‍🚀", + "judge": "🧑‍⚖️", + "judge_tone1": "🧑🏻‍⚖️", + "judge_light_skin_tone": "🧑🏻‍⚖️", + "judge_tone2": "🧑🏼‍⚖️", + "judge_medium_light_skin_tone": "🧑🏼‍⚖️", + "judge_tone3": "🧑🏽‍⚖️", + "judge_medium_skin_tone": "🧑🏽‍⚖️", + "judge_tone4": "🧑🏾‍⚖️", + "judge_medium_dark_skin_tone": "🧑🏾‍⚖️", + "judge_tone5": "🧑🏿‍⚖️", + "judge_dark_skin_tone": "🧑🏿‍⚖️", + "woman_judge": "👩‍⚖️", + "woman_judge_tone1": "👩🏻‍⚖️", + "woman_judge_light_skin_tone": "👩🏻‍⚖️", + "woman_judge_tone2": "👩🏼‍⚖️", + "woman_judge_medium_light_skin_tone": "👩🏼‍⚖️", + "woman_judge_tone3": "👩🏽‍⚖️", + "woman_judge_medium_skin_tone": "👩🏽‍⚖️", + "woman_judge_tone4": "👩🏾‍⚖️", + "woman_judge_medium_dark_skin_tone": "👩🏾‍⚖️", + "woman_judge_tone5": "👩🏿‍⚖️", + "woman_judge_dark_skin_tone": "👩🏿‍⚖️", + "man_judge": "👨‍⚖️", + "man_judge_tone1": "👨🏻‍⚖️", + "man_judge_light_skin_tone": "👨🏻‍⚖️", + "man_judge_tone2": "👨🏼‍⚖️", + "man_judge_medium_light_skin_tone": "👨🏼‍⚖️", + "man_judge_tone3": "👨🏽‍⚖️", + "man_judge_medium_skin_tone": "👨🏽‍⚖️", + "man_judge_tone4": "👨🏾‍⚖️", + "man_judge_medium_dark_skin_tone": "👨🏾‍⚖️", + "man_judge_tone5": "👨🏿‍⚖️", + "man_judge_dark_skin_tone": "👨🏿‍⚖️", + "person_with_veil": "👰", + "person_with_veil_tone1": "👰🏻", + "person_with_veil_tone2": "👰🏼", + "person_with_veil_tone3": "👰🏽", + "person_with_veil_tone4": "👰🏾", + "person_with_veil_tone5": "👰🏿", + "woman_with_veil": "👰‍♀️", + "bride_with_veil": "👰‍♀️", + "woman_with_veil_tone1": "👰🏻‍♀️", + "woman_with_veil_light_skin_tone": "👰🏻‍♀️", + "woman_with_veil_tone2": "👰🏼‍♀️", + "woman_with_veil_medium_light_skin_tone": "👰🏼‍♀️", + "woman_with_veil_tone3": "👰🏽‍♀️", + "woman_with_veil_medium_skin_tone": "👰🏽‍♀️", + "woman_with_veil_tone4": "👰🏾‍♀️", + "woman_with_veil_medium_dark_skin_tone": "👰🏾‍♀️", + "woman_with_veil_tone5": "👰🏿‍♀️", + "woman_with_veil_dark_skin_tone": "👰🏿‍♀️", + "man_with_veil": "👰‍♂️", + "man_with_veil_tone1": "👰🏻‍♂️", + "man_with_veil_light_skin_tone": "👰🏻‍♂️", + "man_with_veil_tone2": "👰🏼‍♂️", + "man_with_veil_medium_light_skin_tone": "👰🏼‍♂️", + "man_with_veil_tone3": "👰🏽‍♂️", + "man_with_veil_medium_skin_tone": "👰🏽‍♂️", + "man_with_veil_tone4": "👰🏾‍♂️", + "man_with_veil_medium_dark_skin_tone": "👰🏾‍♂️", + "man_with_veil_tone5": "👰🏿‍♂️", + "man_with_veil_dark_skin_tone": "👰🏿‍♂️", + "person_in_tuxedo": "🤵", + "person_in_tuxedo_tone1": "🤵🏻", + "tuxedo_tone1": "🤵🏻", + "person_in_tuxedo_tone2": "🤵🏼", + "tuxedo_tone2": "🤵🏼", + "person_in_tuxedo_tone3": "🤵🏽", + "tuxedo_tone3": "🤵🏽", + "person_in_tuxedo_tone4": "🤵🏾", + "tuxedo_tone4": "🤵🏾", + "person_in_tuxedo_tone5": "🤵🏿", + "tuxedo_tone5": "🤵🏿", + "woman_in_tuxedo": "🤵‍♀️", + "woman_in_tuxedo_tone1": "🤵🏻‍♀️", + "woman_in_tuxedo_light_skin_tone": "🤵🏻‍♀️", + "woman_in_tuxedo_tone2": "🤵🏼‍♀️", + "woman_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♀️", + "woman_in_tuxedo_tone3": "🤵🏽‍♀️", + "woman_in_tuxedo_medium_skin_tone": "🤵🏽‍♀️", + "woman_in_tuxedo_tone4": "🤵🏾‍♀️", + "woman_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♀️", + "woman_in_tuxedo_tone5": "🤵🏿‍♀️", + "woman_in_tuxedo_dark_skin_tone": "🤵🏿‍♀️", + "man_in_tuxedo": "🤵‍♂️", + "man_in_tuxedo_tone1": "🤵🏻‍♂️", + "man_in_tuxedo_light_skin_tone": "🤵🏻‍♂️", + "man_in_tuxedo_tone2": "🤵🏼‍♂️", + "man_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♂️", + "man_in_tuxedo_tone3": "🤵🏽‍♂️", + "man_in_tuxedo_medium_skin_tone": "🤵🏽‍♂️", + "man_in_tuxedo_tone4": "🤵🏾‍♂️", + "man_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♂️", + "man_in_tuxedo_tone5": "🤵🏿‍♂️", + "man_in_tuxedo_dark_skin_tone": "🤵🏿‍♂️", + "princess": "👸", + "princess_tone1": "👸🏻", + "princess_tone2": "👸🏼", + "princess_tone3": "👸🏽", + "princess_tone4": "👸🏾", + "princess_tone5": "👸🏿", + "prince": "🤴", + "prince_tone1": "🤴🏻", + "prince_tone2": "🤴🏼", + "prince_tone3": "🤴🏽", + "prince_tone4": "🤴🏾", + "prince_tone5": "🤴🏿", + "superhero": "🦸", + "superhero_tone1": "🦸🏻", + "superhero_light_skin_tone": "🦸🏻", + "superhero_tone2": "🦸🏼", + "superhero_medium_light_skin_tone": "🦸🏼", + "superhero_tone3": "🦸🏽", + "superhero_medium_skin_tone": "🦸🏽", + "superhero_tone4": "🦸🏾", + "superhero_medium_dark_skin_tone": "🦸🏾", + "superhero_tone5": "🦸🏿", + "superhero_dark_skin_tone": "🦸🏿", + "woman_superhero": "🦸‍♀️", + "woman_superhero_tone1": "🦸🏻‍♀️", + "woman_superhero_light_skin_tone": "🦸🏻‍♀️", + "woman_superhero_tone2": "🦸🏼‍♀️", + "woman_superhero_medium_light_skin_tone": "🦸🏼‍♀️", + "woman_superhero_tone3": "🦸🏽‍♀️", + "woman_superhero_medium_skin_tone": "🦸🏽‍♀️", + "woman_superhero_tone4": "🦸🏾‍♀️", + "woman_superhero_medium_dark_skin_tone": "🦸🏾‍♀️", + "woman_superhero_tone5": "🦸🏿‍♀️", + "woman_superhero_dark_skin_tone": "🦸🏿‍♀️", + "man_superhero": "🦸‍♂️", + "man_superhero_tone1": "🦸🏻‍♂️", + "man_superhero_light_skin_tone": "🦸🏻‍♂️", + "man_superhero_tone2": "🦸🏼‍♂️", + "man_superhero_medium_light_skin_tone": "🦸🏼‍♂️", + "man_superhero_tone3": "🦸🏽‍♂️", + "man_superhero_medium_skin_tone": "🦸🏽‍♂️", + "man_superhero_tone4": "🦸🏾‍♂️", + "man_superhero_medium_dark_skin_tone": "🦸🏾‍♂️", + "man_superhero_tone5": "🦸🏿‍♂️", + "man_superhero_dark_skin_tone": "🦸🏿‍♂️", + "supervillain": "🦹", + "supervillain_tone1": "🦹🏻", + "supervillain_light_skin_tone": "🦹🏻", + "supervillain_tone2": "🦹🏼", + "supervillain_medium_light_skin_tone": "🦹🏼", + "supervillain_tone3": "🦹🏽", + "supervillain_medium_skin_tone": "🦹🏽", + "supervillain_tone4": "🦹🏾", + "supervillain_medium_dark_skin_tone": "🦹🏾", + "supervillain_tone5": "🦹🏿", + "supervillain_dark_skin_tone": "🦹🏿", + "woman_supervillain": "🦹‍♀️", + "woman_supervillain_tone1": "🦹🏻‍♀️", + "woman_supervillain_light_skin_tone": "🦹🏻‍♀️", + "woman_supervillain_tone2": "🦹🏼‍♀️", + "woman_supervillain_medium_light_skin_tone": "🦹🏼‍♀️", + "woman_supervillain_tone3": "🦹🏽‍♀️", + "woman_supervillain_medium_skin_tone": "🦹🏽‍♀️", + "woman_supervillain_tone4": "🦹🏾‍♀️", + "woman_supervillain_medium_dark_skin_tone": "🦹🏾‍♀️", + "woman_supervillain_tone5": "🦹🏿‍♀️", + "woman_supervillain_dark_skin_tone": "🦹🏿‍♀️", + "man_supervillain": "🦹‍♂️", + "man_supervillain_tone1": "🦹🏻‍♂️", + "man_supervillain_light_skin_tone": "🦹🏻‍♂️", + "man_supervillain_tone2": "🦹🏼‍♂️", + "man_supervillain_medium_light_skin_tone": "🦹🏼‍♂️", + "man_supervillain_tone3": "🦹🏽‍♂️", + "man_supervillain_medium_skin_tone": "🦹🏽‍♂️", + "man_supervillain_tone4": "🦹🏾‍♂️", + "man_supervillain_medium_dark_skin_tone": "🦹🏾‍♂️", + "man_supervillain_tone5": "🦹🏿‍♂️", + "man_supervillain_dark_skin_tone": "🦹🏿‍♂️", + "ninja": "🥷", + "ninja_tone1": "🥷🏻", + "ninja_light_skin_tone": "🥷🏻", + "ninja_tone2": "🥷🏼", + "ninja_medium_light_skin_tone": "🥷🏼", + "ninja_tone3": "🥷🏽", + "ninja_medium_skin_tone": "🥷🏽", + "ninja_tone4": "🥷🏾", + "ninja_medium_dark_skin_tone": "🥷🏾", + "ninja_tone5": "🥷🏿", + "ninja_dark_skin_tone": "🥷🏿", + "mx_claus": "🧑‍🎄", + "mx_claus_tone1": "🧑🏻‍🎄", + "mx_claus_light_skin_tone": "🧑🏻‍🎄", + "mx_claus_tone2": "🧑🏼‍🎄", + "mx_claus_medium_light_skin_tone": "🧑🏼‍🎄", + "mx_claus_tone3": "🧑🏽‍🎄", + "mx_claus_medium_skin_tone": "🧑🏽‍🎄", + "mx_claus_tone4": "🧑🏾‍🎄", + "mx_claus_medium_dark_skin_tone": "🧑🏾‍🎄", + "mx_claus_tone5": "🧑🏿‍🎄", + "mx_claus_dark_skin_tone": "🧑🏿‍🎄", + "mrs_claus": "🤶", + "mother_christmas": "🤶", + "mrs_claus_tone1": "🤶🏻", + "mother_christmas_tone1": "🤶🏻", + "mrs_claus_tone2": "🤶🏼", + "mother_christmas_tone2": "🤶🏼", + "mrs_claus_tone3": "🤶🏽", + "mother_christmas_tone3": "🤶🏽", + "mrs_claus_tone4": "🤶🏾", + "mother_christmas_tone4": "🤶🏾", + "mrs_claus_tone5": "🤶🏿", + "mother_christmas_tone5": "🤶🏿", + "santa": "🎅", + "santa_tone1": "🎅🏻", + "santa_tone2": "🎅🏼", + "santa_tone3": "🎅🏽", + "santa_tone4": "🎅🏾", + "santa_tone5": "🎅🏿", + "mage": "🧙", + "mage_tone1": "🧙🏻", + "mage_light_skin_tone": "🧙🏻", + "mage_tone2": "🧙🏼", + "mage_medium_light_skin_tone": "🧙🏼", + "mage_tone3": "🧙🏽", + "mage_medium_skin_tone": "🧙🏽", + "mage_tone4": "🧙🏾", + "mage_medium_dark_skin_tone": "🧙🏾", + "mage_tone5": "🧙🏿", + "mage_dark_skin_tone": "🧙🏿", + "woman_mage": "🧙‍♀️", + "woman_mage_tone1": "🧙🏻‍♀️", + "woman_mage_light_skin_tone": "🧙🏻‍♀️", + "woman_mage_tone2": "🧙🏼‍♀️", + "woman_mage_medium_light_skin_tone": "🧙🏼‍♀️", + "woman_mage_tone3": "🧙🏽‍♀️", + "woman_mage_medium_skin_tone": "🧙🏽‍♀️", + "woman_mage_tone4": "🧙🏾‍♀️", + "woman_mage_medium_dark_skin_tone": "🧙🏾‍♀️", + "woman_mage_tone5": "🧙🏿‍♀️", + "woman_mage_dark_skin_tone": "🧙🏿‍♀️", + "man_mage": "🧙‍♂️", + "man_mage_tone1": "🧙🏻‍♂️", + "man_mage_light_skin_tone": "🧙🏻‍♂️", + "man_mage_tone2": "🧙🏼‍♂️", + "man_mage_medium_light_skin_tone": "🧙🏼‍♂️", + "man_mage_tone3": "🧙🏽‍♂️", + "man_mage_medium_skin_tone": "🧙🏽‍♂️", + "man_mage_tone4": "🧙🏾‍♂️", + "man_mage_medium_dark_skin_tone": "🧙🏾‍♂️", + "man_mage_tone5": "🧙🏿‍♂️", + "man_mage_dark_skin_tone": "🧙🏿‍♂️", + "elf": "🧝", + "elf_tone1": "🧝🏻", + "elf_light_skin_tone": "🧝🏻", + "elf_tone2": "🧝🏼", + "elf_medium_light_skin_tone": "🧝🏼", + "elf_tone3": "🧝🏽", + "elf_medium_skin_tone": "🧝🏽", + "elf_tone4": "🧝🏾", + "elf_medium_dark_skin_tone": "🧝🏾", + "elf_tone5": "🧝🏿", + "elf_dark_skin_tone": "🧝🏿", + "woman_elf": "🧝‍♀️", + "woman_elf_tone1": "🧝🏻‍♀️", + "woman_elf_light_skin_tone": "🧝🏻‍♀️", + "woman_elf_tone2": "🧝🏼‍♀️", + "woman_elf_medium_light_skin_tone": "🧝🏼‍♀️", + "woman_elf_tone3": "🧝🏽‍♀️", + "woman_elf_medium_skin_tone": "🧝🏽‍♀️", + "woman_elf_tone4": "🧝🏾‍♀️", + "woman_elf_medium_dark_skin_tone": "🧝🏾‍♀️", + "woman_elf_tone5": "🧝🏿‍♀️", + "woman_elf_dark_skin_tone": "🧝🏿‍♀️", + "man_elf": "🧝‍♂️", + "man_elf_tone1": "🧝🏻‍♂️", + "man_elf_light_skin_tone": "🧝🏻‍♂️", + "man_elf_tone2": "🧝🏼‍♂️", + "man_elf_medium_light_skin_tone": "🧝🏼‍♂️", + "man_elf_tone3": "🧝🏽‍♂️", + "man_elf_medium_skin_tone": "🧝🏽‍♂️", + "man_elf_tone4": "🧝🏾‍♂️", + "man_elf_medium_dark_skin_tone": "🧝🏾‍♂️", + "man_elf_tone5": "🧝🏿‍♂️", + "man_elf_dark_skin_tone": "🧝🏿‍♂️", + "vampire": "🧛", + "vampire_tone1": "🧛🏻", + "vampire_light_skin_tone": "🧛🏻", + "vampire_tone2": "🧛🏼", + "vampire_medium_light_skin_tone": "🧛🏼", + "vampire_tone3": "🧛🏽", + "vampire_medium_skin_tone": "🧛🏽", + "vampire_tone4": "🧛🏾", + "vampire_medium_dark_skin_tone": "🧛🏾", + "vampire_tone5": "🧛🏿", + "vampire_dark_skin_tone": "🧛🏿", + "woman_vampire": "🧛‍♀️", + "woman_vampire_tone1": "🧛🏻‍♀️", + "woman_vampire_light_skin_tone": "🧛🏻‍♀️", + "woman_vampire_tone2": "🧛🏼‍♀️", + "woman_vampire_medium_light_skin_tone": "🧛🏼‍♀️", + "woman_vampire_tone3": "🧛🏽‍♀️", + "woman_vampire_medium_skin_tone": "🧛🏽‍♀️", + "woman_vampire_tone4": "🧛🏾‍♀️", + "woman_vampire_medium_dark_skin_tone": "🧛🏾‍♀️", + "woman_vampire_tone5": "🧛🏿‍♀️", + "woman_vampire_dark_skin_tone": "🧛🏿‍♀️", + "man_vampire": "🧛‍♂️", + "man_vampire_tone1": "🧛🏻‍♂️", + "man_vampire_light_skin_tone": "🧛🏻‍♂️", + "man_vampire_tone2": "🧛🏼‍♂️", + "man_vampire_medium_light_skin_tone": "🧛🏼‍♂️", + "man_vampire_tone3": "🧛🏽‍♂️", + "man_vampire_medium_skin_tone": "🧛🏽‍♂️", + "man_vampire_tone4": "🧛🏾‍♂️", + "man_vampire_medium_dark_skin_tone": "🧛🏾‍♂️", + "man_vampire_tone5": "🧛🏿‍♂️", + "man_vampire_dark_skin_tone": "🧛🏿‍♂️", + "zombie": "🧟", + "woman_zombie": "🧟‍♀️", + "man_zombie": "🧟‍♂️", + "genie": "🧞", + "woman_genie": "🧞‍♀️", + "man_genie": "🧞‍♂️", + "merperson": "🧜", + "merperson_tone1": "🧜🏻", + "merperson_light_skin_tone": "🧜🏻", + "merperson_tone2": "🧜🏼", + "merperson_medium_light_skin_tone": "🧜🏼", + "merperson_tone3": "🧜🏽", + "merperson_medium_skin_tone": "🧜🏽", + "merperson_tone4": "🧜🏾", + "merperson_medium_dark_skin_tone": "🧜🏾", + "merperson_tone5": "🧜🏿", + "merperson_dark_skin_tone": "🧜🏿", + "mermaid": "🧜‍♀️", + "mermaid_tone1": "🧜🏻‍♀️", + "mermaid_light_skin_tone": "🧜🏻‍♀️", + "mermaid_tone2": "🧜🏼‍♀️", + "mermaid_medium_light_skin_tone": "🧜🏼‍♀️", + "mermaid_tone3": "🧜🏽‍♀️", + "mermaid_medium_skin_tone": "🧜🏽‍♀️", + "mermaid_tone4": "🧜🏾‍♀️", + "mermaid_medium_dark_skin_tone": "🧜🏾‍♀️", + "mermaid_tone5": "🧜🏿‍♀️", + "mermaid_dark_skin_tone": "🧜🏿‍♀️", + "merman": "🧜‍♂️", + "merman_tone1": "🧜🏻‍♂️", + "merman_light_skin_tone": "🧜🏻‍♂️", + "merman_tone2": "🧜🏼‍♂️", + "merman_medium_light_skin_tone": "🧜🏼‍♂️", + "merman_tone3": "🧜🏽‍♂️", + "merman_medium_skin_tone": "🧜🏽‍♂️", + "merman_tone4": "🧜🏾‍♂️", + "merman_medium_dark_skin_tone": "🧜🏾‍♂️", + "merman_tone5": "🧜🏿‍♂️", + "merman_dark_skin_tone": "🧜🏿‍♂️", + "fairy": "🧚", + "fairy_tone1": "🧚🏻", + "fairy_light_skin_tone": "🧚🏻", + "fairy_tone2": "🧚🏼", + "fairy_medium_light_skin_tone": "🧚🏼", + "fairy_tone3": "🧚🏽", + "fairy_medium_skin_tone": "🧚🏽", + "fairy_tone4": "🧚🏾", + "fairy_medium_dark_skin_tone": "🧚🏾", + "fairy_tone5": "🧚🏿", + "fairy_dark_skin_tone": "🧚🏿", + "woman_fairy": "🧚‍♀️", + "woman_fairy_tone1": "🧚🏻‍♀️", + "woman_fairy_light_skin_tone": "🧚🏻‍♀️", + "woman_fairy_tone2": "🧚🏼‍♀️", + "woman_fairy_medium_light_skin_tone": "🧚🏼‍♀️", + "woman_fairy_tone3": "🧚🏽‍♀️", + "woman_fairy_medium_skin_tone": "🧚🏽‍♀️", + "woman_fairy_tone4": "🧚🏾‍♀️", + "woman_fairy_medium_dark_skin_tone": "🧚🏾‍♀️", + "woman_fairy_tone5": "🧚🏿‍♀️", + "woman_fairy_dark_skin_tone": "🧚🏿‍♀️", + "man_fairy": "🧚‍♂️", + "man_fairy_tone1": "🧚🏻‍♂️", + "man_fairy_light_skin_tone": "🧚🏻‍♂️", + "man_fairy_tone2": "🧚🏼‍♂️", + "man_fairy_medium_light_skin_tone": "🧚🏼‍♂️", + "man_fairy_tone3": "🧚🏽‍♂️", + "man_fairy_medium_skin_tone": "🧚🏽‍♂️", + "man_fairy_tone4": "🧚🏾‍♂️", + "man_fairy_medium_dark_skin_tone": "🧚🏾‍♂️", + "man_fairy_tone5": "🧚🏿‍♂️", + "man_fairy_dark_skin_tone": "🧚🏿‍♂️", + "angel": "👼", + "angel_tone1": "👼🏻", + "angel_tone2": "👼🏼", + "angel_tone3": "👼🏽", + "angel_tone4": "👼🏾", + "angel_tone5": "👼🏿", + "pregnant_woman": "🤰", + "expecting_woman": "🤰", + "pregnant_woman_tone1": "🤰🏻", + "expecting_woman_tone1": "🤰🏻", + "pregnant_woman_tone2": "🤰🏼", + "expecting_woman_tone2": "🤰🏼", + "pregnant_woman_tone3": "🤰🏽", + "expecting_woman_tone3": "🤰🏽", + "pregnant_woman_tone4": "🤰🏾", + "expecting_woman_tone4": "🤰🏾", + "pregnant_woman_tone5": "🤰🏿", + "expecting_woman_tone5": "🤰🏿", + "breast_feeding": "🤱", + "breast_feeding_tone1": "🤱🏻", + "breast_feeding_light_skin_tone": "🤱🏻", + "breast_feeding_tone2": "🤱🏼", + "breast_feeding_medium_light_skin_tone": "🤱🏼", + "breast_feeding_tone3": "🤱🏽", + "breast_feeding_medium_skin_tone": "🤱🏽", + "breast_feeding_tone4": "🤱🏾", + "breast_feeding_medium_dark_skin_tone": "🤱🏾", + "breast_feeding_tone5": "🤱🏿", + "breast_feeding_dark_skin_tone": "🤱🏿", + "person_feeding_baby": "🧑‍🍼", + "person_feeding_baby_tone1": "🧑🏻‍🍼", + "person_feeding_baby_light_skin_tone": "🧑🏻‍🍼", + "person_feeding_baby_tone2": "🧑🏼‍🍼", + "person_feeding_baby_medium_light_skin_tone": "🧑🏼‍🍼", + "person_feeding_baby_tone3": "🧑🏽‍🍼", + "person_feeding_baby_medium_skin_tone": "🧑🏽‍🍼", + "person_feeding_baby_tone4": "🧑🏾‍🍼", + "person_feeding_baby_medium_dark_skin_tone": "🧑🏾‍🍼", + "person_feeding_baby_tone5": "🧑🏿‍🍼", + "person_feeding_baby_dark_skin_tone": "🧑🏿‍🍼", + "woman_feeding_baby": "👩‍🍼", + "woman_feeding_baby_tone1": "👩🏻‍🍼", + "woman_feeding_baby_light_skin_tone": "👩🏻‍🍼", + "woman_feeding_baby_tone2": "👩🏼‍🍼", + "woman_feeding_baby_medium_light_skin_tone": "👩🏼‍🍼", + "woman_feeding_baby_tone3": "👩🏽‍🍼", + "woman_feeding_baby_medium_skin_tone": "👩🏽‍🍼", + "woman_feeding_baby_tone4": "👩🏾‍🍼", + "woman_feeding_baby_medium_dark_skin_tone": "👩🏾‍🍼", + "woman_feeding_baby_tone5": "👩🏿‍🍼", + "woman_feeding_baby_dark_skin_tone": "👩🏿‍🍼", + "man_feeding_baby": "👨‍🍼", + "man_feeding_baby_tone1": "👨🏻‍🍼", + "man_feeding_baby_light_skin_tone": "👨🏻‍🍼", + "man_feeding_baby_tone2": "👨🏼‍🍼", + "man_feeding_baby_medium_light_skin_tone": "👨🏼‍🍼", + "man_feeding_baby_tone3": "👨🏽‍🍼", + "man_feeding_baby_medium_skin_tone": "👨🏽‍🍼", + "man_feeding_baby_tone4": "👨🏾‍🍼", + "man_feeding_baby_medium_dark_skin_tone": "👨🏾‍🍼", + "man_feeding_baby_tone5": "👨🏿‍🍼", + "man_feeding_baby_dark_skin_tone": "👨🏿‍🍼", + "person_bowing": "🙇", + "bow": "🙇", + "person_bowing_tone1": "🙇🏻", + "bow_tone1": "🙇🏻", + "person_bowing_tone2": "🙇🏼", + "bow_tone2": "🙇🏼", + "person_bowing_tone3": "🙇🏽", + "bow_tone3": "🙇🏽", + "person_bowing_tone4": "🙇🏾", + "bow_tone4": "🙇🏾", + "person_bowing_tone5": "🙇🏿", + "bow_tone5": "🙇🏿", + "woman_bowing": "🙇‍♀️", + "woman_bowing_tone1": "🙇🏻‍♀️", + "woman_bowing_light_skin_tone": "🙇🏻‍♀️", + "woman_bowing_tone2": "🙇🏼‍♀️", + "woman_bowing_medium_light_skin_tone": "🙇🏼‍♀️", + "woman_bowing_tone3": "🙇🏽‍♀️", + "woman_bowing_medium_skin_tone": "🙇🏽‍♀️", + "woman_bowing_tone4": "🙇🏾‍♀️", + "woman_bowing_medium_dark_skin_tone": "🙇🏾‍♀️", + "woman_bowing_tone5": "🙇🏿‍♀️", + "woman_bowing_dark_skin_tone": "🙇🏿‍♀️", + "man_bowing": "🙇‍♂️", + "man_bowing_tone1": "🙇🏻‍♂️", + "man_bowing_light_skin_tone": "🙇🏻‍♂️", + "man_bowing_tone2": "🙇🏼‍♂️", + "man_bowing_medium_light_skin_tone": "🙇🏼‍♂️", + "man_bowing_tone3": "🙇🏽‍♂️", + "man_bowing_medium_skin_tone": "🙇🏽‍♂️", + "man_bowing_tone4": "🙇🏾‍♂️", + "man_bowing_medium_dark_skin_tone": "🙇🏾‍♂️", + "man_bowing_tone5": "🙇🏿‍♂️", + "man_bowing_dark_skin_tone": "🙇🏿‍♂️", + "person_tipping_hand": "💁", + "information_desk_person": "💁", + "person_tipping_hand_tone1": "💁🏻", + "information_desk_person_tone1": "💁🏻", + "person_tipping_hand_tone2": "💁🏼", + "information_desk_person_tone2": "💁🏼", + "person_tipping_hand_tone3": "💁🏽", + "information_desk_person_tone3": "💁🏽", + "person_tipping_hand_tone4": "💁🏾", + "information_desk_person_tone4": "💁🏾", + "person_tipping_hand_tone5": "💁🏿", + "information_desk_person_tone5": "💁🏿", + "woman_tipping_hand": "💁‍♀️", + "woman_tipping_hand_tone1": "💁🏻‍♀️", + "woman_tipping_hand_light_skin_tone": "💁🏻‍♀️", + "woman_tipping_hand_tone2": "💁🏼‍♀️", + "woman_tipping_hand_medium_light_skin_tone": "💁🏼‍♀️", + "woman_tipping_hand_tone3": "💁🏽‍♀️", + "woman_tipping_hand_medium_skin_tone": "💁🏽‍♀️", + "woman_tipping_hand_tone4": "💁🏾‍♀️", + "woman_tipping_hand_medium_dark_skin_tone": "💁🏾‍♀️", + "woman_tipping_hand_tone5": "💁🏿‍♀️", + "woman_tipping_hand_dark_skin_tone": "💁🏿‍♀️", + "man_tipping_hand": "💁‍♂️", + "man_tipping_hand_tone1": "💁🏻‍♂️", + "man_tipping_hand_light_skin_tone": "💁🏻‍♂️", + "man_tipping_hand_tone2": "💁🏼‍♂️", + "man_tipping_hand_medium_light_skin_tone": "💁🏼‍♂️", + "man_tipping_hand_tone3": "💁🏽‍♂️", + "man_tipping_hand_medium_skin_tone": "💁🏽‍♂️", + "man_tipping_hand_tone4": "💁🏾‍♂️", + "man_tipping_hand_medium_dark_skin_tone": "💁🏾‍♂️", + "man_tipping_hand_tone5": "💁🏿‍♂️", + "man_tipping_hand_dark_skin_tone": "💁🏿‍♂️", + "person_gesturing_no": "🙅", + "no_good": "🙅", + "person_gesturing_no_tone1": "🙅🏻", + "no_good_tone1": "🙅🏻", + "person_gesturing_no_tone2": "🙅🏼", + "no_good_tone2": "🙅🏼", + "person_gesturing_no_tone3": "🙅🏽", + "no_good_tone3": "🙅🏽", + "person_gesturing_no_tone4": "🙅🏾", + "no_good_tone4": "🙅🏾", + "person_gesturing_no_tone5": "🙅🏿", + "no_good_tone5": "🙅🏿", + "woman_gesturing_no": "🙅‍♀️", + "woman_gesturing_no_tone1": "🙅🏻‍♀️", + "woman_gesturing_no_light_skin_tone": "🙅🏻‍♀️", + "woman_gesturing_no_tone2": "🙅🏼‍♀️", + "woman_gesturing_no_medium_light_skin_tone": "🙅🏼‍♀️", + "woman_gesturing_no_tone3": "🙅🏽‍♀️", + "woman_gesturing_no_medium_skin_tone": "🙅🏽‍♀️", + "woman_gesturing_no_tone4": "🙅🏾‍♀️", + "woman_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♀️", + "woman_gesturing_no_tone5": "🙅🏿‍♀️", + "woman_gesturing_no_dark_skin_tone": "🙅🏿‍♀️", + "man_gesturing_no": "🙅‍♂️", + "man_gesturing_no_tone1": "🙅🏻‍♂️", + "man_gesturing_no_light_skin_tone": "🙅🏻‍♂️", + "man_gesturing_no_tone2": "🙅🏼‍♂️", + "man_gesturing_no_medium_light_skin_tone": "🙅🏼‍♂️", + "man_gesturing_no_tone3": "🙅🏽‍♂️", + "man_gesturing_no_medium_skin_tone": "🙅🏽‍♂️", + "man_gesturing_no_tone4": "🙅🏾‍♂️", + "man_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♂️", + "man_gesturing_no_tone5": "🙅🏿‍♂️", + "man_gesturing_no_dark_skin_tone": "🙅🏿‍♂️", + "person_gesturing_ok": "🙆", + "ok_woman": "🙆", + "person_gesturing_ok_tone1": "🙆🏻", + "ok_woman_tone1": "🙆🏻", + "person_gesturing_ok_tone2": "🙆🏼", + "ok_woman_tone2": "🙆🏼", + "person_gesturing_ok_tone3": "🙆🏽", + "ok_woman_tone3": "🙆🏽", + "person_gesturing_ok_tone4": "🙆🏾", + "ok_woman_tone4": "🙆🏾", + "person_gesturing_ok_tone5": "🙆🏿", + "ok_woman_tone5": "🙆🏿", + "woman_gesturing_ok": "🙆‍♀️", + "woman_gesturing_ok_tone1": "🙆🏻‍♀️", + "woman_gesturing_ok_light_skin_tone": "🙆🏻‍♀️", + "woman_gesturing_ok_tone2": "🙆🏼‍♀️", + "woman_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♀️", + "woman_gesturing_ok_tone3": "🙆🏽‍♀️", + "woman_gesturing_ok_medium_skin_tone": "🙆🏽‍♀️", + "woman_gesturing_ok_tone4": "🙆🏾‍♀️", + "woman_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♀️", + "woman_gesturing_ok_tone5": "🙆🏿‍♀️", + "woman_gesturing_ok_dark_skin_tone": "🙆🏿‍♀️", + "man_gesturing_ok": "🙆‍♂️", + "man_gesturing_ok_tone1": "🙆🏻‍♂️", + "man_gesturing_ok_light_skin_tone": "🙆🏻‍♂️", + "man_gesturing_ok_tone2": "🙆🏼‍♂️", + "man_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♂️", + "man_gesturing_ok_tone3": "🙆🏽‍♂️", + "man_gesturing_ok_medium_skin_tone": "🙆🏽‍♂️", + "man_gesturing_ok_tone4": "🙆🏾‍♂️", + "man_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♂️", + "man_gesturing_ok_tone5": "🙆🏿‍♂️", + "man_gesturing_ok_dark_skin_tone": "🙆🏿‍♂️", + "person_raising_hand": "🙋", + "raising_hand": "🙋", + "person_raising_hand_tone1": "🙋🏻", + "raising_hand_tone1": "🙋🏻", + "person_raising_hand_tone2": "🙋🏼", + "raising_hand_tone2": "🙋🏼", + "person_raising_hand_tone3": "🙋🏽", + "raising_hand_tone3": "🙋🏽", + "person_raising_hand_tone4": "🙋🏾", + "raising_hand_tone4": "🙋🏾", + "person_raising_hand_tone5": "🙋🏿", + "raising_hand_tone5": "🙋🏿", + "woman_raising_hand": "🙋‍♀️", + "woman_raising_hand_tone1": "🙋🏻‍♀️", + "woman_raising_hand_light_skin_tone": "🙋🏻‍♀️", + "woman_raising_hand_tone2": "🙋🏼‍♀️", + "woman_raising_hand_medium_light_skin_tone": "🙋🏼‍♀️", + "woman_raising_hand_tone3": "🙋🏽‍♀️", + "woman_raising_hand_medium_skin_tone": "🙋🏽‍♀️", + "woman_raising_hand_tone4": "🙋🏾‍♀️", + "woman_raising_hand_medium_dark_skin_tone": "🙋🏾‍♀️", + "woman_raising_hand_tone5": "🙋🏿‍♀️", + "woman_raising_hand_dark_skin_tone": "🙋🏿‍♀️", + "man_raising_hand": "🙋‍♂️", + "man_raising_hand_tone1": "🙋🏻‍♂️", + "man_raising_hand_light_skin_tone": "🙋🏻‍♂️", + "man_raising_hand_tone2": "🙋🏼‍♂️", + "man_raising_hand_medium_light_skin_tone": "🙋🏼‍♂️", + "man_raising_hand_tone3": "🙋🏽‍♂️", + "man_raising_hand_medium_skin_tone": "🙋🏽‍♂️", + "man_raising_hand_tone4": "🙋🏾‍♂️", + "man_raising_hand_medium_dark_skin_tone": "🙋🏾‍♂️", + "man_raising_hand_tone5": "🙋🏿‍♂️", + "man_raising_hand_dark_skin_tone": "🙋🏿‍♂️", + "deaf_person": "🧏", + "deaf_person_tone1": "🧏🏻", + "deaf_person_light_skin_tone": "🧏🏻", + "deaf_person_tone2": "🧏🏼", + "deaf_person_medium_light_skin_tone": "🧏🏼", + "deaf_person_tone3": "🧏🏽", + "deaf_person_medium_skin_tone": "🧏🏽", + "deaf_person_tone4": "🧏🏾", + "deaf_person_medium_dark_skin_tone": "🧏🏾", + "deaf_person_tone5": "🧏🏿", + "deaf_person_dark_skin_tone": "🧏🏿", + "deaf_woman": "🧏‍♀️", + "deaf_woman_tone1": "🧏🏻‍♀️", + "deaf_woman_light_skin_tone": "🧏🏻‍♀️", + "deaf_woman_tone2": "🧏🏼‍♀️", + "deaf_woman_medium_light_skin_tone": "🧏🏼‍♀️", + "deaf_woman_tone3": "🧏🏽‍♀️", + "deaf_woman_medium_skin_tone": "🧏🏽‍♀️", + "deaf_woman_tone4": "🧏🏾‍♀️", + "deaf_woman_medium_dark_skin_tone": "🧏🏾‍♀️", + "deaf_woman_tone5": "🧏🏿‍♀️", + "deaf_woman_dark_skin_tone": "🧏🏿‍♀️", + "deaf_man": "🧏‍♂️", + "deaf_man_tone1": "🧏🏻‍♂️", + "deaf_man_light_skin_tone": "🧏🏻‍♂️", + "deaf_man_tone2": "🧏🏼‍♂️", + "deaf_man_medium_light_skin_tone": "🧏🏼‍♂️", + "deaf_man_tone3": "🧏🏽‍♂️", + "deaf_man_medium_skin_tone": "🧏🏽‍♂️", + "deaf_man_tone4": "🧏🏾‍♂️", + "deaf_man_medium_dark_skin_tone": "🧏🏾‍♂️", + "deaf_man_tone5": "🧏🏿‍♂️", + "deaf_man_dark_skin_tone": "🧏🏿‍♂️", + "person_facepalming": "🤦", + "face_palm": "🤦", + "facepalm": "🤦", + "person_facepalming_tone1": "🤦🏻", + "face_palm_tone1": "🤦🏻", + "facepalm_tone1": "🤦🏻", + "person_facepalming_tone2": "🤦🏼", + "face_palm_tone2": "🤦🏼", + "facepalm_tone2": "🤦🏼", + "person_facepalming_tone3": "🤦🏽", + "face_palm_tone3": "🤦🏽", + "facepalm_tone3": "🤦🏽", + "person_facepalming_tone4": "🤦🏾", + "face_palm_tone4": "🤦🏾", + "facepalm_tone4": "🤦🏾", + "person_facepalming_tone5": "🤦🏿", + "face_palm_tone5": "🤦🏿", + "facepalm_tone5": "🤦🏿", + "woman_facepalming": "🤦‍♀️", + "woman_facepalming_tone1": "🤦🏻‍♀️", + "woman_facepalming_light_skin_tone": "🤦🏻‍♀️", + "woman_facepalming_tone2": "🤦🏼‍♀️", + "woman_facepalming_medium_light_skin_tone": "🤦🏼‍♀️", + "woman_facepalming_tone3": "🤦🏽‍♀️", + "woman_facepalming_medium_skin_tone": "🤦🏽‍♀️", + "woman_facepalming_tone4": "🤦🏾‍♀️", + "woman_facepalming_medium_dark_skin_tone": "🤦🏾‍♀️", + "woman_facepalming_tone5": "🤦🏿‍♀️", + "woman_facepalming_dark_skin_tone": "🤦🏿‍♀️", + "man_facepalming": "🤦‍♂️", + "man_facepalming_tone1": "🤦🏻‍♂️", + "man_facepalming_light_skin_tone": "🤦🏻‍♂️", + "man_facepalming_tone2": "🤦🏼‍♂️", + "man_facepalming_medium_light_skin_tone": "🤦🏼‍♂️", + "man_facepalming_tone3": "🤦🏽‍♂️", + "man_facepalming_medium_skin_tone": "🤦🏽‍♂️", + "man_facepalming_tone4": "🤦🏾‍♂️", + "man_facepalming_medium_dark_skin_tone": "🤦🏾‍♂️", + "man_facepalming_tone5": "🤦🏿‍♂️", + "man_facepalming_dark_skin_tone": "🤦🏿‍♂️", + "person_shrugging": "🤷", + "shrug": "🤷", + "person_shrugging_tone1": "🤷🏻", + "shrug_tone1": "🤷🏻", + "person_shrugging_tone2": "🤷🏼", + "shrug_tone2": "🤷🏼", + "person_shrugging_tone3": "🤷🏽", + "shrug_tone3": "🤷🏽", + "person_shrugging_tone4": "🤷🏾", + "shrug_tone4": "🤷🏾", + "person_shrugging_tone5": "🤷🏿", + "shrug_tone5": "🤷🏿", + "woman_shrugging": "🤷‍♀️", + "woman_shrugging_tone1": "🤷🏻‍♀️", + "woman_shrugging_light_skin_tone": "🤷🏻‍♀️", + "woman_shrugging_tone2": "🤷🏼‍♀️", + "woman_shrugging_medium_light_skin_tone": "🤷🏼‍♀️", + "woman_shrugging_tone3": "🤷🏽‍♀️", + "woman_shrugging_medium_skin_tone": "🤷🏽‍♀️", + "woman_shrugging_tone4": "🤷🏾‍♀️", + "woman_shrugging_medium_dark_skin_tone": "🤷🏾‍♀️", + "woman_shrugging_tone5": "🤷🏿‍♀️", + "woman_shrugging_dark_skin_tone": "🤷🏿‍♀️", + "man_shrugging": "🤷‍♂️", + "man_shrugging_tone1": "🤷🏻‍♂️", + "man_shrugging_light_skin_tone": "🤷🏻‍♂️", + "man_shrugging_tone2": "🤷🏼‍♂️", + "man_shrugging_medium_light_skin_tone": "🤷🏼‍♂️", + "man_shrugging_tone3": "🤷🏽‍♂️", + "man_shrugging_medium_skin_tone": "🤷🏽‍♂️", + "man_shrugging_tone4": "🤷🏾‍♂️", + "man_shrugging_medium_dark_skin_tone": "🤷🏾‍♂️", + "man_shrugging_tone5": "🤷🏿‍♂️", + "man_shrugging_dark_skin_tone": "🤷🏿‍♂️", + "person_pouting": "🙎", + "person_with_pouting_face": "🙎", + "person_pouting_tone1": "🙎🏻", + "person_with_pouting_face_tone1": "🙎🏻", + "person_pouting_tone2": "🙎🏼", + "person_with_pouting_face_tone2": "🙎🏼", + "person_pouting_tone3": "🙎🏽", + "person_with_pouting_face_tone3": "🙎🏽", + "person_pouting_tone4": "🙎🏾", + "person_with_pouting_face_tone4": "🙎🏾", + "person_pouting_tone5": "🙎🏿", + "person_with_pouting_face_tone5": "🙎🏿", + "woman_pouting": "🙎‍♀️", + "woman_pouting_tone1": "🙎🏻‍♀️", + "woman_pouting_light_skin_tone": "🙎🏻‍♀️", + "woman_pouting_tone2": "🙎🏼‍♀️", + "woman_pouting_medium_light_skin_tone": "🙎🏼‍♀️", + "woman_pouting_tone3": "🙎🏽‍♀️", + "woman_pouting_medium_skin_tone": "🙎🏽‍♀️", + "woman_pouting_tone4": "🙎🏾‍♀️", + "woman_pouting_medium_dark_skin_tone": "🙎🏾‍♀️", + "woman_pouting_tone5": "🙎🏿‍♀️", + "woman_pouting_dark_skin_tone": "🙎🏿‍♀️", + "man_pouting": "🙎‍♂️", + "man_pouting_tone1": "🙎🏻‍♂️", + "man_pouting_light_skin_tone": "🙎🏻‍♂️", + "man_pouting_tone2": "🙎🏼‍♂️", + "man_pouting_medium_light_skin_tone": "🙎🏼‍♂️", + "man_pouting_tone3": "🙎🏽‍♂️", + "man_pouting_medium_skin_tone": "🙎🏽‍♂️", + "man_pouting_tone4": "🙎🏾‍♂️", + "man_pouting_medium_dark_skin_tone": "🙎🏾‍♂️", + "man_pouting_tone5": "🙎🏿‍♂️", + "man_pouting_dark_skin_tone": "🙎🏿‍♂️", + "person_frowning": "🙍", + "person_frowning_tone1": "🙍🏻", + "person_frowning_tone2": "🙍🏼", + "person_frowning_tone3": "🙍🏽", + "person_frowning_tone4": "🙍🏾", + "person_frowning_tone5": "🙍🏿", + "woman_frowning": "🙍‍♀️", + "woman_frowning_tone1": "🙍🏻‍♀️", + "woman_frowning_light_skin_tone": "🙍🏻‍♀️", + "woman_frowning_tone2": "🙍🏼‍♀️", + "woman_frowning_medium_light_skin_tone": "🙍🏼‍♀️", + "woman_frowning_tone3": "🙍🏽‍♀️", + "woman_frowning_medium_skin_tone": "🙍🏽‍♀️", + "woman_frowning_tone4": "🙍🏾‍♀️", + "woman_frowning_medium_dark_skin_tone": "🙍🏾‍♀️", + "woman_frowning_tone5": "🙍🏿‍♀️", + "woman_frowning_dark_skin_tone": "🙍🏿‍♀️", + "man_frowning": "🙍‍♂️", + "man_frowning_tone1": "🙍🏻‍♂️", + "man_frowning_light_skin_tone": "🙍🏻‍♂️", + "man_frowning_tone2": "🙍🏼‍♂️", + "man_frowning_medium_light_skin_tone": "🙍🏼‍♂️", + "man_frowning_tone3": "🙍🏽‍♂️", + "man_frowning_medium_skin_tone": "🙍🏽‍♂️", + "man_frowning_tone4": "🙍🏾‍♂️", + "man_frowning_medium_dark_skin_tone": "🙍🏾‍♂️", + "man_frowning_tone5": "🙍🏿‍♂️", + "man_frowning_dark_skin_tone": "🙍🏿‍♂️", + "person_getting_haircut": "💇", + "haircut": "💇", + "person_getting_haircut_tone1": "💇🏻", + "haircut_tone1": "💇🏻", + "person_getting_haircut_tone2": "💇🏼", + "haircut_tone2": "💇🏼", + "person_getting_haircut_tone3": "💇🏽", + "haircut_tone3": "💇🏽", + "person_getting_haircut_tone4": "💇🏾", + "haircut_tone4": "💇🏾", + "person_getting_haircut_tone5": "💇🏿", + "haircut_tone5": "💇🏿", + "woman_getting_haircut": "💇‍♀️", + "woman_getting_haircut_tone1": "💇🏻‍♀️", + "woman_getting_haircut_light_skin_tone": "💇🏻‍♀️", + "woman_getting_haircut_tone2": "💇🏼‍♀️", + "woman_getting_haircut_medium_light_skin_tone": "💇🏼‍♀️", + "woman_getting_haircut_tone3": "💇🏽‍♀️", + "woman_getting_haircut_medium_skin_tone": "💇🏽‍♀️", + "woman_getting_haircut_tone4": "💇🏾‍♀️", + "woman_getting_haircut_medium_dark_skin_tone": "💇🏾‍♀️", + "woman_getting_haircut_tone5": "💇🏿‍♀️", + "woman_getting_haircut_dark_skin_tone": "💇🏿‍♀️", + "man_getting_haircut": "💇‍♂️", + "man_getting_haircut_tone1": "💇🏻‍♂️", + "man_getting_haircut_light_skin_tone": "💇🏻‍♂️", + "man_getting_haircut_tone2": "💇🏼‍♂️", + "man_getting_haircut_medium_light_skin_tone": "💇🏼‍♂️", + "man_getting_haircut_tone3": "💇🏽‍♂️", + "man_getting_haircut_medium_skin_tone": "💇🏽‍♂️", + "man_getting_haircut_tone4": "💇🏾‍♂️", + "man_getting_haircut_medium_dark_skin_tone": "💇🏾‍♂️", + "man_getting_haircut_tone5": "💇🏿‍♂️", + "man_getting_haircut_dark_skin_tone": "💇🏿‍♂️", + "person_getting_massage": "💆", + "massage": "💆", + "person_getting_massage_tone1": "💆🏻", + "massage_tone1": "💆🏻", + "person_getting_massage_tone2": "💆🏼", + "massage_tone2": "💆🏼", + "person_getting_massage_tone3": "💆🏽", + "massage_tone3": "💆🏽", + "person_getting_massage_tone4": "💆🏾", + "massage_tone4": "💆🏾", + "person_getting_massage_tone5": "💆🏿", + "massage_tone5": "💆🏿", + "woman_getting_face_massage": "💆‍♀️", + "woman_getting_face_massage_tone1": "💆🏻‍♀️", + "woman_getting_face_massage_light_skin_tone": "💆🏻‍♀️", + "woman_getting_face_massage_tone2": "💆🏼‍♀️", + "woman_getting_face_massage_medium_light_skin_tone": "💆🏼‍♀️", + "woman_getting_face_massage_tone3": "💆🏽‍♀️", + "woman_getting_face_massage_medium_skin_tone": "💆🏽‍♀️", + "woman_getting_face_massage_tone4": "💆🏾‍♀️", + "woman_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♀️", + "woman_getting_face_massage_tone5": "💆🏿‍♀️", + "woman_getting_face_massage_dark_skin_tone": "💆🏿‍♀️", + "man_getting_face_massage": "💆‍♂️", + "man_getting_face_massage_tone1": "💆🏻‍♂️", + "man_getting_face_massage_light_skin_tone": "💆🏻‍♂️", + "man_getting_face_massage_tone2": "💆🏼‍♂️", + "man_getting_face_massage_medium_light_skin_tone": "💆🏼‍♂️", + "man_getting_face_massage_tone3": "💆🏽‍♂️", + "man_getting_face_massage_medium_skin_tone": "💆🏽‍♂️", + "man_getting_face_massage_tone4": "💆🏾‍♂️", + "man_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♂️", + "man_getting_face_massage_tone5": "💆🏿‍♂️", + "man_getting_face_massage_dark_skin_tone": "💆🏿‍♂️", + "person_in_steamy_room": "🧖", + "person_in_steamy_room_tone1": "🧖🏻", + "person_in_steamy_room_light_skin_tone": "🧖🏻", + "person_in_steamy_room_tone2": "🧖🏼", + "person_in_steamy_room_medium_light_skin_tone": "🧖🏼", + "person_in_steamy_room_tone3": "🧖🏽", + "person_in_steamy_room_medium_skin_tone": "🧖🏽", + "person_in_steamy_room_tone4": "🧖🏾", + "person_in_steamy_room_medium_dark_skin_tone": "🧖🏾", + "person_in_steamy_room_tone5": "🧖🏿", + "person_in_steamy_room_dark_skin_tone": "🧖🏿", + "woman_in_steamy_room": "🧖‍♀️", + "woman_in_steamy_room_tone1": "🧖🏻‍♀️", + "woman_in_steamy_room_light_skin_tone": "🧖🏻‍♀️", + "woman_in_steamy_room_tone2": "🧖🏼‍♀️", + "woman_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♀️", + "woman_in_steamy_room_tone3": "🧖🏽‍♀️", + "woman_in_steamy_room_medium_skin_tone": "🧖🏽‍♀️", + "woman_in_steamy_room_tone4": "🧖🏾‍♀️", + "woman_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♀️", + "woman_in_steamy_room_tone5": "🧖🏿‍♀️", + "woman_in_steamy_room_dark_skin_tone": "🧖🏿‍♀️", + "man_in_steamy_room": "🧖‍♂️", + "man_in_steamy_room_tone1": "🧖🏻‍♂️", + "man_in_steamy_room_light_skin_tone": "🧖🏻‍♂️", + "man_in_steamy_room_tone2": "🧖🏼‍♂️", + "man_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♂️", + "man_in_steamy_room_tone3": "🧖🏽‍♂️", + "man_in_steamy_room_medium_skin_tone": "🧖🏽‍♂️", + "man_in_steamy_room_tone4": "🧖🏾‍♂️", + "man_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♂️", + "man_in_steamy_room_tone5": "🧖🏿‍♂️", + "man_in_steamy_room_dark_skin_tone": "🧖🏿‍♂️", + "nail_care": "💅", + "nail_care_tone1": "💅🏻", + "nail_care_tone2": "💅🏼", + "nail_care_tone3": "💅🏽", + "nail_care_tone4": "💅🏾", + "nail_care_tone5": "💅🏿", + "selfie": "🤳", + "selfie_tone1": "🤳🏻", + "selfie_tone2": "🤳🏼", + "selfie_tone3": "🤳🏽", + "selfie_tone4": "🤳🏾", + "selfie_tone5": "🤳🏿", + "dancer": "💃", + "dancer_tone1": "💃🏻", + "dancer_tone2": "💃🏼", + "dancer_tone3": "💃🏽", + "dancer_tone4": "💃🏾", + "dancer_tone5": "💃🏿", + "man_dancing": "🕺", + "male_dancer": "🕺", + "man_dancing_tone1": "🕺🏻", + "male_dancer_tone1": "🕺🏻", + "man_dancing_tone2": "🕺🏼", + "male_dancer_tone2": "🕺🏼", + "man_dancing_tone3": "🕺🏽", + "male_dancer_tone3": "🕺🏽", + "man_dancing_tone5": "🕺🏿", + "male_dancer_tone5": "🕺🏿", + "man_dancing_tone4": "🕺🏾", + "male_dancer_tone4": "🕺🏾", + "people_with_bunny_ears_partying": "👯", + "dancers": "👯", + "women_with_bunny_ears_partying": "👯‍♀️", + "men_with_bunny_ears_partying": "👯‍♂️", + "levitate": "🕴️", + "man_in_business_suit_levitating": "🕴️", + "levitate_tone1": "🕴🏻", + "man_in_business_suit_levitating_tone1": "🕴🏻", + "man_in_business_suit_levitating_light_skin_tone": "🕴🏻", + "levitate_tone2": "🕴🏼", + "man_in_business_suit_levitating_tone2": "🕴🏼", + "man_in_business_suit_levitating_medium_light_skin_tone": "🕴🏼", + "levitate_tone3": "🕴🏽", + "man_in_business_suit_levitating_tone3": "🕴🏽", + "man_in_business_suit_levitating_medium_skin_tone": "🕴🏽", + "levitate_tone4": "🕴🏾", + "man_in_business_suit_levitating_tone4": "🕴🏾", + "man_in_business_suit_levitating_medium_dark_skin_tone": "🕴🏾", + "levitate_tone5": "🕴🏿", + "man_in_business_suit_levitating_tone5": "🕴🏿", + "man_in_business_suit_levitating_dark_skin_tone": "🕴🏿", + "person_in_manual_wheelchair": "🧑‍🦽", + "person_in_manual_wheelchair_tone1": "🧑🏻‍🦽", + "person_in_manual_wheelchair_light_skin_tone": "🧑🏻‍🦽", + "person_in_manual_wheelchair_tone2": "🧑🏼‍🦽", + "person_in_manual_wheelchair_medium_light_skin_tone": "🧑🏼‍🦽", + "person_in_manual_wheelchair_tone3": "🧑🏽‍🦽", + "person_in_manual_wheelchair_medium_skin_tone": "🧑🏽‍🦽", + "person_in_manual_wheelchair_tone4": "🧑🏾‍🦽", + "person_in_manual_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦽", + "person_in_manual_wheelchair_tone5": "🧑🏿‍🦽", + "person_in_manual_wheelchair_dark_skin_tone": "🧑🏿‍🦽", + "woman_in_manual_wheelchair": "👩‍🦽", + "woman_in_manual_wheelchair_tone1": "👩🏻‍🦽", + "woman_in_manual_wheelchair_light_skin_tone": "👩🏻‍🦽", + "woman_in_manual_wheelchair_tone2": "👩🏼‍🦽", + "woman_in_manual_wheelchair_medium_light_skin_tone": "👩🏼‍🦽", + "woman_in_manual_wheelchair_tone3": "👩🏽‍🦽", + "woman_in_manual_wheelchair_medium_skin_tone": "👩🏽‍🦽", + "woman_in_manual_wheelchair_tone4": "👩🏾‍🦽", + "woman_in_manual_wheelchair_medium_dark_skin_tone": "👩🏾‍🦽", + "woman_in_manual_wheelchair_tone5": "👩🏿‍🦽", + "woman_in_manual_wheelchair_dark_skin_tone": "👩🏿‍🦽", + "man_in_manual_wheelchair": "👨‍🦽", + "man_in_manual_wheelchair_tone1": "👨🏻‍🦽", + "man_in_manual_wheelchair_light_skin_tone": "👨🏻‍🦽", + "man_in_manual_wheelchair_tone2": "👨🏼‍🦽", + "man_in_manual_wheelchair_medium_light_skin_tone": "👨🏼‍🦽", + "man_in_manual_wheelchair_tone3": "👨🏽‍🦽", + "man_in_manual_wheelchair_medium_skin_tone": "👨🏽‍🦽", + "man_in_manual_wheelchair_tone4": "👨🏾‍🦽", + "man_in_manual_wheelchair_medium_dark_skin_tone": "👨🏾‍🦽", + "man_in_manual_wheelchair_tone5": "👨🏿‍🦽", + "man_in_manual_wheelchair_dark_skin_tone": "👨🏿‍🦽", + "person_in_motorized_wheelchair": "🧑‍🦼", + "person_in_motorized_wheelchair_tone1": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_light_skin_tone": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_tone2": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_medium_light_skin_tone": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_tone3": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_medium_skin_tone": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_tone4": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_tone5": "🧑🏿‍🦼", + "person_in_motorized_wheelchair_dark_skin_tone": "🧑🏿‍🦼", + "woman_in_motorized_wheelchair": "👩‍🦼", + "woman_in_motorized_wheelchair_tone1": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_light_skin_tone": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_tone2": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_medium_light_skin_tone": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_tone3": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_medium_skin_tone": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_tone4": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_medium_dark_skin_tone": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_tone5": "👩🏿‍🦼", + "woman_in_motorized_wheelchair_dark_skin_tone": "👩🏿‍🦼", + "man_in_motorized_wheelchair": "👨‍🦼", + "man_in_motorized_wheelchair_tone1": "👨🏻‍🦼", + "man_in_motorized_wheelchair_light_skin_tone": "👨🏻‍🦼", + "man_in_motorized_wheelchair_tone2": "👨🏼‍🦼", + "man_in_motorized_wheelchair_medium_light_skin_tone": "👨🏼‍🦼", + "man_in_motorized_wheelchair_tone3": "👨🏽‍🦼", + "man_in_motorized_wheelchair_medium_skin_tone": "👨🏽‍🦼", + "man_in_motorized_wheelchair_tone4": "👨🏾‍🦼", + "man_in_motorized_wheelchair_medium_dark_skin_tone": "👨🏾‍🦼", + "man_in_motorized_wheelchair_tone5": "👨🏿‍🦼", + "man_in_motorized_wheelchair_dark_skin_tone": "👨🏿‍🦼", + "person_walking": "🚶", + "walking": "🚶", + "person_walking_tone1": "🚶🏻", + "walking_tone1": "🚶🏻", + "person_walking_tone2": "🚶🏼", + "walking_tone2": "🚶🏼", + "person_walking_tone3": "🚶🏽", + "walking_tone3": "🚶🏽", + "person_walking_tone4": "🚶🏾", + "walking_tone4": "🚶🏾", + "person_walking_tone5": "🚶🏿", + "walking_tone5": "🚶🏿", + "woman_walking": "🚶‍♀️", + "woman_walking_tone1": "🚶🏻‍♀️", + "woman_walking_light_skin_tone": "🚶🏻‍♀️", + "woman_walking_tone2": "🚶🏼‍♀️", + "woman_walking_medium_light_skin_tone": "🚶🏼‍♀️", + "woman_walking_tone3": "🚶🏽‍♀️", + "woman_walking_medium_skin_tone": "🚶🏽‍♀️", + "woman_walking_tone4": "🚶🏾‍♀️", + "woman_walking_medium_dark_skin_tone": "🚶🏾‍♀️", + "woman_walking_tone5": "🚶🏿‍♀️", + "woman_walking_dark_skin_tone": "🚶🏿‍♀️", + "man_walking": "🚶‍♂️", + "man_walking_tone1": "🚶🏻‍♂️", + "man_walking_light_skin_tone": "🚶🏻‍♂️", + "man_walking_tone2": "🚶🏼‍♂️", + "man_walking_medium_light_skin_tone": "🚶🏼‍♂️", + "man_walking_tone3": "🚶🏽‍♂️", + "man_walking_medium_skin_tone": "🚶🏽‍♂️", + "man_walking_tone4": "🚶🏾‍♂️", + "man_walking_medium_dark_skin_tone": "🚶🏾‍♂️", + "man_walking_tone5": "🚶🏿‍♂️", + "man_walking_dark_skin_tone": "🚶🏿‍♂️", + "person_with_probing_cane": "🧑‍🦯", + "person_with_probing_cane_tone1": "🧑🏻‍🦯", + "person_with_probing_cane_light_skin_tone": "🧑🏻‍🦯", + "person_with_probing_cane_tone2": "🧑🏼‍🦯", + "person_with_probing_cane_medium_light_skin_tone": "🧑🏼‍🦯", + "person_with_probing_cane_tone3": "🧑🏽‍🦯", + "person_with_probing_cane_medium_skin_tone": "🧑🏽‍🦯", + "person_with_probing_cane_tone4": "🧑🏾‍🦯", + "person_with_probing_cane_medium_dark_skin_tone": "🧑🏾‍🦯", + "person_with_probing_cane_tone5": "🧑🏿‍🦯", + "person_with_probing_cane_dark_skin_tone": "🧑🏿‍🦯", + "woman_with_probing_cane": "👩‍🦯", + "woman_with_probing_cane_tone1": "👩🏻‍🦯", + "woman_with_probing_cane_light_skin_tone": "👩🏻‍🦯", + "woman_with_probing_cane_tone2": "👩🏼‍🦯", + "woman_with_probing_cane_medium_light_skin_tone": "👩🏼‍🦯", + "woman_with_probing_cane_tone3": "👩🏽‍🦯", + "woman_with_probing_cane_medium_skin_tone": "👩🏽‍🦯", + "woman_with_probing_cane_tone4": "👩🏾‍🦯", + "woman_with_probing_cane_medium_dark_skin_tone": "👩🏾‍🦯", + "woman_with_probing_cane_tone5": "👩🏿‍🦯", + "woman_with_probing_cane_dark_skin_tone": "👩🏿‍🦯", + "man_with_probing_cane": "👨‍🦯", + "man_with_probing_cane_tone1": "👨🏻‍🦯", + "man_with_probing_cane_light_skin_tone": "👨🏻‍🦯", + "man_with_probing_cane_tone3": "👨🏽‍🦯", + "man_with_probing_cane_medium_skin_tone": "👨🏽‍🦯", + "man_with_probing_cane_tone2": "👨🏼‍🦯", + "man_with_probing_cane_medium_light_skin_tone": "👨🏼‍🦯", + "man_with_probing_cane_tone4": "👨🏾‍🦯", + "man_with_probing_cane_medium_dark_skin_tone": "👨🏾‍🦯", + "man_with_probing_cane_tone5": "👨🏿‍🦯", + "man_with_probing_cane_dark_skin_tone": "👨🏿‍🦯", + "person_kneeling": "🧎", + "person_kneeling_tone1": "🧎🏻", + "person_kneeling_light_skin_tone": "🧎🏻", + "person_kneeling_tone2": "🧎🏼", + "person_kneeling_medium_light_skin_tone": "🧎🏼", + "person_kneeling_tone3": "🧎🏽", + "person_kneeling_medium_skin_tone": "🧎🏽", + "person_kneeling_tone4": "🧎🏾", + "person_kneeling_medium_dark_skin_tone": "🧎🏾", + "person_kneeling_tone5": "🧎🏿", + "person_kneeling_dark_skin_tone": "🧎🏿", + "woman_kneeling": "🧎‍♀️", + "woman_kneeling_tone1": "🧎🏻‍♀️", + "woman_kneeling_light_skin_tone": "🧎🏻‍♀️", + "woman_kneeling_tone2": "🧎🏼‍♀️", + "woman_kneeling_medium_light_skin_tone": "🧎🏼‍♀️", + "woman_kneeling_tone3": "🧎🏽‍♀️", + "woman_kneeling_medium_skin_tone": "🧎🏽‍♀️", + "woman_kneeling_tone4": "🧎🏾‍♀️", + "woman_kneeling_medium_dark_skin_tone": "🧎🏾‍♀️", + "woman_kneeling_tone5": "🧎🏿‍♀️", + "woman_kneeling_dark_skin_tone": "🧎🏿‍♀️", + "man_kneeling": "🧎‍♂️", + "man_kneeling_tone1": "🧎🏻‍♂️", + "man_kneeling_light_skin_tone": "🧎🏻‍♂️", + "man_kneeling_tone2": "🧎🏼‍♂️", + "man_kneeling_medium_light_skin_tone": "🧎🏼‍♂️", + "man_kneeling_tone3": "🧎🏽‍♂️", + "man_kneeling_medium_skin_tone": "🧎🏽‍♂️", + "man_kneeling_tone4": "🧎🏾‍♂️", + "man_kneeling_medium_dark_skin_tone": "🧎🏾‍♂️", + "man_kneeling_tone5": "🧎🏿‍♂️", + "man_kneeling_dark_skin_tone": "🧎🏿‍♂️", + "person_running": "🏃", + "runner": "🏃", + "person_running_tone1": "🏃🏻", + "runner_tone1": "🏃🏻", + "person_running_tone2": "🏃🏼", + "runner_tone2": "🏃🏼", + "person_running_tone3": "🏃🏽", + "runner_tone3": "🏃🏽", + "person_running_tone4": "🏃🏾", + "runner_tone4": "🏃🏾", + "person_running_tone5": "🏃🏿", + "runner_tone5": "🏃🏿", + "woman_running": "🏃‍♀️", + "woman_running_tone1": "🏃🏻‍♀️", + "woman_running_light_skin_tone": "🏃🏻‍♀️", + "woman_running_tone2": "🏃🏼‍♀️", + "woman_running_medium_light_skin_tone": "🏃🏼‍♀️", + "woman_running_tone3": "🏃🏽‍♀️", + "woman_running_medium_skin_tone": "🏃🏽‍♀️", + "woman_running_tone4": "🏃🏾‍♀️", + "woman_running_medium_dark_skin_tone": "🏃🏾‍♀️", + "woman_running_tone5": "🏃🏿‍♀️", + "woman_running_dark_skin_tone": "🏃🏿‍♀️", + "man_running": "🏃‍♂️", + "man_running_tone1": "🏃🏻‍♂️", + "man_running_light_skin_tone": "🏃🏻‍♂️", + "man_running_tone2": "🏃🏼‍♂️", + "man_running_medium_light_skin_tone": "🏃🏼‍♂️", + "man_running_tone3": "🏃🏽‍♂️", + "man_running_medium_skin_tone": "🏃🏽‍♂️", + "man_running_tone4": "🏃🏾‍♂️", + "man_running_medium_dark_skin_tone": "🏃🏾‍♂️", + "man_running_tone5": "🏃🏿‍♂️", + "man_running_dark_skin_tone": "🏃🏿‍♂️", + "person_standing": "🧍", + "person_standing_tone1": "🧍🏻", + "person_standing_light_skin_tone": "🧍🏻", + "person_standing_tone2": "🧍🏼", + "person_standing_medium_light_skin_tone": "🧍🏼", + "person_standing_tone3": "🧍🏽", + "person_standing_medium_skin_tone": "🧍🏽", + "person_standing_tone4": "🧍🏾", + "person_standing_medium_dark_skin_tone": "🧍🏾", + "person_standing_tone5": "🧍🏿", + "person_standing_dark_skin_tone": "🧍🏿", + "woman_standing": "🧍‍♀️", + "woman_standing_tone1": "🧍🏻‍♀️", + "woman_standing_light_skin_tone": "🧍🏻‍♀️", + "woman_standing_tone2": "🧍🏼‍♀️", + "woman_standing_medium_light_skin_tone": "🧍🏼‍♀️", + "woman_standing_tone3": "🧍🏽‍♀️", + "woman_standing_medium_skin_tone": "🧍🏽‍♀️", + "woman_standing_tone4": "🧍🏾‍♀️", + "woman_standing_medium_dark_skin_tone": "🧍🏾‍♀️", + "woman_standing_tone5": "🧍🏿‍♀️", + "woman_standing_dark_skin_tone": "🧍🏿‍♀️", + "man_standing": "🧍‍♂️", + "man_standing_tone1": "🧍🏻‍♂️", + "man_standing_light_skin_tone": "🧍🏻‍♂️", + "man_standing_tone2": "🧍🏼‍♂️", + "man_standing_medium_light_skin_tone": "🧍🏼‍♂️", + "man_standing_tone3": "🧍🏽‍♂️", + "man_standing_medium_skin_tone": "🧍🏽‍♂️", + "man_standing_tone4": "🧍🏾‍♂️", + "man_standing_medium_dark_skin_tone": "🧍🏾‍♂️", + "man_standing_tone5": "🧍🏿‍♂️", + "man_standing_dark_skin_tone": "🧍🏿‍♂️", + "people_holding_hands": "🧑‍🤝‍🧑", + "people_holding_hands_tone1": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_light_skin_tone": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_tone1_tone2": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_light_skin_tone_medium_light_skin_tone": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_tone1_tone3": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_light_skin_tone_medium_skin_tone": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_tone1_tone4": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_tone1_tone5": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_light_skin_tone_dark_skin_tone": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_tone2_tone1": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_medium_light_skin_tone_light_skin_tone": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_tone2": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_medium_light_skin_tone": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_tone2_tone3": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_tone2_tone4": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_tone2_tone5": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_tone3_tone1": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_medium_skin_tone_light_skin_tone": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_tone3_tone2": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_tone3": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_medium_skin_tone": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_tone3_tone4": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_tone3_tone5": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_medium_skin_tone_dark_skin_tone": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_tone4_tone1": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_tone4_tone2": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_tone4_tone3": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_tone4": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_medium_dark_skin_tone": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_tone4_tone5": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_tone5_tone1": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_dark_skin_tone_light_skin_tone": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_tone5_tone2": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_tone5_tone3": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_dark_skin_tone_medium_skin_tone": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_tone5_tone4": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_tone5": "🧑🏿‍🤝‍🧑🏿", + "people_holding_hands_dark_skin_tone": "🧑🏿‍🤝‍🧑🏿", + "couple": "👫", + "woman_and_man_holding_hands_tone1": "👫🏻", + "woman_and_man_holding_hands_light_skin_tone": "👫🏻", + "woman_and_man_holding_hands_tone1_tone2": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone1_tone3": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone1_tone4": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone1_tone5": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone2_tone1": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone2": "👫🏼", + "woman_and_man_holding_hands_medium_light_skin_tone": "👫🏼", + "woman_and_man_holding_hands_tone2_tone3": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone2_tone4": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone2_tone5": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone3_tone1": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone3_tone2": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone3": "👫🏽", + "woman_and_man_holding_hands_medium_skin_tone": "👫🏽", + "woman_and_man_holding_hands_tone3_tone4": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone3_tone5": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone4_tone1": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone4_tone2": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone4_tone3": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone4": "👫🏾", + "woman_and_man_holding_hands_medium_dark_skin_tone": "👫🏾", + "woman_and_man_holding_hands_tone4_tone5": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone5_tone1": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone5_tone2": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone5_tone3": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone5_tone4": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone5": "👫🏿", + "woman_and_man_holding_hands_dark_skin_tone": "👫🏿", + "two_women_holding_hands": "👭", + "women_holding_hands_tone1": "👭🏻", + "women_holding_hands_light_skin_tone": "👭🏻", + "women_holding_hands_tone1_tone2": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_tone1_tone3": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_tone1_tone4": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_tone1_tone5": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_tone2_tone1": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_tone2": "👭🏼", + "women_holding_hands_medium_light_skin_tone": "👭🏼", + "women_holding_hands_tone2_tone3": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_tone2_tone4": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_tone2_tone5": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_tone3_tone1": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_tone3_tone2": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_tone3": "👭🏽", + "women_holding_hands_medium_skin_tone": "👭🏽", + "women_holding_hands_tone3_tone4": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_tone3_tone5": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_tone4_tone1": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_tone4_tone2": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_tone4_tone3": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_tone4": "👭🏾", + "women_holding_hands_medium_dark_skin_tone": "👭🏾", + "women_holding_hands_tone4_tone5": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_tone5_tone1": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_tone5_tone2": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_tone5_tone3": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_tone5_tone4": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_tone5": "👭🏿", + "women_holding_hands_dark_skin_tone": "👭🏿", + "two_men_holding_hands": "👬", + "men_holding_hands_tone1": "👬🏻", + "men_holding_hands_light_skin_tone": "👬🏻", + "men_holding_hands_tone1_tone2": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_light_skin_tone_medium_light_skin_tone": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_tone1_tone3": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_light_skin_tone_medium_skin_tone": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_tone1_tone4": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_light_skin_tone_medium_dark_skin_tone": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_tone1_tone5": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_light_skin_tone_dark_skin_tone": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_tone2_tone1": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_medium_light_skin_tone_light_skin_tone": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_tone2": "👬🏼", + "men_holding_hands_medium_light_skin_tone": "👬🏼", + "men_holding_hands_tone2_tone3": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_medium_light_skin_tone_medium_skin_tone": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_tone2_tone4": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_tone2_tone5": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_medium_light_skin_tone_dark_skin_tone": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_tone3_tone1": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_medium_skin_tone_light_skin_tone": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_tone3_tone2": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_medium_skin_tone_medium_light_skin_tone": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_tone3": "👬🏽", + "men_holding_hands_medium_skin_tone": "👬🏽", + "men_holding_hands_tone3_tone4": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_tone3_tone5": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_medium_skin_tone_dark_skin_tone": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_tone4_tone1": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_medium_dark_skin_tone_light_skin_tone": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_tone4_tone2": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_tone4_tone3": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_tone4": "👬🏾", + "men_holding_hands_medium_dark_skin_tone": "👬🏾", + "men_holding_hands_tone4_tone5": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_tone5_tone1": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_dark_skin_tone_light_skin_tone": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_tone5_tone2": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_dark_skin_tone_medium_light_skin_tone": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_tone5_tone3": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_dark_skin_tone_medium_skin_tone": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_tone5_tone4": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_tone5": "👬🏿", + "men_holding_hands_dark_skin_tone": "👬🏿", + "couple_with_heart": "💑", + "couple_with_heart_woman_man": "👩‍❤️‍👨", + "couple_ww": "👩‍❤️‍👩", + "couple_with_heart_ww": "👩‍❤️‍👩", + "couple_mm": "👨‍❤️‍👨", + "couple_with_heart_mm": "👨‍❤️‍👨", + "couplekiss": "💏", + "kiss_woman_man": "👩‍❤️‍💋‍👨", + "kiss_ww": "👩‍❤️‍💋‍👩", + "couplekiss_ww": "👩‍❤️‍💋‍👩", + "kiss_mm": "👨‍❤️‍💋‍👨", + "couplekiss_mm": "👨‍❤️‍💋‍👨", + "family": "👪", + "family_man_woman_boy": "👨‍👩‍👦", + "family_mwg": "👨‍👩‍👧", + "family_mwgb": "👨‍👩‍👧‍👦", + "family_mwbb": "👨‍👩‍👦‍👦", + "family_mwgg": "👨‍👩‍👧‍👧", + "family_wwb": "👩‍👩‍👦", + "family_wwg": "👩‍👩‍👧", + "family_wwgb": "👩‍👩‍👧‍👦", + "family_wwbb": "👩‍👩‍👦‍👦", + "family_wwgg": "👩‍👩‍👧‍👧", + "family_mmb": "👨‍👨‍👦", + "family_mmg": "👨‍👨‍👧", + "family_mmgb": "👨‍👨‍👧‍👦", + "family_mmbb": "👨‍👨‍👦‍👦", + "family_mmgg": "👨‍👨‍👧‍👧", + "family_woman_boy": "👩‍👦", + "family_woman_girl": "👩‍👧", + "family_woman_girl_boy": "👩‍👧‍👦", + "family_woman_boy_boy": "👩‍👦‍👦", + "family_woman_girl_girl": "👩‍👧‍👧", + "family_man_boy": "👨‍👦", + "family_man_girl": "👨‍👧", + "family_man_girl_boy": "👨‍👧‍👦", + "family_man_boy_boy": "👨‍👦‍👦", + "family_man_girl_girl": "👨‍👧‍👧", + "yarn": "🧶", + "thread": "🧵", + "coat": "🧥", + "lab_coat": "🥼", + "safety_vest": "🦺", + "womans_clothes": "👚", + "shirt": "👕", + "jeans": "👖", + "briefs": "🩲", + "shorts": "🩳", + "necktie": "👔", + "dress": "👗", + "bikini": "👙", + "one_piece_swimsuit": "🩱", + "kimono": "👘", + "sari": "🥻", + "womans_flat_shoe": "🥿", + "high_heel": "👠", + "sandal": "👡", + "boot": "👢", + "mans_shoe": "👞", + "athletic_shoe": "👟", + "hiking_boot": "🥾", + "thong_sandal": "🩴", + "socks": "🧦", + "gloves": "🧤", + "scarf": "🧣", + "tophat": "🎩", + "billed_cap": "🧢", + "womans_hat": "👒", + "mortar_board": "🎓", + "helmet_with_cross": "⛑️", + "helmet_with_white_cross": "⛑️", + "military_helmet": "🪖", + "crown": "👑", + "ring": "💍", + "pouch": "👝", + "purse": "👛", + "handbag": "👜", + "briefcase": "💼", + "school_satchel": "🎒", + "luggage": "🧳", + "eyeglasses": "👓", + "dark_sunglasses": "🕶️", + "goggles": "🥽", + "closed_umbrella": "🌂", + "dog": "🐶", + "cat": "🐱", + "mouse": "🐭", + "hamster": "🐹", + "rabbit": "🐰", + "fox": "🦊", + "fox_face": "🦊", + "bear": "🐻", + "panda_face": "🐼", + "polar_bear": "🐻‍❄️", + "koala": "🐨", + "tiger": "🐯", + "lion_face": "🦁", + "lion": "🦁", + "cow": "🐮", + "pig": "🐷", + "pig_nose": "🐽", + "frog": "🐸", + "monkey_face": "🐵", + "see_no_evil": "🙈", + "hear_no_evil": "🙉", + "speak_no_evil": "🙊", + "monkey": "🐒", + "chicken": "🐔", + "penguin": "🐧", + "bird": "🐦", + "baby_chick": "🐤", + "hatching_chick": "🐣", + "hatched_chick": "🐥", + "duck": "🦆", + "dodo": "🦤", + "eagle": "🦅", + "owl": "🦉", + "bat": "🦇", + "wolf": "🐺", + "boar": "🐗", + "horse": "🐴", + "unicorn": "🦄", + "unicorn_face": "🦄", + "bee": "🐝", + "bug": "🐛", + "butterfly": "🦋", + "snail": "🐌", + "worm": "🪱", + "lady_beetle": "🐞", + "ant": "🐜", + "fly": "🪰", + "mosquito": "🦟", + "cockroach": "🪳", + "beetle": "🪲", + "cricket": "🦗", + "spider": "🕷️", + "spider_web": "🕸️", + "scorpion": "🦂", + "turtle": "🐢", + "snake": "🐍", + "lizard": "🦎", + "t_rex": "🦖", + "sauropod": "🦕", + "octopus": "🐙", + "squid": "🦑", + "shrimp": "🦐", + "lobster": "🦞", + "crab": "🦀", + "blowfish": "🐡", + "tropical_fish": "🐠", + "fish": "🐟", + "seal": "🦭", + "dolphin": "🐬", + "whale": "🐳", + "whale2": "🐋", + "shark": "🦈", + "crocodile": "🐊", + "tiger2": "🐅", + "leopard": "🐆", + "zebra": "🦓", + "gorilla": "🦍", + "orangutan": "🦧", + "elephant": "🐘", + "mammoth": "🦣", + "bison": "🦬", + "hippopotamus": "🦛", + "rhino": "🦏", + "rhinoceros": "🦏", + "dromedary_camel": "🐪", + "camel": "🐫", + "giraffe": "🦒", + "kangaroo": "🦘", + "water_buffalo": "🐃", + "ox": "🐂", + "cow2": "🐄", + "racehorse": "🐎", + "pig2": "🐖", + "ram": "🐏", + "sheep": "🐑", + "llama": "🦙", + "goat": "🐐", + "deer": "🦌", + "dog2": "🐕", + "poodle": "🐩", + "guide_dog": "🦮", + "service_dog": "🐕‍🦺", + "cat2": "🐈", + "black_cat": "🐈‍⬛", + "rooster": "🐓", + "turkey": "🦃", + "peacock": "🦚", + "parrot": "🦜", + "swan": "🦢", + "flamingo": "🦩", + "dove": "🕊️", + "dove_of_peace": "🕊️", + "rabbit2": "🐇", + "raccoon": "🦝", + "skunk": "🦨", + "badger": "🦡", + "beaver": "🦫", + "otter": "🦦", + "sloth": "🦥", + "mouse2": "🐁", + "rat": "🐀", + "chipmunk": "🐿️", + "hedgehog": "🦔", + "feet": "🐾", + "paw_prints": "🐾", + "dragon": "🐉", + "dragon_face": "🐲", + "cactus": "🌵", + "christmas_tree": "🎄", + "evergreen_tree": "🌲", + "deciduous_tree": "🌳", + "palm_tree": "🌴", + "seedling": "🌱", + "herb": "🌿", + "shamrock": "☘️", + "four_leaf_clover": "🍀", + "bamboo": "🎍", + "tanabata_tree": "🎋", + "leaves": "🍃", + "fallen_leaf": "🍂", + "maple_leaf": "🍁", + "feather": "🪶", + "mushroom": "🍄", + "shell": "🐚", + "rock": "🪨", + "wood": "🪵", + "ear_of_rice": "🌾", + "potted_plant": "🪴", + "bouquet": "💐", + "tulip": "🌷", + "rose": "🌹", + "wilted_rose": "🥀", + "wilted_flower": "🥀", + "wink": "😉", + "unamused": "😒", + "sweat_smile": "😅", + "sweat": "😓", + "sunglasses": "😎", + "stuck_out_tongue": "😛", + "sob": "😭", + "smiling_imp": "😈", + "slight_smile": "🙂", + "pensive": "😔", + "angry": "😠", + "blush": "😊", + "confused": "😕", + "cry": "😢", + "frowning": "😦", + "frowning2": "☹️", + "imp": "👿", + "innocent": "😇", + "joy": "😂", + "kissing": "😗", + "laughing": "😆", + "neutral_face": "😐", + "open_mouth": "😮", + "rage": "😡", + "smile": "😄", + "stuck_out_tongue_winking_eye": "😜", + "hibiscus": "🌺", + "cherry_blossom": "🌸", + "blossom": "🌼", + "sunflower": "🌻", + "sun_with_face": "🌞", + "full_moon_with_face": "🌝", + "first_quarter_moon_with_face": "🌛", + "last_quarter_moon_with_face": "🌜", + "new_moon_with_face": "🌚", + "full_moon": "🌕", + "waning_gibbous_moon": "🌖", + "last_quarter_moon": "🌗", + "waning_crescent_moon": "🌘", + "new_moon": "🌑", + "waxing_crescent_moon": "🌒", + "first_quarter_moon": "🌓", + "waxing_gibbous_moon": "🌔", + "crescent_moon": "🌙", + "earth_americas": "🌎", + "earth_africa": "🌍", + "earth_asia": "🌏", + "ringed_planet": "🪐", + "dizzy": "💫", + "star": "⭐", + "star2": "🌟", + "sparkles": "✨", + "zap": "⚡", + "comet": "☄️", + "boom": "💥", + "fire": "🔥", + "flame": "🔥", + "cloud_tornado": "🌪️", + "cloud_with_tornado": "🌪️", + "rainbow": "🌈", + "sunny": "☀️", + "white_sun_small_cloud": "🌤️", + "white_sun_with_small_cloud": "🌤️", + "partly_sunny": "⛅", + "white_sun_cloud": "🌥️", + "white_sun_behind_cloud": "🌥️", + "cloud": "☁️", + "white_sun_rain_cloud": "🌦️", + "white_sun_behind_cloud_with_rain": "🌦️", + "cloud_rain": "🌧️", + "cloud_with_rain": "🌧️", + "thunder_cloud_rain": "⛈️", + "thunder_cloud_and_rain": "⛈️", + "cloud_lightning": "🌩️", + "cloud_with_lightning": "🌩️", + "cloud_snow": "🌨️", + "cloud_with_snow": "🌨️", + "snowflake": "❄️", + "snowman2": "☃️", + "snowman": "⛄", + "wind_blowing_face": "🌬️", + "dash": "💨", + "droplet": "💧", + "sweat_drops": "💦", + "umbrella": "☔", + "umbrella2": "☂️", + "ocean": "🌊", + "fog": "🌫️", + "green_apple": "🍏", + "apple": "🍎", + "pear": "🍐", + "tangerine": "🍊", + "lemon": "🍋", + "banana": "🍌", + "watermelon": "🍉", + "grapes": "🍇", + "blueberries": "🫐", + "strawberry": "🍓", + "melon": "🍈", + "cherries": "🍒", + "peach": "🍑", + "mango": "🥭", + "pineapple": "🍍", + "coconut": "🥥", + "kiwi": "🥝", + "kiwifruit": "🥝", + "tomato": "🍅", + "eggplant": "🍆", + "avocado": "🥑", + "olive": "🫒", + "broccoli": "🥦", + "leafy_green": "🥬", + "bell_pepper": "🫑", + "cucumber": "🥒", + "hot_pepper": "🌶️", + "corn": "🌽", + "carrot": "🥕", + "garlic": "🧄", + "onion": "🧅", + "potato": "🥔", + "sweet_potato": "🍠", + "croissant": "🥐", + "bagel": "🥯", + "bread": "🍞", + "french_bread": "🥖", + "baguette_bread": "🥖", + "flatbread": "🫓", + "pretzel": "🥨", + "cheese": "🧀", + "cheese_wedge": "🧀", + "egg": "🥚", + "cooking": "🍳", + "butter": "🧈", + "pancakes": "🥞", + "waffle": "🧇", + "bacon": "🥓", + "cut_of_meat": "🥩", + "poultry_leg": "🍗", + "meat_on_bone": "🍖", + "hotdog": "🌭", + "hot_dog": "🌭", + "hamburger": "🍔", + "fries": "🍟", + "pizza": "🍕", + "sandwich": "🥪", + "stuffed_flatbread": "🥙", + "stuffed_pita": "🥙", + "falafel": "🧆", + "taco": "🌮", + "burrito": "🌯", + "tamale": "🫔", + "salad": "🥗", + "green_salad": "🥗", + "shallow_pan_of_food": "🥘", + "paella": "🥘", + "fondue": "🫕", + "canned_food": "🥫", + "spaghetti": "🍝", + "ramen": "🍜", + "stew": "🍲", + "curry": "🍛", + "sushi": "🍣", + "bento": "🍱", + "dumpling": "🥟", + "oyster": "🦪", + "fried_shrimp": "🍤", + "rice_ball": "🍙", + "rice": "🍚", + "rice_cracker": "🍘", + "fish_cake": "🍥", + "fortune_cookie": "🥠", + "moon_cake": "🥮", + "oden": "🍢", + "dango": "🍡", + "shaved_ice": "🍧", + "ice_cream": "🍨", + "icecream": "🍦", + "pie": "🥧", + "cupcake": "🧁", + "cake": "🍰", + "birthday": "🎂", + "custard": "🍮", + "pudding": "🍮", + "flan": "🍮", + "lollipop": "🍭", + "candy": "🍬", + "chocolate_bar": "🍫", + "popcorn": "🍿", + "doughnut": "🍩", + "cookie": "🍪", + "chestnut": "🌰", + "peanuts": "🥜", + "shelled_peanut": "🥜", + "honey_pot": "🍯", + "milk": "🥛", + "glass_of_milk": "🥛", + "baby_bottle": "🍼", + "coffee": "☕", + "tea": "🍵", + "teapot": "🫖", + "mate": "🧉", + "bubble_tea": "🧋", + "beverage_box": "🧃", + "cup_with_straw": "🥤", + "sake": "🍶", + "beer": "🍺", + "beers": "🍻", + "champagne_glass": "🥂", + "clinking_glass": "🥂", + "wine_glass": "🍷", + "tumbler_glass": "🥃", + "whisky": "🥃", + "cocktail": "🍸", + "tropical_drink": "🍹", + "champagne": "🍾", + "bottle_with_popping_cork": "🍾", + "ice_cube": "🧊", + "spoon": "🥄", + "fork_and_knife": "🍴", + "fork_knife_plate": "🍽️", + "fork_and_knife_with_plate": "🍽️", + "bowl_with_spoon": "🥣", + "takeout_box": "🥡", + "chopsticks": "🥢", + "salt": "🧂", + "soccer": "⚽", + "basketball": "🏀", + "football": "🏈", + "baseball": "⚾", + "softball": "🥎", + "tennis": "🎾", + "volleyball": "🏐", + "rugby_football": "🏉", + "flying_disc": "🥏", + "boomerang": "🪃", + "8ball": "🎱", + "yo_yo": "🪀", + "ping_pong": "🏓", + "table_tennis": "🏓", + "badminton": "🏸", + "hockey": "🏒", + "field_hockey": "🏑", + "lacrosse": "🥍", + "cricket_game": "🏏", + "cricket_bat_ball": "🏏", + "goal": "🥅", + "goal_net": "🥅", + "golf": "⛳", + "kite": "🪁", + "bow_and_arrow": "🏹", + "archery": "🏹", + "fishing_pole_and_fish": "🎣", + "diving_mask": "🤿", + "boxing_glove": "🥊", + "boxing_gloves": "🥊", + "martial_arts_uniform": "🥋", + "karate_uniform": "🥋", + "running_shirt_with_sash": "🎽", + "skateboard": "🛹", + "roller_skate": "🛼", + "sled": "🛷", + "ice_skate": "⛸️", + "curling_stone": "🥌", + "ski": "🎿", + "skier": "⛷️", + "snowboarder": "🏂", + "snowboarder_tone1": "🏂🏻", + "snowboarder_light_skin_tone": "🏂🏻", + "snowboarder_tone2": "🏂🏼", + "snowboarder_medium_light_skin_tone": "🏂🏼", + "snowboarder_tone3": "🏂🏽", + "snowboarder_medium_skin_tone": "🏂🏽", + "snowboarder_tone4": "🏂🏾", + "snowboarder_medium_dark_skin_tone": "🏂🏾", + "snowboarder_tone5": "🏂🏿", + "snowboarder_dark_skin_tone": "🏂🏿", + "parachute": "🪂", + "person_lifting_weights": "🏋️", + "lifter": "🏋️", + "weight_lifter": "🏋️", + "person_lifting_weights_tone1": "🏋🏻", + "lifter_tone1": "🏋🏻", + "weight_lifter_tone1": "🏋🏻", + "person_lifting_weights_tone2": "🏋🏼", + "lifter_tone2": "🏋🏼", + "weight_lifter_tone2": "🏋🏼", + "person_lifting_weights_tone3": "🏋🏽", + "lifter_tone3": "🏋🏽", + "weight_lifter_tone3": "🏋🏽", + "person_lifting_weights_tone4": "🏋🏾", + "lifter_tone4": "🏋🏾", + "weight_lifter_tone4": "🏋🏾", + "person_lifting_weights_tone5": "🏋🏿", + "lifter_tone5": "🏋🏿", + "weight_lifter_tone5": "🏋🏿", + "woman_lifting_weights": "🏋️‍♀️", + "woman_lifting_weights_tone1": "🏋🏻‍♀️", + "woman_lifting_weights_light_skin_tone": "🏋🏻‍♀️", + "woman_lifting_weights_tone2": "🏋🏼‍♀️", + "woman_lifting_weights_medium_light_skin_tone": "🏋🏼‍♀️", + "woman_lifting_weights_tone3": "🏋🏽‍♀️", + "woman_lifting_weights_medium_skin_tone": "🏋🏽‍♀️", + "woman_lifting_weights_tone4": "🏋🏾‍♀️", + "woman_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♀️", + "woman_lifting_weights_tone5": "🏋🏿‍♀️", + "woman_lifting_weights_dark_skin_tone": "🏋🏿‍♀️", + "man_lifting_weights": "🏋️‍♂️", + "man_lifting_weights_tone1": "🏋🏻‍♂️", + "man_lifting_weights_light_skin_tone": "🏋🏻‍♂️", + "man_lifting_weights_tone2": "🏋🏼‍♂️", + "man_lifting_weights_medium_light_skin_tone": "🏋🏼‍♂️", + "man_lifting_weights_tone3": "🏋🏽‍♂️", + "man_lifting_weights_medium_skin_tone": "🏋🏽‍♂️", + "man_lifting_weights_tone4": "🏋🏾‍♂️", + "man_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♂️", + "man_lifting_weights_tone5": "🏋🏿‍♂️", + "man_lifting_weights_dark_skin_tone": "🏋🏿‍♂️", + "people_wrestling": "🤼", + "wrestlers": "🤼", + "wrestling": "🤼", + "women_wrestling": "🤼‍♀️", + "men_wrestling": "🤼‍♂️", + "person_doing_cartwheel": "🤸", + "cartwheel": "🤸", + "person_doing_cartwheel_tone1": "🤸🏻", + "cartwheel_tone1": "🤸🏻", + "person_doing_cartwheel_tone2": "🤸🏼", + "cartwheel_tone2": "🤸🏼", + "person_doing_cartwheel_tone3": "🤸🏽", + "cartwheel_tone3": "🤸🏽", + "person_doing_cartwheel_tone4": "🤸🏾", + "cartwheel_tone4": "🤸🏾", + "person_doing_cartwheel_tone5": "🤸🏿", + "cartwheel_tone5": "🤸🏿", + "woman_cartwheeling": "🤸‍♀️", + "woman_cartwheeling_tone1": "🤸🏻‍♀️", + "woman_cartwheeling_light_skin_tone": "🤸🏻‍♀️", + "woman_cartwheeling_tone2": "🤸🏼‍♀️", + "woman_cartwheeling_medium_light_skin_tone": "🤸🏼‍♀️", + "woman_cartwheeling_tone3": "🤸🏽‍♀️", + "woman_cartwheeling_medium_skin_tone": "🤸🏽‍♀️", + "woman_cartwheeling_tone4": "🤸🏾‍♀️", + "woman_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♀️", + "woman_cartwheeling_tone5": "🤸🏿‍♀️", + "woman_cartwheeling_dark_skin_tone": "🤸🏿‍♀️", + "man_cartwheeling": "🤸‍♂️", + "man_cartwheeling_tone1": "🤸🏻‍♂️", + "man_cartwheeling_light_skin_tone": "🤸🏻‍♂️", + "man_cartwheeling_tone2": "🤸🏼‍♂️", + "man_cartwheeling_medium_light_skin_tone": "🤸🏼‍♂️", + "man_cartwheeling_tone3": "🤸🏽‍♂️", + "man_cartwheeling_medium_skin_tone": "🤸🏽‍♂️", + "man_cartwheeling_tone4": "🤸🏾‍♂️", + "man_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♂️", + "man_cartwheeling_tone5": "🤸🏿‍♂️", + "man_cartwheeling_dark_skin_tone": "🤸🏿‍♂️", + "person_bouncing_ball": "⛹️", + "basketball_player": "⛹️", + "person_with_ball": "⛹️", + "person_bouncing_ball_tone1": "⛹🏻", + "basketball_player_tone1": "⛹🏻", + "person_with_ball_tone1": "⛹🏻", + "person_bouncing_ball_tone2": "⛹🏼", + "basketball_player_tone2": "⛹🏼", + "person_with_ball_tone2": "⛹🏼", + "person_bouncing_ball_tone3": "⛹🏽", + "basketball_player_tone3": "⛹🏽", + "person_with_ball_tone3": "⛹🏽", + "person_bouncing_ball_tone4": "⛹🏾", + "basketball_player_tone4": "⛹🏾", + "person_with_ball_tone4": "⛹🏾", + "person_bouncing_ball_tone5": "⛹🏿", + "basketball_player_tone5": "⛹🏿", + "person_with_ball_tone5": "⛹🏿", + "woman_bouncing_ball": "⛹️‍♀️", + "woman_bouncing_ball_tone1": "⛹🏻‍♀️", + "woman_bouncing_ball_light_skin_tone": "⛹🏻‍♀️", + "woman_bouncing_ball_tone2": "⛹🏼‍♀️", + "woman_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♀️", + "woman_bouncing_ball_tone3": "⛹🏽‍♀️", + "woman_bouncing_ball_medium_skin_tone": "⛹🏽‍♀️", + "woman_bouncing_ball_tone4": "⛹🏾‍♀️", + "woman_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♀️", + "woman_bouncing_ball_tone5": "⛹🏿‍♀️", + "woman_bouncing_ball_dark_skin_tone": "⛹🏿‍♀️", + "man_bouncing_ball": "⛹️‍♂️", + "man_bouncing_ball_tone1": "⛹🏻‍♂️", + "man_bouncing_ball_light_skin_tone": "⛹🏻‍♂️", + "man_bouncing_ball_tone2": "⛹🏼‍♂️", + "man_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♂️", + "man_bouncing_ball_tone3": "⛹🏽‍♂️", + "man_bouncing_ball_medium_skin_tone": "⛹🏽‍♂️", + "man_bouncing_ball_tone4": "⛹🏾‍♂️", + "man_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♂️", + "man_bouncing_ball_tone5": "⛹🏿‍♂️", + "man_bouncing_ball_dark_skin_tone": "⛹🏿‍♂️", + "person_fencing": "🤺", + "fencer": "🤺", + "fencing": "🤺", + "person_playing_handball": "🤾", + "handball": "🤾", + "person_playing_handball_tone1": "🤾🏻", + "handball_tone1": "🤾🏻", + "person_playing_handball_tone2": "🤾🏼", + "handball_tone2": "🤾🏼", + "person_playing_handball_tone3": "🤾🏽", + "handball_tone3": "🤾🏽", + "person_playing_handball_tone4": "🤾🏾", + "handball_tone4": "🤾🏾", + "person_playing_handball_tone5": "🤾🏿", + "handball_tone5": "🤾🏿", + "woman_playing_handball": "🤾‍♀️", + "woman_playing_handball_tone1": "🤾🏻‍♀️", + "woman_playing_handball_light_skin_tone": "🤾🏻‍♀️", + "woman_playing_handball_tone2": "🤾🏼‍♀️", + "woman_playing_handball_medium_light_skin_tone": "🤾🏼‍♀️", + "woman_playing_handball_tone3": "🤾🏽‍♀️", + "woman_playing_handball_medium_skin_tone": "🤾🏽‍♀️", + "woman_playing_handball_tone4": "🤾🏾‍♀️", + "woman_playing_handball_medium_dark_skin_tone": "🤾🏾‍♀️", + "woman_playing_handball_tone5": "🤾🏿‍♀️", + "woman_playing_handball_dark_skin_tone": "🤾🏿‍♀️", + "man_playing_handball": "🤾‍♂️", + "man_playing_handball_tone1": "🤾🏻‍♂️", + "man_playing_handball_light_skin_tone": "🤾🏻‍♂️", + "man_playing_handball_tone2": "🤾🏼‍♂️", + "man_playing_handball_medium_light_skin_tone": "🤾🏼‍♂️", + "man_playing_handball_tone3": "🤾🏽‍♂️", + "man_playing_handball_medium_skin_tone": "🤾🏽‍♂️", + "man_playing_handball_tone4": "🤾🏾‍♂️", + "man_playing_handball_medium_dark_skin_tone": "🤾🏾‍♂️", + "man_playing_handball_tone5": "🤾🏿‍♂️", + "man_playing_handball_dark_skin_tone": "🤾🏿‍♂️", + "person_golfing": "🏌️", + "golfer": "🏌️", + "person_golfing_tone1": "🏌🏻", + "person_golfing_light_skin_tone": "🏌🏻", + "person_golfing_tone2": "🏌🏼", + "person_golfing_medium_light_skin_tone": "🏌🏼", + "person_golfing_tone3": "🏌🏽", + "person_golfing_medium_skin_tone": "🏌🏽", + "person_golfing_tone4": "🏌🏾", + "person_golfing_medium_dark_skin_tone": "🏌🏾", + "person_golfing_tone5": "🏌🏿", + "person_golfing_dark_skin_tone": "🏌🏿", + "woman_golfing": "🏌️‍♀️", + "woman_golfing_tone1": "🏌🏻‍♀️", + "woman_golfing_light_skin_tone": "🏌🏻‍♀️", + "woman_golfing_tone2": "🏌🏼‍♀️", + "woman_golfing_medium_light_skin_tone": "🏌🏼‍♀️", + "woman_golfing_tone3": "🏌🏽‍♀️", + "woman_golfing_medium_skin_tone": "🏌🏽‍♀️", + "woman_golfing_tone4": "🏌🏾‍♀️", + "woman_golfing_medium_dark_skin_tone": "🏌🏾‍♀️", + "woman_golfing_tone5": "🏌🏿‍♀️", + "woman_golfing_dark_skin_tone": "🏌🏿‍♀️", + "man_golfing": "🏌️‍♂️", + "man_golfing_tone1": "🏌🏻‍♂️", + "man_golfing_light_skin_tone": "🏌🏻‍♂️", + "man_golfing_tone2": "🏌🏼‍♂️", + "man_golfing_medium_light_skin_tone": "🏌🏼‍♂️", + "man_golfing_tone3": "🏌🏽‍♂️", + "man_golfing_medium_skin_tone": "🏌🏽‍♂️", + "man_golfing_tone4": "🏌🏾‍♂️", + "man_golfing_medium_dark_skin_tone": "🏌🏾‍♂️", + "man_golfing_tone5": "🏌🏿‍♂️", + "man_golfing_dark_skin_tone": "🏌🏿‍♂️", + "horse_racing": "🏇", + "horse_racing_tone1": "🏇🏻", + "horse_racing_tone2": "🏇🏼", + "horse_racing_tone3": "🏇🏽", + "horse_racing_tone4": "🏇🏾", + "horse_racing_tone5": "🏇🏿", + "person_in_lotus_position": "🧘", + "person_in_lotus_position_tone1": "🧘🏻", + "person_in_lotus_position_light_skin_tone": "🧘🏻", + "person_in_lotus_position_tone2": "🧘🏼", + "person_in_lotus_position_medium_light_skin_tone": "🧘🏼", + "person_in_lotus_position_tone3": "🧘🏽", + "person_in_lotus_position_medium_skin_tone": "🧘🏽", + "person_in_lotus_position_tone4": "🧘🏾", + "person_in_lotus_position_medium_dark_skin_tone": "🧘🏾", + "person_in_lotus_position_tone5": "🧘🏿", + "person_in_lotus_position_dark_skin_tone": "🧘🏿", + "woman_in_lotus_position": "🧘‍♀️", + "woman_in_lotus_position_tone1": "🧘🏻‍♀️", + "woman_in_lotus_position_light_skin_tone": "🧘🏻‍♀️", + "woman_in_lotus_position_tone2": "🧘🏼‍♀️", + "woman_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♀️", + "woman_in_lotus_position_tone3": "🧘🏽‍♀️", + "woman_in_lotus_position_medium_skin_tone": "🧘🏽‍♀️", + "woman_in_lotus_position_tone4": "🧘🏾‍♀️", + "woman_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♀️", + "woman_in_lotus_position_tone5": "🧘🏿‍♀️", + "woman_in_lotus_position_dark_skin_tone": "🧘🏿‍♀️", + "man_in_lotus_position": "🧘‍♂️", + "man_in_lotus_position_tone1": "🧘🏻‍♂️", + "man_in_lotus_position_light_skin_tone": "🧘🏻‍♂️", + "man_in_lotus_position_tone2": "🧘🏼‍♂️", + "man_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♂️", + "man_in_lotus_position_tone3": "🧘🏽‍♂️", + "man_in_lotus_position_medium_skin_tone": "🧘🏽‍♂️", + "man_in_lotus_position_tone4": "🧘🏾‍♂️", + "man_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♂️", + "man_in_lotus_position_tone5": "🧘🏿‍♂️", + "man_in_lotus_position_dark_skin_tone": "🧘🏿‍♂️", + "person_surfing": "🏄", + "surfer": "🏄", + "person_surfing_tone1": "🏄🏻", + "surfer_tone1": "🏄🏻", + "person_surfing_tone2": "🏄🏼", + "surfer_tone2": "🏄🏼", + "person_surfing_tone3": "🏄🏽", + "surfer_tone3": "🏄🏽", + "person_surfing_tone4": "🏄🏾", + "surfer_tone4": "🏄🏾", + "person_surfing_tone5": "🏄🏿", + "surfer_tone5": "🏄🏿", + "woman_surfing": "🏄‍♀️", + "woman_surfing_tone1": "🏄🏻‍♀️", + "woman_surfing_light_skin_tone": "🏄🏻‍♀️", + "woman_surfing_tone2": "🏄🏼‍♀️", + "woman_surfing_medium_light_skin_tone": "🏄🏼‍♀️", + "woman_surfing_tone3": "🏄🏽‍♀️", + "woman_surfing_medium_skin_tone": "🏄🏽‍♀️", + "woman_surfing_tone4": "🏄🏾‍♀️", + "woman_surfing_medium_dark_skin_tone": "🏄🏾‍♀️", + "woman_surfing_tone5": "🏄🏿‍♀️", + "woman_surfing_dark_skin_tone": "🏄🏿‍♀️", + "man_surfing": "🏄‍♂️", + "man_surfing_tone1": "🏄🏻‍♂️", + "man_surfing_light_skin_tone": "🏄🏻‍♂️", + "man_surfing_tone2": "🏄🏼‍♂️", + "man_surfing_medium_light_skin_tone": "🏄🏼‍♂️", + "man_surfing_tone3": "🏄🏽‍♂️", + "man_surfing_medium_skin_tone": "🏄🏽‍♂️", + "man_surfing_tone4": "🏄🏾‍♂️", + "man_surfing_medium_dark_skin_tone": "🏄🏾‍♂️", + "man_surfing_tone5": "🏄🏿‍♂️", + "man_surfing_dark_skin_tone": "🏄🏿‍♂️", + "person_swimming": "🏊", + "swimmer": "🏊", + "person_swimming_tone1": "🏊🏻", + "swimmer_tone1": "🏊🏻", + "person_swimming_tone2": "🏊🏼", + "swimmer_tone2": "🏊🏼", + "person_swimming_tone3": "🏊🏽", + "swimmer_tone3": "🏊🏽", + "person_swimming_tone4": "🏊🏾", + "swimmer_tone4": "🏊🏾", + "person_swimming_tone5": "🏊🏿", + "swimmer_tone5": "🏊🏿", + "woman_swimming": "🏊‍♀️", + "woman_swimming_tone1": "🏊🏻‍♀️", + "woman_swimming_light_skin_tone": "🏊🏻‍♀️", + "woman_swimming_tone2": "🏊🏼‍♀️", + "woman_swimming_medium_light_skin_tone": "🏊🏼‍♀️", + "woman_swimming_tone3": "🏊🏽‍♀️", + "woman_swimming_medium_skin_tone": "🏊🏽‍♀️", + "woman_swimming_tone4": "🏊🏾‍♀️", + "woman_swimming_medium_dark_skin_tone": "🏊🏾‍♀️", + "woman_swimming_tone5": "🏊🏿‍♀️", + "woman_swimming_dark_skin_tone": "🏊🏿‍♀️", + "man_swimming": "🏊‍♂️", + "man_swimming_tone1": "🏊🏻‍♂️", + "man_swimming_light_skin_tone": "🏊🏻‍♂️", + "man_swimming_tone2": "🏊🏼‍♂️", + "man_swimming_medium_light_skin_tone": "🏊🏼‍♂️", + "man_swimming_tone3": "🏊🏽‍♂️", + "man_swimming_medium_skin_tone": "🏊🏽‍♂️", + "man_swimming_tone4": "🏊🏾‍♂️", + "man_swimming_medium_dark_skin_tone": "🏊🏾‍♂️", + "man_swimming_tone5": "🏊🏿‍♂️", + "man_swimming_dark_skin_tone": "🏊🏿‍♂️", + "person_playing_water_polo": "🤽", + "water_polo": "🤽", + "person_playing_water_polo_tone1": "🤽🏻", + "water_polo_tone1": "🤽🏻", + "person_playing_water_polo_tone2": "🤽🏼", + "water_polo_tone2": "🤽🏼", + "person_playing_water_polo_tone3": "🤽🏽", + "water_polo_tone3": "🤽🏽", + "person_playing_water_polo_tone4": "🤽🏾", + "water_polo_tone4": "🤽🏾", + "person_playing_water_polo_tone5": "🤽🏿", + "water_polo_tone5": "🤽🏿", + "woman_playing_water_polo": "🤽‍♀️", + "woman_playing_water_polo_tone1": "🤽🏻‍♀️", + "woman_playing_water_polo_light_skin_tone": "🤽🏻‍♀️", + "woman_playing_water_polo_tone2": "🤽🏼‍♀️", + "woman_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♀️", + "woman_playing_water_polo_tone3": "🤽🏽‍♀️", + "woman_playing_water_polo_medium_skin_tone": "🤽🏽‍♀️", + "woman_playing_water_polo_tone4": "🤽🏾‍♀️", + "woman_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♀️", + "woman_playing_water_polo_tone5": "🤽🏿‍♀️", + "woman_playing_water_polo_dark_skin_tone": "🤽🏿‍♀️", + "man_playing_water_polo": "🤽‍♂️", + "man_playing_water_polo_tone1": "🤽🏻‍♂️", + "man_playing_water_polo_light_skin_tone": "🤽🏻‍♂️", + "man_playing_water_polo_tone2": "🤽🏼‍♂️", + "man_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♂️", + "man_playing_water_polo_tone3": "🤽🏽‍♂️", + "man_playing_water_polo_medium_skin_tone": "🤽🏽‍♂️", + "man_playing_water_polo_tone4": "🤽🏾‍♂️", + "man_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♂️", + "man_playing_water_polo_tone5": "🤽🏿‍♂️", + "man_playing_water_polo_dark_skin_tone": "🤽🏿‍♂️", + "person_rowing_boat": "🚣", + "rowboat": "🚣", + "person_rowing_boat_tone1": "🚣🏻", + "rowboat_tone1": "🚣🏻", + "person_rowing_boat_tone2": "🚣🏼", + "rowboat_tone2": "🚣🏼", + "person_rowing_boat_tone3": "🚣🏽", + "rowboat_tone3": "🚣🏽", + "person_rowing_boat_tone4": "🚣🏾", + "rowboat_tone4": "🚣🏾", + "person_rowing_boat_tone5": "🚣🏿", + "rowboat_tone5": "🚣🏿", + "woman_rowing_boat": "🚣‍♀️", + "woman_rowing_boat_tone1": "🚣🏻‍♀️", + "woman_rowing_boat_light_skin_tone": "🚣🏻‍♀️", + "woman_rowing_boat_tone2": "🚣🏼‍♀️", + "woman_rowing_boat_medium_light_skin_tone": "🚣🏼‍♀️", + "woman_rowing_boat_tone3": "🚣🏽‍♀️", + "woman_rowing_boat_medium_skin_tone": "🚣🏽‍♀️", + "woman_rowing_boat_tone4": "🚣🏾‍♀️", + "woman_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♀️", + "woman_rowing_boat_tone5": "🚣🏿‍♀️", + "woman_rowing_boat_dark_skin_tone": "🚣🏿‍♀️", + "man_rowing_boat": "🚣‍♂️", + "man_rowing_boat_tone1": "🚣🏻‍♂️", + "man_rowing_boat_light_skin_tone": "🚣🏻‍♂️", + "man_rowing_boat_tone2": "🚣🏼‍♂️", + "man_rowing_boat_medium_light_skin_tone": "🚣🏼‍♂️", + "man_rowing_boat_tone3": "🚣🏽‍♂️", + "man_rowing_boat_medium_skin_tone": "🚣🏽‍♂️", + "man_rowing_boat_tone4": "🚣🏾‍♂️", + "man_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♂️", + "man_rowing_boat_tone5": "🚣🏿‍♂️", + "man_rowing_boat_dark_skin_tone": "🚣🏿‍♂️", + "person_climbing": "🧗", + "person_climbing_tone1": "🧗🏻", + "person_climbing_light_skin_tone": "🧗🏻", + "person_climbing_tone2": "🧗🏼", + "person_climbing_medium_light_skin_tone": "🧗🏼", + "person_climbing_tone3": "🧗🏽", + "person_climbing_medium_skin_tone": "🧗🏽", + "person_climbing_tone4": "🧗🏾", + "person_climbing_medium_dark_skin_tone": "🧗🏾", + "person_climbing_tone5": "🧗🏿", + "person_climbing_dark_skin_tone": "🧗🏿", + "woman_climbing": "🧗‍♀️", + "woman_climbing_tone1": "🧗🏻‍♀️", + "woman_climbing_light_skin_tone": "🧗🏻‍♀️", + "woman_climbing_tone2": "🧗🏼‍♀️", + "woman_climbing_medium_light_skin_tone": "🧗🏼‍♀️", + "woman_climbing_tone3": "🧗🏽‍♀️", + "woman_climbing_medium_skin_tone": "🧗🏽‍♀️", + "woman_climbing_tone4": "🧗🏾‍♀️", + "woman_climbing_medium_dark_skin_tone": "🧗🏾‍♀️", + "woman_climbing_tone5": "🧗🏿‍♀️", + "woman_climbing_dark_skin_tone": "🧗🏿‍♀️", + "man_climbing": "🧗‍♂️", + "man_climbing_tone1": "🧗🏻‍♂️", + "man_climbing_light_skin_tone": "🧗🏻‍♂️", + "man_climbing_tone2": "🧗🏼‍♂️", + "man_climbing_medium_light_skin_tone": "🧗🏼‍♂️", + "man_climbing_tone3": "🧗🏽‍♂️", + "man_climbing_medium_skin_tone": "🧗🏽‍♂️", + "man_climbing_tone4": "🧗🏾‍♂️", + "man_climbing_medium_dark_skin_tone": "🧗🏾‍♂️", + "man_climbing_tone5": "🧗🏿‍♂️", + "man_climbing_dark_skin_tone": "🧗🏿‍♂️", + "person_mountain_biking": "🚵", + "mountain_bicyclist": "🚵", + "person_mountain_biking_tone1": "🚵🏻", + "mountain_bicyclist_tone1": "🚵🏻", + "person_mountain_biking_tone2": "🚵🏼", + "mountain_bicyclist_tone2": "🚵🏼", + "person_mountain_biking_tone3": "🚵🏽", + "mountain_bicyclist_tone3": "🚵🏽", + "person_mountain_biking_tone4": "🚵🏾", + "mountain_bicyclist_tone4": "🚵🏾", + "person_mountain_biking_tone5": "🚵🏿", + "mountain_bicyclist_tone5": "🚵🏿", + "woman_mountain_biking": "🚵‍♀️", + "woman_mountain_biking_tone1": "🚵🏻‍♀️", + "woman_mountain_biking_light_skin_tone": "🚵🏻‍♀️", + "woman_mountain_biking_tone2": "🚵🏼‍♀️", + "woman_mountain_biking_medium_light_skin_tone": "🚵🏼‍♀️", + "woman_mountain_biking_tone3": "🚵🏽‍♀️", + "woman_mountain_biking_medium_skin_tone": "🚵🏽‍♀️", + "woman_mountain_biking_tone4": "🚵🏾‍♀️", + "woman_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♀️", + "woman_mountain_biking_tone5": "🚵🏿‍♀️", + "woman_mountain_biking_dark_skin_tone": "🚵🏿‍♀️", + "man_mountain_biking": "🚵‍♂️", + "man_mountain_biking_tone1": "🚵🏻‍♂️", + "man_mountain_biking_light_skin_tone": "🚵🏻‍♂️", + "man_mountain_biking_tone2": "🚵🏼‍♂️", + "man_mountain_biking_medium_light_skin_tone": "🚵🏼‍♂️", + "man_mountain_biking_tone3": "🚵🏽‍♂️", + "man_mountain_biking_medium_skin_tone": "🚵🏽‍♂️", + "man_mountain_biking_tone4": "🚵🏾‍♂️", + "man_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♂️", + "man_mountain_biking_tone5": "🚵🏿‍♂️", + "man_mountain_biking_dark_skin_tone": "🚵🏿‍♂️", + "person_biking": "🚴", + "bicyclist": "🚴", + "person_biking_tone1": "🚴🏻", + "bicyclist_tone1": "🚴🏻", + "person_biking_tone2": "🚴🏼", + "bicyclist_tone2": "🚴🏼", + "person_biking_tone3": "🚴🏽", + "bicyclist_tone3": "🚴🏽", + "person_biking_tone4": "🚴🏾", + "bicyclist_tone4": "🚴🏾", + "person_biking_tone5": "🚴🏿", + "bicyclist_tone5": "🚴🏿", + "woman_biking": "🚴‍♀️", + "woman_biking_tone1": "🚴🏻‍♀️", + "woman_biking_light_skin_tone": "🚴🏻‍♀️", + "woman_biking_tone2": "🚴🏼‍♀️", + "woman_biking_medium_light_skin_tone": "🚴🏼‍♀️", + "woman_biking_tone3": "🚴🏽‍♀️", + "woman_biking_medium_skin_tone": "🚴🏽‍♀️", + "woman_biking_tone4": "🚴🏾‍♀️", + "woman_biking_medium_dark_skin_tone": "🚴🏾‍♀️", + "woman_biking_tone5": "🚴🏿‍♀️", + "woman_biking_dark_skin_tone": "🚴🏿‍♀️", + "man_biking": "🚴‍♂️", + "man_biking_tone1": "🚴🏻‍♂️", + "man_biking_light_skin_tone": "🚴🏻‍♂️", + "man_biking_tone2": "🚴🏼‍♂️", + "man_biking_medium_light_skin_tone": "🚴🏼‍♂️", + "man_biking_tone3": "🚴🏽‍♂️", + "man_biking_medium_skin_tone": "🚴🏽‍♂️", + "man_biking_tone4": "🚴🏾‍♂️", + "man_biking_medium_dark_skin_tone": "🚴🏾‍♂️", + "man_biking_tone5": "🚴🏿‍♂️", + "man_biking_dark_skin_tone": "🚴🏿‍♂️", + "trophy": "🏆", + "first_place": "🥇", + "first_place_medal": "🥇", + "second_place": "🥈", + "second_place_medal": "🥈", + "third_place": "🥉", + "third_place_medal": "🥉", + "medal": "🏅", + "sports_medal": "🏅", + "military_medal": "🎖️", + "rosette": "🏵️", + "reminder_ribbon": "🎗️", + "ticket": "🎫", + "tickets": "🎟️", + "admission_tickets": "🎟️", + "circus_tent": "🎪", + "person_juggling": "🤹", + "juggling": "🤹", + "juggler": "🤹", + "person_juggling_tone1": "🤹🏻", + "juggling_tone1": "🤹🏻", + "juggler_tone1": "🤹🏻", + "person_juggling_tone2": "🤹🏼", + "juggling_tone2": "🤹🏼", + "juggler_tone2": "🤹🏼", + "person_juggling_tone3": "🤹🏽", + "juggling_tone3": "🤹🏽", + "juggler_tone3": "🤹🏽", + "person_juggling_tone4": "🤹🏾", + "juggling_tone4": "🤹🏾", + "juggler_tone4": "🤹🏾", + "person_juggling_tone5": "🤹🏿", + "juggling_tone5": "🤹🏿", + "juggler_tone5": "🤹🏿", + "woman_juggling": "🤹‍♀️", + "woman_juggling_tone1": "🤹🏻‍♀️", + "woman_juggling_light_skin_tone": "🤹🏻‍♀️", + "woman_juggling_tone2": "🤹🏼‍♀️", + "woman_juggling_medium_light_skin_tone": "🤹🏼‍♀️", + "woman_juggling_tone3": "🤹🏽‍♀️", + "woman_juggling_medium_skin_tone": "🤹🏽‍♀️", + "woman_juggling_tone4": "🤹🏾‍♀️", + "woman_juggling_medium_dark_skin_tone": "🤹🏾‍♀️", + "woman_juggling_tone5": "🤹🏿‍♀️", + "woman_juggling_dark_skin_tone": "🤹🏿‍♀️", + "man_juggling": "🤹‍♂️", + "man_juggling_tone1": "🤹🏻‍♂️", + "man_juggling_light_skin_tone": "🤹🏻‍♂️", + "man_juggling_tone2": "🤹🏼‍♂️", + "man_juggling_medium_light_skin_tone": "🤹🏼‍♂️", + "man_juggling_tone3": "🤹🏽‍♂️", + "man_juggling_medium_skin_tone": "🤹🏽‍♂️", + "man_juggling_tone4": "🤹🏾‍♂️", + "man_juggling_medium_dark_skin_tone": "🤹🏾‍♂️", + "man_juggling_tone5": "🤹🏿‍♂️", + "man_juggling_dark_skin_tone": "🤹🏿‍♂️", + "performing_arts": "🎭", + "ballet_shoes": "🩰", + "art": "🎨", + "clapper": "🎬", + "microphone": "🎤", + "headphones": "🎧", + "musical_score": "🎼", + "musical_keyboard": "🎹", + "drum": "🥁", + "drum_with_drumsticks": "🥁", + "long_drum": "🪘", + "saxophone": "🎷", + "trumpet": "🎺", + "guitar": "🎸", + "banjo": "🪕", + "violin": "🎻", + "accordion": "🪗", + "game_die": "🎲", + "chess_pawn": "♟️", + "dart": "🎯", + "bowling": "🎳", + "video_game": "🎮", + "slot_machine": "🎰", + "jigsaw": "🧩", + "red_car": "🚗", + "taxi": "🚕", + "blue_car": "🚙", + "pickup_truck": "🛻", + "bus": "🚌", + "trolleybus": "🚎", + "race_car": "🏎️", + "racing_car": "🏎️", + "police_car": "🚓", + "ambulance": "🚑", + "fire_engine": "🚒", + "minibus": "🚐", + "truck": "🚚", + "articulated_lorry": "🚛", + "tractor": "🚜", + "probing_cane": "🦯", + "manual_wheelchair": "🦽", + "motorized_wheelchair": "🦼", + "scooter": "🛴", + "bike": "🚲", + "motor_scooter": "🛵", + "motorbike": "🛵", + "motorcycle": "🏍️", + "racing_motorcycle": "🏍️", + "auto_rickshaw": "🛺", + "rotating_light": "🚨", + "oncoming_police_car": "🚔", + "oncoming_bus": "🚍", + "oncoming_automobile": "🚘", + "oncoming_taxi": "🚖", + "aerial_tramway": "🚡", + "mountain_cableway": "🚠", + "suspension_railway": "🚟", + "railway_car": "🚃", + "train": "🚋", + "mountain_railway": "🚞", + "monorail": "🚝", + "bullettrain_side": "🚄", + "bullettrain_front": "🚅", + "light_rail": "🚈", + "steam_locomotive": "🚂", + "train2": "🚆", + "metro": "🚇", + "tram": "🚊", + "station": "🚉", + "airplane": "✈️", + "airplane_departure": "🛫", + "airplane_arriving": "🛬", + "airplane_small": "🛩️", + "small_airplane": "🛩️", + "seat": "💺", + "satellite_orbital": "🛰️", + "rocket": "🚀", + "flying_saucer": "🛸", + "helicopter": "🚁", + "canoe": "🛶", + "kayak": "🛶", + "sailboat": "⛵", + "speedboat": "🚤", + "motorboat": "🛥️", + "cruise_ship": "🛳️", + "passenger_ship": "🛳️", + "ferry": "⛴️", + "ship": "🚢", + "anchor": "⚓", + "fuelpump": "⛽", + "construction": "🚧", + "vertical_traffic_light": "🚦", + "traffic_light": "🚥", + "busstop": "🚏", + "map": "🗺️", + "world_map": "🗺️", + "moyai": "🗿", + "statue_of_liberty": "🗽", + "tokyo_tower": "🗼", + "european_castle": "🏰", + "japanese_castle": "🏯", + "stadium": "🏟️", + "ferris_wheel": "🎡", + "roller_coaster": "🎢", + "carousel_horse": "🎠", + "fountain": "⛲", + "beach_umbrella": "⛱️", + "umbrella_on_ground": "⛱️", + "beach": "🏖️", + "beach_with_umbrella": "🏖️", + "island": "🏝️", + "desert_island": "🏝️", + "desert": "🏜️", + "volcano": "🌋", + "mountain": "⛰️", + "mountain_snow": "🏔️", + "snow_capped_mountain": "🏔️", + "mount_fuji": "🗻", + "camping": "🏕️", + "tent": "⛺", + "house": "🏠", + "house_with_garden": "🏡", + "homes": "🏘️", + "house_buildings": "🏘️", + "house_abandoned": "🏚️", + "derelict_house_building": "🏚️", + "hut": "🛖", + "construction_site": "🏗️", + "building_construction": "🏗️", + "factory": "🏭", + "office": "🏢", + "department_store": "🏬", + "post_office": "🏣", + "european_post_office": "🏤", + "hospital": "🏥", + "bank": "🏦", + "hotel": "🏨", + "convenience_store": "🏪", + "school": "🏫", + "love_hotel": "🏩", + "wedding": "💒", + "classical_building": "🏛️", + "church": "⛪", + "mosque": "🕌", + "synagogue": "🕍", + "hindu_temple": "🛕", + "kaaba": "🕋", + "shinto_shrine": "⛩️", + "railway_track": "🛤️", + "railroad_track": "🛤️", + "motorway": "🛣️", + "japan": "🗾", + "rice_scene": "🎑", + "park": "🏞️", + "national_park": "🏞️", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "stars": "🌠", + "sparkler": "🎇", + "fireworks": "🎆", + "city_sunset": "🌇", + "city_sunrise": "🌇", + "city_dusk": "🌆", + "cityscape": "🏙️", + "night_with_stars": "🌃", + "milky_way": "🌌", + "bridge_at_night": "🌉", + "foggy": "🌁", + "watch": "⌚", + "mobile_phone": "📱", + "iphone": "📱", + "calling": "📲", + "computer": "💻", + "keyboard": "⌨️", + "desktop": "🖥️", + "desktop_computer": "🖥️", + "printer": "🖨️", + "mouse_three_button": "🖱️", + "three_button_mouse": "🖱️", + "trackball": "🖲️", + "joystick": "🕹️", + "compression": "🗜️", + "minidisc": "💽", + "floppy_disk": "💾", + "cd": "💿", + "dvd": "📀", + "vhs": "📼", + "camera": "📷", + "camera_with_flash": "📸", + "video_camera": "📹", + "movie_camera": "🎥", + "projector": "📽️", + "film_projector": "📽️", + "film_frames": "🎞️", + "telephone_receiver": "📞", + "telephone": "☎️", + "pager": "📟", + "fax": "📠", + "tv": "📺", + "radio": "📻", + "microphone2": "🎙️", + "studio_microphone": "🎙️", + "level_slider": "🎚️", + "control_knobs": "🎛️", + "compass": "🧭", + "stopwatch": "⏱️", + "timer": "⏲️", + "timer_clock": "⏲️", + "alarm_clock": "⏰", + "clock": "🕰️", + "mantlepiece_clock": "🕰️", + "hourglass": "⌛", + "hourglass_flowing_sand": "⏳", + "satellite": "📡", + "battery": "🔋", + "electric_plug": "🔌", + "bulb": "💡", + "flashlight": "🔦", + "candle": "🕯️", + "diya_lamp": "🪔", + "fire_extinguisher": "🧯", + "oil": "🛢️", + "oil_drum": "🛢️", + "money_with_wings": "💸", + "dollar": "💵", + "yen": "💴", + "euro": "💶", + "pound": "💷", + "coin": "🪙", + "moneybag": "💰", + "credit_card": "💳", + "gem": "💎", + "scales": "⚖️", + "ladder": "🪜", + "toolbox": "🧰", + "screwdriver": "🪛", + "wrench": "🔧", + "hammer": "🔨", + "hammer_pick": "⚒️", + "hammer_and_pick": "⚒️", + "tools": "🛠️", + "hammer_and_wrench": "🛠️", + "pick": "⛏️", + "nut_and_bolt": "🔩", + "gear": "⚙️", + "bricks": "🧱", + "chains": "⛓️", + "hook": "🪝", + "knot": "🪢", + "magnet": "🧲", + "gun": "🔫", + "bomb": "💣", + "firecracker": "🧨", + "axe": "🪓", + "carpentry_saw": "🪚", + "knife": "🔪", + "dagger": "🗡️", + "dagger_knife": "🗡️", + "crossed_swords": "⚔️", + "shield": "🛡️", + "smoking": "🚬", + "coffin": "⚰️", + "headstone": "🪦", + "urn": "⚱️", + "funeral_urn": "⚱️", + "amphora": "🏺", + "magic_wand": "🪄", + "crystal_ball": "🔮", + "prayer_beads": "📿", + "nazar_amulet": "🧿", + "barber": "💈", + "alembic": "⚗️", + "telescope": "🔭", + "microscope": "🔬", + "hole": "🕳️", + "window": "🪟", + "adhesive_bandage": "🩹", + "stethoscope": "🩺", + "pill": "💊", + "syringe": "💉", + "drop_of_blood": "🩸", + "dna": "🧬", + "microbe": "🦠", + "petri_dish": "🧫", + "test_tube": "🧪", + "thermometer": "🌡️", + "mouse_trap": "🪤", + "broom": "🧹", + "basket": "🧺", + "sewing_needle": "🪡", + "roll_of_paper": "🧻", + "toilet": "🚽", + "plunger": "🪠", + "bucket": "🪣", + "potable_water": "🚰", + "shower": "🚿", + "bathtub": "🛁", + "bath": "🛀", + "bath_tone1": "🛀🏻", + "bath_tone2": "🛀🏼", + "bath_tone3": "🛀🏽", + "bath_tone4": "🛀🏾", + "bath_tone5": "🛀🏿", + "toothbrush": "🪥", + "soap": "🧼", + "razor": "🪒", + "sponge": "🧽", + "squeeze_bottle": "🧴", + "bellhop": "🛎️", + "bellhop_bell": "🛎️", + "key": "🔑", + "key2": "🗝️", + "old_key": "🗝️", + "door": "🚪", + "chair": "🪑", + "mirror": "🪞", + "couch": "🛋️", + "couch_and_lamp": "🛋️", + "bed": "🛏️", + "sleeping_accommodation": "🛌", + "person_in_bed_tone1": "🛌🏻", + "person_in_bed_light_skin_tone": "🛌🏻", + "person_in_bed_tone2": "🛌🏼", + "person_in_bed_medium_light_skin_tone": "🛌🏼", + "person_in_bed_tone3": "🛌🏽", + "person_in_bed_medium_skin_tone": "🛌🏽", + "person_in_bed_tone4": "🛌🏾", + "person_in_bed_medium_dark_skin_tone": "🛌🏾", + "person_in_bed_tone5": "🛌🏿", + "person_in_bed_dark_skin_tone": "🛌🏿", + "teddy_bear": "🧸", + "frame_photo": "🖼️", + "frame_with_picture": "🖼️", + "shopping_bags": "🛍️", + "shopping_cart": "🛒", + "shopping_trolley": "🛒", + "gift": "🎁", + "balloon": "🎈", + "flags": "🎏", + "ribbon": "🎀", + "confetti_ball": "🎊", + "tada": "🎉", + "piñata": "🪅", + "nesting_dolls": "🪆", + "dolls": "🎎", + "izakaya_lantern": "🏮", + "wind_chime": "🎐", + "red_envelope": "🧧", + "envelope": "✉️", + "envelope_with_arrow": "📩", + "incoming_envelope": "📨", + "e_mail": "📧", + "email": "📧", + "love_letter": "💌", + "inbox_tray": "📥", + "outbox_tray": "📤", + "package": "📦", + "label": "🏷️", + "mailbox_closed": "📪", + "mailbox": "📫", + "mailbox_with_mail": "📬", + "mailbox_with_no_mail": "📭", + "postbox": "📮", + "postal_horn": "📯", + "placard": "🪧", + "scroll": "📜", + "page_with_curl": "📃", + "page_facing_up": "📄", + "bookmark_tabs": "📑", + "receipt": "🧾", + "bar_chart": "📊", + "chart_with_upwards_trend": "📈", + "chart_with_downwards_trend": "📉", + "notepad_spiral": "🗒️", + "spiral_note_pad": "🗒️", + "calendar_spiral": "🗓️", + "spiral_calendar_pad": "🗓️", + "calendar": "📆", + "date": "📅", + "wastebasket": "🗑️", + "card_index": "📇", + "card_box": "🗃️", + "card_file_box": "🗃️", + "ballot_box": "🗳️", + "ballot_box_with_ballot": "🗳️", + "file_cabinet": "🗄️", + "clipboard": "📋", + "file_folder": "📁", + "open_file_folder": "📂", + "dividers": "🗂️", + "card_index_dividers": "🗂️", + "newspaper2": "🗞️", + "rolled_up_newspaper": "🗞️", + "newspaper": "📰", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "ledger": "📒", + "closed_book": "📕", + "green_book": "📗", + "blue_book": "📘", + "orange_book": "📙", + "books": "📚", + "book": "📖", + "bookmark": "🔖", + "safety_pin": "🧷", + "link": "🔗", + "paperclip": "📎", + "paperclips": "🖇️", + "linked_paperclips": "🖇️", + "triangular_ruler": "📐", + "straight_ruler": "📏", + "abacus": "🧮", + "pushpin": "📌", + "round_pushpin": "📍", + "scissors": "✂️", + "pen_ballpoint": "🖊️", + "lower_left_ballpoint_pen": "🖊️", + "pen_fountain": "🖋️", + "lower_left_fountain_pen": "🖋️", + "black_nib": "✒️", + "paintbrush": "🖌️", + "lower_left_paintbrush": "🖌️", + "crayon": "🖍️", + "lower_left_crayon": "🖍️", + "pencil": "📝", + "memo": "📝", + "pencil2": "✏️", + "mag": "🔍", + "mag_right": "🔎", + "lock_with_ink_pen": "🔏", + "closed_lock_with_key": "🔐", + "lock": "🔒", + "unlock": "🔓", + "heart": "❤️", + "orange_heart": "🧡", + "yellow_heart": "💛", + "green_heart": "💚", + "blue_heart": "💙", + "purple_heart": "💜", + "black_heart": "🖤", + "brown_heart": "🤎", + "white_heart": "🤍", + "broken_heart": "💔", + "heart_exclamation": "❣️", + "heavy_heart_exclamation_mark_ornament": "❣️", + "two_hearts": "💕", + "revolving_hearts": "💞", + "heartbeat": "💓", + "heartpulse": "💗", + "sparkling_heart": "💖", + "cupid": "💘", + "gift_heart": "💝", + "heart_decoration": "💟", + "peace": "☮️", + "peace_symbol": "☮️", + "cross": "✝️", + "latin_cross": "✝️", + "star_and_crescent": "☪️", + "om_symbol": "🕉️", + "wheel_of_dharma": "☸️", + "star_of_david": "✡️", + "six_pointed_star": "🔯", + "menorah": "🕎", + "yin_yang": "☯️", + "orthodox_cross": "☦️", + "place_of_worship": "🛐", + "worship_symbol": "🛐", + "ophiuchus": "⛎", + "aries": "♈", + "taurus": "♉", + "gemini": "♊", + "cancer": "♋", + "leo": "♌", + "virgo": "♍", + "libra": "♎", + "scorpius": "♏", + "sagittarius": "♐", + "capricorn": "♑", + "aquarius": "♒", + "pisces": "♓", + "id": "🆔", + "atom": "⚛️", + "atom_symbol": "⚛️", + "accept": "🉑", + "radioactive": "☢️", + "radioactive_sign": "☢️", + "biohazard": "☣️", + "biohazard_sign": "☣️", + "mobile_phone_off": "📴", + "vibration_mode": "📳", + "u6709": "🈶", + "u7121": "🈚", + "u7533": "🈸", + "u55b6": "🈺", + "u6708": "🈷️", + "eight_pointed_black_star": "✴️", + "vs": "🆚", + "white_flower": "💮", + "ideograph_advantage": "🉐", + "secret": "㊙️", + "congratulations": "㊗️", + "u5408": "🈴", + "u6e80": "🈵", + "u5272": "🈹", + "u7981": "🈲", + "a": "🅰️", + "b": "🅱️", + "ab": "🆎", + "cl": "🆑", + "o2": "🅾️", + "sos": "🆘", + "x": "❌", + "o": "⭕", + "octagonal_sign": "🛑", + "stop_sign": "🛑", + "no_entry": "⛔", + "name_badge": "📛", + "no_entry_sign": "🚫", + "100": "💯", + "anger": "💢", + "hotsprings": "♨️", + "no_pedestrians": "🚷", + "do_not_litter": "🚯", + "no_bicycles": "🚳", + "non_potable_water": "🚱", + "underage": "🔞", + "no_mobile_phones": "📵", + "no_smoking": "🚭", + "exclamation": "❗", + "grey_exclamation": "❕", + "question": "❓", + "grey_question": "❔", + "bangbang": "‼️", + "interrobang": "⁉️", + "low_brightness": "🔅", + "high_brightness": "🔆", + "part_alternation_mark": "〽️", + "warning": "⚠️", + "children_crossing": "🚸", + "trident": "🔱", + "fleur_de_lis": "⚜️", + "beginner": "🔰", + "recycle": "♻️", + "white_check_mark": "✅", + "u6307": "🈯", + "chart": "💹", + "sparkle": "❇️", + "eight_spoked_asterisk": "✳️", + "negative_squared_cross_mark": "❎", + "globe_with_meridians": "🌐", + "diamond_shape_with_a_dot_inside": "💠", + "m": "Ⓜ️", + "cyclone": "🌀", + "zzz": "💤", + "atm": "🏧", + "wc": "🚾", + "wheelchair": "♿", + "parking": "🅿️", + "u7a7a": "🈳", + "sa": "🈂️", + "passport_control": "🛂", + "customs": "🛃", + "baggage_claim": "🛄", + "left_luggage": "🛅", + "elevator": "🛗", + "mens": "🚹", + "womens": "🚺", + "baby_symbol": "🚼", + "restroom": "🚻", + "put_litter_in_its_place": "🚮", + "cinema": "🎦", + "signal_strength": "📶", + "koko": "🈁", + "symbols": "🔣", + "information_source": "ℹ️", + "abc": "🔤", + "abcd": "🔡", + "capital_abcd": "🔠", + "ng": "🆖", + "ok": "🆗", + "up": "🆙", + "cool": "🆒", + "new": "🆕", + "free": "🆓", + "zero": "0️⃣", + "one": "1️⃣", + "two": "2️⃣", + "three": "3️⃣", + "four": "4️⃣", + "five": "5️⃣", + "six": "6️⃣", + "seven": "7️⃣", + "eight": "8️⃣", + "nine": "9️⃣", + "keycap_ten": "🔟", + "1234": "🔢", + "hash": "#️⃣", + "asterisk": "*️⃣", + "keycap_asterisk": "*️⃣", + "eject": "⏏️", + "eject_symbol": "⏏️", + "arrow_forward": "▶️", + "pause_button": "⏸️", + "double_vertical_bar": "⏸️", + "play_pause": "⏯️", + "stop_button": "⏹️", + "record_button": "⏺️", + "track_next": "⏭️", + "next_track": "⏭️", + "track_previous": "⏮️", + "previous_track": "⏮️", + "fast_forward": "⏩", + "rewind": "⏪", + "arrow_double_up": "⏫", + "arrow_double_down": "⏬", + "arrow_backward": "◀️", + "arrow_up_small": "🔼", + "arrow_down_small": "🔽", + "arrow_right": "➡️", + "arrow_left": "⬅️", + "arrow_up": "⬆️", + "arrow_down": "⬇️", + "arrow_upper_right": "↗️", + "arrow_lower_right": "↘️", + "arrow_lower_left": "↙️", + "arrow_upper_left": "↖️", + "arrow_up_down": "↕️", + "left_right_arrow": "↔️", + "arrow_right_hook": "↪️", + "leftwards_arrow_with_hook": "↩️", + "arrow_heading_up": "⤴️", + "arrow_heading_down": "⤵️", + "twisted_rightwards_arrows": "🔀", + "repeat": "🔁", + "repeat_one": "🔂", + "arrows_counterclockwise": "🔄", + "arrows_clockwise": "🔃", + "musical_note": "🎵", + "notes": "🎶", + "heavy_plus_sign": "➕", + "heavy_minus_sign": "➖", + "heavy_division_sign": "➗", + "heavy_multiplication_x": "✖️", + "infinity": "♾️", + "heavy_dollar_sign": "💲", + "currency_exchange": "💱", + "tm": "™️", + "copyright": "©️", + "registered": "®️", + "wavy_dash": "〰️", + "curly_loop": "➰", + "loop": "➿", + "end": "🔚", + "back": "🔙", + "on": "🔛", + "top": "🔝", + "soon": "🔜", + "heavy_check_mark": "✔️", + "ballot_box_with_check": "☑️", + "radio_button": "🔘", + "white_circle": "⚪", + "black_circle": "⚫", + "red_circle": "🔴", + "blue_circle": "🔵", + "brown_circle": "🟤", + "purple_circle": "🟣", + "green_circle": "🟢", + "yellow_circle": "🟡", + "orange_circle": "🟠", + "small_red_triangle": "🔺", + "small_red_triangle_down": "🔻", + "small_orange_diamond": "🔸", + "small_blue_diamond": "🔹", + "large_orange_diamond": "🔶", + "large_blue_diamond": "🔷", + "white_square_button": "🔳", + "black_square_button": "🔲", + "black_small_square": "▪️", + "white_small_square": "▫️", + "black_medium_small_square": "◾", + "white_medium_small_square": "◽", + "black_medium_square": "◼️", + "white_medium_square": "◻️", + "black_large_square": "⬛", + "white_large_square": "⬜", + "orange_square": "🟧", + "blue_square": "🟦", + "red_square": "🟥", + "brown_square": "🟫", + "purple_square": "🟪", + "green_square": "🟩", + "yellow_square": "🟨", + "speaker": "🔈", + "mute": "🔇", + "sound": "🔉", + "loud_sound": "🔊", + "bell": "🔔", + "no_bell": "🔕", + "mega": "📣", + "loudspeaker": "📢", + "speech_left": "🗨️", + "left_speech_bubble": "🗨️", + "eye_in_speech_bubble": "👁‍🗨", + "speech_balloon": "💬", + "thought_balloon": "💭", + "anger_right": "🗯️", + "right_anger_bubble": "🗯️", + "spades": "♠️", + "clubs": "♣️", + "hearts": "♥️", + "diamonds": "♦️", + "black_joker": "🃏", + "flower_playing_cards": "🎴", + "mahjong": "🀄", + "clock1": "🕐", + "clock2": "🕑", + "clock3": "🕒", + "clock4": "🕓", + "clock5": "🕔", + "clock6": "🕕", + "clock7": "🕖", + "clock8": "🕗", + "clock9": "🕘", + "clock10": "🕙", + "clock11": "🕚", + "clock12": "🕛", + "clock130": "🕜", + "clock230": "🕝", + "clock330": "🕞", + "clock430": "🕟", + "clock530": "🕠", + "clock630": "🕡", + "clock730": "🕢", + "clock830": "🕣", + "clock930": "🕤", + "clock1030": "🕥", + "clock1130": "🕦", + "clock1230": "🕧", + "female_sign": "♀️", + "male_sign": "♂️", + "transgender_symbol": "⚧", + "medical_symbol": "⚕️", + "regional_indicator_z": "🇿", + "regional_indicator_y": "🇾", + "regional_indicator_x": "🇽", + "regional_indicator_w": "🇼", + "regional_indicator_v": "🇻", + "regional_indicator_u": "🇺", + "regional_indicator_t": "🇹", + "regional_indicator_s": "🇸", + "regional_indicator_r": "🇷", + "regional_indicator_q": "🇶", + "regional_indicator_p": "🇵", + "regional_indicator_o": "🇴", + "regional_indicator_n": "🇳", + "regional_indicator_m": "🇲", + "regional_indicator_l": "🇱", + "regional_indicator_k": "🇰", + "regional_indicator_j": "🇯", + "regional_indicator_i": "🇮", + "regional_indicator_h": "🇭", + "regional_indicator_g": "🇬", + "regional_indicator_f": "🇫", + "regional_indicator_e": "🇪", + "regional_indicator_d": "🇩", + "regional_indicator_c": "🇨", + "regional_indicator_b": "🇧", + "regional_indicator_a": "🇦", + "flag_white": "🏳️", + "flag_black": "🏴", + "checkered_flag": "🏁", + "triangular_flag_on_post": "🚩", + "rainbow_flag": "🏳️‍🌈", + "gay_pride_flag": "🏳️‍🌈", + "transgender_flag": "🏳️‍⚧️", + "pirate_flag": "🏴‍☠️", + "flag_af": "🇦🇫", + "flag_ax": "🇦🇽", + "flag_al": "🇦🇱", + "flag_dz": "🇩🇿", + "flag_as": "🇦🇸", + "flag_ad": "🇦🇩", + "flag_ao": "🇦🇴", + "flag_ai": "🇦🇮", + "flag_aq": "🇦🇶", + "flag_ag": "🇦🇬", + "flag_ar": "🇦🇷", + "flag_am": "🇦🇲", + "flag_aw": "🇦🇼", + "flag_au": "🇦🇺", + "flag_at": "🇦🇹", + "flag_az": "🇦🇿", + "flag_bs": "🇧🇸", + "flag_bh": "🇧🇭", + "flag_bd": "🇧🇩", + "flag_bb": "🇧🇧", + "flag_by": "🇧🇾", + "flag_be": "🇧🇪", + "flag_bz": "🇧🇿", + "flag_bj": "🇧🇯", + "flag_bm": "🇧🇲", + "flag_bt": "🇧🇹", + "flag_bo": "🇧🇴", + "flag_ba": "🇧🇦", + "flag_bw": "🇧🇼", + "flag_br": "🇧🇷", + "flag_io": "🇮🇴", + "flag_vg": "🇻🇬", + "flag_bn": "🇧🇳", + "flag_bg": "🇧🇬", + "flag_bf": "🇧🇫", + "flag_bi": "🇧🇮", + "flag_kh": "🇰🇭", + "flag_cm": "🇨🇲", + "flag_ca": "🇨🇦", + "flag_ic": "🇮🇨", + "flag_cv": "🇨🇻", + "flag_bq": "🇧🇶", + "flag_ky": "🇰🇾", + "flag_cf": "🇨🇫", + "flag_td": "🇹🇩", + "flag_cl": "🇨🇱", + "flag_cn": "🇨🇳", + "flag_cx": "🇨🇽", + "flag_cc": "🇨🇨", + "flag_co": "🇨🇴", + "flag_km": "🇰🇲", + "flag_cg": "🇨🇬", + "flag_cd": "🇨🇩", + "flag_ck": "🇨🇰", + "flag_cr": "🇨🇷", + "flag_ci": "🇨🇮", + "flag_hr": "🇭🇷", + "flag_cu": "🇨🇺", + "flag_cw": "🇨🇼", + "flag_cy": "🇨🇾", + "flag_cz": "🇨🇿", + "flag_dk": "🇩🇰", + "flag_dj": "🇩🇯", + "flag_dm": "🇩🇲", + "flag_do": "🇩🇴", + "flag_ec": "🇪🇨", + "flag_eg": "🇪🇬", + "flag_sv": "🇸🇻", + "flag_gq": "🇬🇶", + "flag_er": "🇪🇷", + "flag_ee": "🇪🇪", + "flag_et": "🇪🇹", + "flag_eu": "🇪🇺", + "flag_fk": "🇫🇰", + "flag_fo": "🇫🇴", + "flag_fj": "🇫🇯", + "flag_fi": "🇫🇮", + "flag_fr": "🇫🇷", + "flag_gf": "🇬🇫", + "flag_pf": "🇵🇫", + "flag_tf": "🇹🇫", + "flag_ga": "🇬🇦", + "flag_gm": "🇬🇲", + "flag_ge": "🇬🇪", + "flag_de": "🇩🇪", + "flag_gh": "🇬🇭", + "flag_gi": "🇬🇮", + "flag_gr": "🇬🇷", + "flag_gl": "🇬🇱", + "flag_gd": "🇬🇩", + "flag_gp": "🇬🇵", + "flag_gu": "🇬🇺", + "flag_gt": "🇬🇹", + "flag_gg": "🇬🇬", + "flag_gn": "🇬🇳", + "flag_gw": "🇬🇼", + "flag_gy": "🇬🇾", + "flag_ht": "🇭🇹", + "flag_hn": "🇭🇳", + "flag_hk": "🇭🇰", + "flag_hu": "🇭🇺", + "flag_is": "🇮🇸", + "flag_in": "🇮🇳", + "flag_id": "🇮🇩", + "flag_ir": "🇮🇷", + "flag_iq": "🇮🇶", + "flag_ie": "🇮🇪", + "flag_im": "🇮🇲", + "flag_il": "🇮🇱", + "flag_it": "🇮🇹", + "flag_jm": "🇯🇲", + "flag_jp": "🇯🇵", + "crossed_flags": "🎌", + "flag_je": "🇯🇪", + "flag_jo": "🇯🇴", + "flag_kz": "🇰🇿", + "flag_ke": "🇰🇪", + "flag_ki": "🇰🇮", + "flag_xk": "🇽🇰", + "flag_kw": "🇰🇼", + "flag_kg": "🇰🇬", + "flag_la": "🇱🇦", + "flag_lv": "🇱🇻", + "flag_lb": "🇱🇧", + "flag_ls": "🇱🇸", + "flag_lr": "🇱🇷", + "flag_ly": "🇱🇾", + "flag_li": "🇱🇮", + "flag_lt": "🇱🇹", + "flag_lu": "🇱🇺", + "flag_mo": "🇲🇴", + "flag_mk": "🇲🇰", + "flag_mg": "🇲🇬", + "flag_mw": "🇲🇼", + "flag_my": "🇲🇾", + "flag_mv": "🇲🇻", + "flag_ml": "🇲🇱", + "flag_mt": "🇲🇹", + "flag_mh": "🇲🇭", + "flag_mq": "🇲🇶", + "flag_mr": "🇲🇷", + "flag_mu": "🇲🇺", + "flag_yt": "🇾🇹", + "flag_mx": "🇲🇽", + "flag_fm": "🇫🇲", + "flag_md": "🇲🇩", + "flag_mc": "🇲🇨", + "flag_mn": "🇲🇳", + "flag_me": "🇲🇪", + "flag_ms": "🇲🇸", + "flag_ma": "🇲🇦", + "flag_mz": "🇲🇿", + "flag_mm": "🇲🇲", + "flag_na": "🇳🇦", + "flag_nr": "🇳🇷", + "flag_np": "🇳🇵", + "flag_nl": "🇳🇱", + "flag_nc": "🇳🇨", + "flag_nz": "🇳🇿", + "flag_ni": "🇳🇮", + "flag_ne": "🇳🇪", + "flag_ng": "🇳🇬", + "flag_nu": "🇳🇺", + "flag_nf": "🇳🇫", + "flag_kp": "🇰🇵", + "flag_mp": "🇲🇵", + "flag_no": "🇳🇴", + "flag_om": "🇴🇲", + "flag_pk": "🇵🇰", + "flag_pw": "🇵🇼", + "flag_ps": "🇵🇸", + "flag_pa": "🇵🇦", + "flag_pg": "🇵🇬", + "flag_py": "🇵🇾", + "flag_pe": "🇵🇪", + "flag_ph": "🇵🇭", + "flag_pn": "🇵🇳", + "flag_pl": "🇵🇱", + "flag_pt": "🇵🇹", + "flag_pr": "🇵🇷", + "flag_qa": "🇶🇦", + "flag_re": "🇷🇪", + "flag_ro": "🇷🇴", + "flag_ru": "🇷🇺", + "flag_rw": "🇷🇼", + "flag_ws": "🇼🇸", + "flag_sm": "🇸🇲", + "flag_st": "🇸🇹", + "flag_sa": "🇸🇦", + "flag_sn": "🇸🇳", + "flag_rs": "🇷🇸", + "flag_sc": "🇸🇨", + "flag_sl": "🇸🇱", + "flag_sg": "🇸🇬", + "flag_sx": "🇸🇽", + "flag_sk": "🇸🇰", + "flag_si": "🇸🇮", + "flag_gs": "🇬🇸", + "flag_sb": "🇸🇧", + "flag_so": "🇸🇴", + "flag_za": "🇿🇦", + "flag_kr": "🇰🇷", + "flag_ss": "🇸🇸", + "flag_es": "🇪🇸", + "flag_lk": "🇱🇰", + "flag_bl": "🇧🇱", + "flag_sh": "🇸🇭", + "flag_kn": "🇰🇳", + "flag_lc": "🇱🇨", + "flag_pm": "🇵🇲", + "flag_vc": "🇻🇨", + "flag_sd": "🇸🇩", + "flag_sr": "🇸🇷", + "flag_sz": "🇸🇿", + "flag_se": "🇸🇪", + "flag_ch": "🇨🇭", + "flag_sy": "🇸🇾", + "flag_tw": "🇹🇼", + "flag_tj": "🇹🇯", + "flag_tz": "🇹🇿", + "flag_th": "🇹🇭", + "flag_tl": "🇹🇱", + "flag_tg": "🇹🇬", + "flag_tk": "🇹🇰", + "flag_to": "🇹🇴", + "flag_tt": "🇹🇹", + "flag_tn": "🇹🇳", + "flag_tr": "🇹🇷", + "flag_tm": "🇹🇲", + "flag_tc": "🇹🇨", + "flag_vi": "🇻🇮", + "flag_tv": "🇹🇻", + "flag_ug": "🇺🇬", + "flag_ua": "🇺🇦", + "flag_ae": "🇦🇪", + "flag_gb": "🇬🇧", + "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "flag_us": "🇺🇸", + "flag_uy": "🇺🇾", + "flag_uz": "🇺🇿", + "flag_vu": "🇻🇺", + "flag_va": "🇻🇦", + "flag_ve": "🇻🇪", + "flag_vn": "🇻🇳", + "flag_wf": "🇼🇫", + "flag_eh": "🇪🇭", + "flag_ye": "🇾🇪", + "flag_zm": "🇿🇲", + "flag_zw": "🇿🇼", + "flag_ac": "🇦🇨", + "flag_bv": "🇧🇻", + "flag_cp": "🇨🇵", + "flag_ea": "🇪🇦", + "flag_dg": "🇩🇬", + "flag_hm": "🇭🇲", + "flag_mf": "🇲🇫", + "flag_sj": "🇸🇯", + "flag_ta": "🇹🇦", + "flag_um": "🇺🇲", + "united_nations": "🇺🇳" +} \ No newline at end of file diff --git a/dashboard/static/js/contact.js b/dashboard/static/js/contact.js new file mode 100644 index 00000000..f981c262 --- /dev/null +++ b/dashboard/static/js/contact.js @@ -0,0 +1,38 @@ +window.onload = () => { + if (window.location.search.includes('full-screen=true')) document.body.classList.add('full-screen'); + const loader = window.top.document.querySelector('.loader'); + if (loader) loader.style.display = 'none'; + document.querySelector('form').addEventListener('submit', e => { + e.preventDefault(); + let name = document.getElementsByName('name')[0], email = document.getElementsByName('email')[0], msg = document.getElementsByName('message')[0]; + if (!msg || !msg.value) return msg.focus(); +var v = grecaptcha.getResponse(); +if(v.length == 0) +{ + document.getElementById('captcha').innerHTML="Invalid Captcha Attempt."; + return false; +} + if(v.length != 0) + {; + + + + document.body.classList.add('done'); + fetch('/contact', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + type: 'contact', + name: name.value || 'name not given', + email: email.value || 'not given', + msg: msg.value, + id: userID || 'not provided' + }) + }) + .then(res => res.ok && document.body.classList.add('done')); + } + }); + +} + + \ No newline at end of file diff --git a/dashboard/static/js/embed-builder.js b/dashboard/static/js/embed-builder.js new file mode 100644 index 00000000..09af9ca9 --- /dev/null +++ b/dashboard/static/js/embed-builder.js @@ -0,0 +1,777 @@ + +// Want to use or contribute to this? https://github.com/Glitchii/embedbuilder +// If you found an issue, please report it, make a P.R, or use the discussion page. Thanks + +var activeFields, colNum = 1, num = 0; +window.onload = () => { + document.querySelectorAll('img.clickable').forEach(e => e.addEventListener('click', el => window.open(el.target.src))); + let editorHolder = document.querySelector('.editorHolder'), + guiParent = document.querySelector('.top'), + embedContent = document.querySelector('.messageContent'), + embedCont = document.querySelector('.messageContent + .container'), + gui = guiParent.querySelector('.gui:first-of-type'), + toRGB = (hex, reversed, integer) => { + if (reversed) return '#' + hex.match(/[\d]+/g).map(x => parseInt(x).toString(16).padStart(2, '0')).join(''); + if (integer) return parseInt(hex.match(/[\d]+/g).map(x => parseInt(x).toString(16).padStart(2, '0')).join(''), 16); + if (hex.includes(',')) return hex.match(/[\d]+/g); + hex = hex.replace('#', '').match(/.{1,2}/g) + return [parseInt(hex[0], 16), parseInt(hex[1], 16), parseInt(hex[2], 16), 1]; + }, json = { + content: "This is a Message Embed <:success:788438144818217000>\nEverything is _Customizable_ including **Emojis**\nYou can~~not~~ also do `this`.```py\nAnd ('this')```", + embed: { + title: "Hello! :wave:", + description: "You can use [links](https://pogy.xyz) or emojis :smile: :eyes:\n```\nAnd also code blocks\n```", + color: 4321431, + timestamp: new Date().toISOString(), + url: "https://pogy.xyz", + author: { + name: "Author name", + url: "https://pogy.xyz", + icon_url: "https://i.imgur.com/sGUVicW.png" + }, + thumbnail: { + url: "https://blog.logomyway.com/wp-content/uploads/2020/12/discord-mascot.png" + }, + image: { + url: "https://1000logos.net/wp-content/uploads/2020/10/Discord-logo.png" + }, + footer: { + text: "This is a footer text", + icon_url: "https://i.imgur.com/sGUVicW.png" + }, + fields: [ + { + name: "Field 1, ~~dolor~~", + value: "This is ***Pog***" + }, + { + name: "Field 2", + value: "You can use custom emojis <:poggers:790133942095183873>", + inline: false + }, + { + name: "Inline field", + value: "Fields can be inline", + inline: true + }, + { + name: "Inline field", + value: "*Inline*", + inline: true + }, + { + name: "Inline field", + value: "value", + inline: true + }, + { + name: "Another field", + value: "> Nope, didn't forget about code blocks", + inline: false + } + ] + } + }; + + window.editor = CodeMirror(elt => editorHolder.parentNode.replaceChild(elt, editorHolder), { + value: JSON.stringify(json, null, 4), + extraKeys: { Tab: cm => cm.replaceSelection(" ", "end") }, + gutters: ["CodeMirror-foldgutter", "CodeMirror-lint-markers"], + scrollbarStyle: "overlay", + mode: "application/json", + theme: 'material-darker', + matchBrackets: true, + foldGutter: true, + lint: true, + }); + + editor.focus(); + + + let notif = document.querySelector('.notification'), + url = (url) => /^(https?:)?\/\//g.exec(url) ? url : '//' + url, + makeShort = (txt, length, mediaWidth) => { + if (mediaWidth && window.matchMedia(`(max-width:${mediaWidth}px)`).matches) + return txt.length > (length - 3) ? txt.substring(0, length - 3) + '...' : txt; + return txt; + }, error = (msg, time) => { + notif.innerHTML = msg, notif.style.display = 'block'; + time && setTimeout(() => notif.animate({ opacity: '0', bottom: '-50px', offset: 1 }, { easing: 'ease', duration: 500 }) + .onfinish = () => notif.style.removeProperty('display'), time); + return false; + }, allGood = e => { + let re = /"((icon_)?url")(: *)("(?!https?:\/\/).+?")/g.exec(editor.getValue()); + if (re) return error(`URL should start with https:// or http:// on this line ${makeShort(re[0], 30, 600)}`); + if (e.timestamp && new Date(e.timestamp).toString() === "Invalid Date") return error('Timestamp is invalid'); + return true; + }, markup = (txt, opts) => { + txt = txt + .replace(/\<:[^:]+:(\d+)\>/g, '') + .replace(/\<a:[^:]+:(\d+)\>/g, '') + .replace(/~~(.+?)~~/g, '$1') + .replace(/\*\*\*(.+?)\*\*\*/g, '$1') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/__(.+?)__/g, '$1') + .replace(/\*(.+?)\*/g, '$1') + .replace(/_(.+?)_/g, '$1') + if (opts.inlineBlock) txt = txt.replace(/\`([^\`]+?)\`|\`\`([^\`]+?)\`\`|\`\`\`((?:\n|.)+?)\`\`\`/g, (m, x, y, z) => x ? `${x}` : y ? `${y}` : z ? `${z}` : m); + else txt = txt.replace(/\`\`\`(\w{1,15})?\n((?:\n|.)+?)\`\`\`|\`\`(.+?)\`\`(?!\`)|\`([^\`]+?)\`/g, (m, w, x, y, z) => w && x ? `
${x}
` : x ? `
${x}
` : y || z ? `${y || z}` : m); + if (opts.inEmbed) txt = txt.replace(/\[([^\[\]]+)\]\((.+?)\)/g, `$1`); + if (opts.replaceEmojis) txt = txt.replace(/(?[^>]+)(? x && emojis[x] ? emojis[x] : match); + txt = txt + .replace(/(?<=\n|^)\s*>\s+([^\n]+)/g, '
$1
') + .replace(/\n/g, '
'); + return txt; + }, + embed = document.querySelector('.embedGrid'), + msgEmbed = document.querySelector('.msgEmbed'), + embedTitle = document.querySelector('.embedTitle'), + embedDescription = document.querySelector('.embedDescription'), + embedAuthor = document.querySelector('.embedAuthor'), + embedFooter = document.querySelector('.embedFooter'), + embedImage = document.querySelector('.embedImage'), + embedThumbnail = document.querySelector('.embedThumbnail'), + embedFields = embed.querySelector('.embedFields'), + encodeHTML = str => str.replace(/[\u00A0-\u9999<>\&]/g, i => '&#' + i.charCodeAt(0) + ';'), + tstamp = stringISO => { + let date = stringISO ? new Date(stringISO) : new Date(), + dateArray = date.toLocaleString('en-US', { hour: 'numeric', hour12: true, minute: 'numeric' }), + today = new Date(), + yesterday = new Date(new Date().setDate(today.getDate() - 1)); + return today.toDateString() === date.toDateString() ? `Today at ${dateArray}` : + yesterday.toDateString() === date.toDateString() ? `Yesterday at ${dateArray}` : + `${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}/${date.getFullYear()}`; + }, display = (el, data, displayType) => { + if (data) el.innerHTML = data; + el.style.display = displayType || "unset"; + }, hide = el => el.style.removeProperty('display'), + imgSrc = (elm, src, remove) => remove ? elm.style.removeProperty('content') : elm.style.content = `url(${src})`, + toObj = jsonString => JSON.parse(jsonString.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (x, y) => y ? "" : x)); + buildGui = (object, opts) => { + + gui.innerHTML = ` +

Message content

+
+ +
+

Author

+
+
+
+ + +
+
+ +
+
+
+ + + +
+
+
+

Title

+ +
+

Description

+
+ +
+

Fields

+
+

Thumbnail

+
+
+
+ +
+ +
+ + + +
+
+
+
+
+

Image

+
+
+
+ +
+ +
+ + + +
+
+
+
+
+ +
+
+
+ + +
+
+ +
+
+
+ + + +
+
`; + + let fieldsEditor = gui.querySelector('.fields ~ .edit'), addField = ` +
+

New Field

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
`; + if (object.embed?.fields) fieldsEditor.innerHTML = object.embed.fields.filter(f => f && typeof f === 'object').map(f => ` +
+
+
+
+ +
+
+ +
+
+
+ +
+
+ + + + + + Remove +
+
`).join('\n') + addField; + else fieldsEditor.innerHTML = addField; + + gui.querySelectorAll('.removeBtn').forEach(e => { + e.addEventListener('click', el => { + fields = gui.querySelector('.fields ~ .edit'); + let field = el.target.closest('.field'); + if (field) { + let i = Array.from(fields.children).indexOf(field), jsonField = object.embed.fields[i]; + if (jsonField) { + object.embed.fields.splice(i, 1); + field.remove(); + update(object); + } + } + }) + }) + + document.querySelectorAll('.gui > .item').forEach(e => { + e.addEventListener('click', el => { + let elm = (el.target.closest('.top>.gui>.item') || el.target); + if (elm.classList.contains('active')) window.getSelection().anchorNode !== elm && elm.classList.remove('active'); + else { + let inlineField = elm.closest('.inlineField'), + input = elm.nextElementSibling.querySelector('input[type="text"]'), + txt = elm.nextElementSibling.querySelector('textarea'); + elm.classList.add('active'); + if (inlineField) inlineField.querySelector('.ttle~input').focus(); + else if (input) { + input.focus(); + input.selectionStart = input.selectionEnd = input.value.length; + } else if (txt) txt.focus(); + elm.classList.contains('fields') && elm.scrollIntoView({ behavior: "smooth", block: "center" }); + } + }) + }) + + content = gui.querySelector('.editContent'); + title = gui.querySelector('.editTitle'); + authorName = gui.querySelector('.editAuthorName'); + authorLink = gui.querySelector('.editAuthorLink'); + desc = gui.querySelector('.editDescription'); + thumbLink = gui.querySelector('.editThumbnailLink'); + imgLink = gui.querySelector('.editImageLink'); + footerText = gui.querySelector('.editFooterText'); + footerLink = gui.querySelector('.editFooterLink'); + fields = gui.querySelector('.fields ~ .edit'); + + document.querySelector('.addField').addEventListener('click', () => { + !json.embed && (json.embed = {}); + let arr = json.embed.fields || []; + if (arr.length >= 25) return error(`You can't have over 25 embed fields.`, 5000); + arr.push({ name: "Field name", value: "Field value", inline: false }); + json.embed.fields = arr; + update(json); + buildGui(json, { newField: true, activate: document.querySelectorAll('.gui > .item.active') }); + }) + + gui.querySelectorAll('textarea, input').forEach(e => e.addEventListener('input', el => { + let v = el.target.value, field = el.target.closest('.field'); + if (field) { + let jsonField = json.embed.fields[Array.from(fields.children).indexOf(field)]; + if (jsonField) { + if (el.target.type === 'text') jsonField.name = v; + else if (el.target.type === 'textarea') jsonField.value = v; + else jsonField.inline = el.target.checked; + } else { + let obj = {} + if (el.target.type === 'text') obj.name = v; + else if (el.target.type === 'textarea') obj.value = v; + else obj.inline = el.target.checked; + json.embed.fields.push(obj); + } + } else { + json.embed ??= {}; + switch (el.target) { + case content: json.content = v; break; + + case title: json.embed.title = v; break; + case authorName: json.embed.author ??= {}, json.embed.author.name = v; break; + case authorLink: json.embed.author ??= {}, json.embed.author.icon_url = v, imgSrc(el.target.previousElementSibling, v); break; + case desc: json.embed.description = v; break; + case thumbLink: json.embed.thumbnail ??= {}, json.embed.thumbnail.url = v, imgSrc(el.target.closest('.editIcon').querySelector('.imgParent'), v); break; + case imgLink: json.embed.image ??= {}, json.embed.image.url = v, imgSrc(el.target.closest('.editIcon').querySelector('.imgParent'), v); break; + case footerText: json.embed.footer ??= {}, json.embed.footer.text = v; break; + case footerLink: json.embed.footer ??= {}, json.embed.footer.icon_url = v, imgSrc(el.target.previousElementSibling, v); break; + } + } + if(json.content){ + if(json.content.length > 2000) { + json.content = json.content.substring(0, 2000); + return error(`Content reached 2000 characters`, 4000) + } + } + + if(json.embed.title){ + if(json.embed.title.length > 256) { + json.embed.title = json.embed.title.substring(0, 256); + return error(`Title reached 256 characters`, 4000) + } + } + + + + if(json.embed.description){ + if(json.embed.description.length > 2048 ) { + json.embed.description = json.embed.description.substring(0, 2048); + return error(`Description reached 2048 characters`, 4000) + } + } + + + + update(json); + })) + + if (opts?.activate) { + let elements = opts.activate; + Array.from(elements).map(el => el.className).map(clss => '.' + clss.split(' ').slice(0, 2).join('.')) + .forEach(clss => document.querySelectorAll(clss) + .forEach(e => e.classList.add('active'))) + } else['.item.author', '.item.description'].forEach(clss => document.querySelector(clss).classList.add('active')); + + if (opts?.newField) { + let last = fields.children[fields.childElementCount - 2], el = last.querySelector('.designerFieldName > input'); + el.setSelectionRange(el.value.length, el.value.length); el.focus(); + last.scrollIntoView({ behavior: "smooth", block: "center" }); + } + + let files = document.querySelectorAll('input[type="file"]'); + files.forEach(f => f.addEventListener('change', e => { + if (f.files) { + e.target.nextElementSibling.click(); + e.target.closest('.edit').querySelector('.browse').classList.add('loading'); + } + })) + + document.querySelectorAll('form').forEach(form => form.addEventListener('submit', e => { + e.preventDefault(); + let formData = new FormData(e.target); + formData.append('file', files.files); + formData.append('datetime', '5m'); + fetch('https://tempfile.site/api/files', { + method: 'POST', + body: formData, + }) + .then(res => res.json()) + .then(res => { + let browse = e.target.closest('.edit').querySelector('.browse'); + browse.classList.remove('loading'); + if (!res.ok) { + console.log(res.error); + browse.classList.add('error'); + return setTimeout(() => browse.classList.remove('error'), 5000) + } + imgSrc(e.target.previousElementSibling.querySelector('.editIcon > .imgParent') || e.target.closest('.editIcon').querySelector('.imgParent'), res.link); + let input = e.target.previousElementSibling.querySelector('.editIcon > input') || e.target.previousElementSibling; + input.value = res.link; + if (input === authorLink) json.embed.author.icon_url = res.link; + else if (input === thumbLink) json.embed.thumbnail.url = res.link; + else if (input === imgLink) json.embed.image.url = res.link; + else json.embed.footer.icon_url = res.link; + update(json); + console.info(`Image (${res.link}) will be deleted in 5 minutes. To delete it now got to ${res.link.replace('/files', '/del')} and enter this code: ${res.authkey}`); + }).catch(err => `Request to tempfile.site failed with error: ${err}`) + })) + } + + buildGui(json); + fields = gui.querySelector('.fields ~ .edit'); + update = data => { + try { + if (!data.content) embedContent.classList.add('empty'); + else { + embedContent.innerHTML = markup(encodeHTML(data.content), { replaceEmojis: true }); + embedContent.classList.remove('empty'); + } + if (data.embed && Object.keys(data.embed).length) { + let e = data.embed; + if (!allGood(e)) return; + if (e.title) display(embedTitle, markup(`${e.url ? '' + encodeHTML(e.title) + '' : encodeHTML(e.title)}`, { replaceEmojis: true, inlineBlock: true })); + else hide(embedTitle); + if (e.description) display(embedDescription, markup(encodeHTML(e.description), { inEmbed: true, replaceEmojis: true })); + else hide(embedDescription); + if (e.color) embed.closest('.embed').style.borderColor = encodeHTML(typeof e.color === 'number' ? '#' + e.color.toString(16).padStart(6, "0") : e.color); + else embed.closest('.embed').style.removeProperty('border-color'); + if (e.author && e.author.name) display(embedAuthor, ` + ${e.author.icon_url ? '' : ''} + ${e.author.url ? '' + encodeHTML(e.author.name) + '' : '' + encodeHTML(e.author.name) + ''}`, 'flex'); + else hide(embedAuthor); + if (e.thumbnail && e.thumbnail.url) embedThumbnail.src = encodeHTML(e.thumbnail.url), embedThumbnail.style.display = 'block'; + else hide(embedThumbnail); + if (e.image && e.image.url) embedImage.src = encodeHTML(e.image.url), embedImage.style.display = 'block'; + else hide(embedImage); + if (e.footer && e.footer.text) display(embedFooter, ` + ${e.footer.icon_url ? '' : ''} + ${encodeHTML(e.footer.text)} + ${e.timestamp ? '' + encodeHTML(tstamp(e.timestamp)) : ''}`, 'flex'); + else if (e.timestamp) display(embedFooter, `${encodeHTML(tstamp(e.timestamp))}`, 'flex'); + else hide(embedFooter); + if (e.fields) { + embedFields.innerHTML = ''; + e.fields.forEach(f => { + if (f.name && f.value) { + if (!f.inline) { + let el = embedFields.insertBefore(document.createElement('div'), null); + el.outerHTML = ` +
+
${markup(encodeHTML(f.name), { inEmbed: true, replaceEmojis: true, inlineBlock: true })}
+
${markup(encodeHTML(f.value), { inEmbed: true, replaceEmojis: true })}
+
`; + } else { + el = embedFields.insertBefore(document.createElement('div'), null); + el.outerHTML = ` +
+
${markup(encodeHTML(f.name), { inEmbed: true, replaceEmojis: true, inlineBlock: true })}
+
${markup(encodeHTML(f.value), { inEmbed: true, replaceEmojis: true })}
+
`; + colNum = (colNum === 9 ? 1 : colNum + 4); + num++; + } + } + }); + colNum = 1; + let len = e.fields.filter(f => f.inline).length; + if (len === 2 || (len > 3 && len % 2 !== 0)) { + let children = Array.from(embedFields.children), arr = children.filter(x => x === children[len] || x === children[len - 1]); + arr[0] && (arr[0].style.gridColumn = '1 / 7'); + arr[1] && (arr[1].style.gridColumn = '7 / 13'); + } + display(embedFields, undefined, 'grid'); + } else hide(embedFields); + embedCont.classList.remove('empty'); + document.querySelectorAll('.markup pre > code').forEach((block) => hljs.highlightBlock(block)); + notif.animate({ opacity: '0', bottom: '-50px', offset: 1 }, { easing: 'ease', duration: 500 }).onfinish = () => notif.style.removeProperty('display'); + twemoji.parse(msgEmbed); + } else embedCont.classList.add('empty'); + } catch (e) { + error(e); + } + } + + editor.on('change', editor => { + try { update(toObj(editor.getValue())); } + catch (e) { + if (editor.getValue()) return; + embedCont.classList.add('empty'); + embedContent.innerHTML = ''; + } + }); + + let picker = new CP(document.querySelector('.picker'), state = { parent: document.querySelector('.cTop') }); + picker.fire('change', toRGB('#41f097')); + + let colRight = document.querySelector('.colRight'), removePicker = () => colRight.classList.remove('picking'); + document.querySelector('.colBack').addEventListener('click', e => { + picker.self.remove(); removePicker(); + }) + picker.on('enter', () => colRight.classList.add('picking')) + picker.on('exit', removePicker); + + document.querySelectorAll('.colr').forEach(e => e.addEventListener('click', el => { + el = el.target.closest('.colr') || el.target; + embed.closest('.embed').style.borderColor = el.style.backgroundColor; + json.embed && (json.embed.color = toRGB(el.style.backgroundColor, false, true)); + picker.source.style.removeProperty('background'); + })) + + setTimeout(() => { + picker.on('change', function (r, g, b, a) { + embed.closest('.embed').style.borderColor = this.color(r, g, b); + json.embed && (json.embed.color = parseInt(this.color(r, g, b).slice(1), 16)); + picker.source.style.background = this.color(r, g, b); + }) + }, 1000) + + document.querySelector('.timeText').innerText = tstamp(); + document.querySelectorAll('.markup pre > code').forEach(block => hljs.highlightBlock(block)); + document.querySelectorAll('.done .selectOptions .channel').forEach(e => e.addEventListener('click', el => { + if (document.querySelector('.messageContent.empty+.container.empty')) return error(`There's nothing to send.`, 2500); + el.target.closest('.done').classList.add('sent'); + setTimeout(() => el.target.closest('.done').classList.remove('sent'), 3000); + fetch(`/dashboard/${guildID}/embeds`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ type: 'embed', guild: guildID, json, to: el.target.querySelector('span').getAttribute('data-data') }) + }) + .then(res => res.text()) + .then(res => { + if (res) return error(res, 5000); + el.target.closest('.done').classList.add('sent'); + setTimeout(() => el.target.closest('.done').classList.remove('sent'), 3000); + + }).catch(err => error(err, 5000)); + })); + + !window.navigator.userAgent.match(/Firefox\/[\d\.]+$/g) && // Firefox pushes the text up a little + document.querySelector('.botText').style.removeProperty('top'); + + document.querySelector('.opt.gui').addEventListener('click', () => { + json = toObj(editor.getValue() || '{}'); + buildGui(json, { activate: activeFields }); + document.body.classList.add('gui'); + activeFields = null; + }) + + document.querySelector('.opt.json').addEventListener('click', () => { + editor.setValue(JSON.stringify(json, null, 4)); + editor.refresh(); + document.body.classList.remove('gui'); + editor.focus(); + activeFields = document.querySelectorAll('.gui > .item.active'); + }) + + document.querySelector('.clear').addEventListener('click', () => { + json = { }; + embed.style.removeProperty('border-color'); + picker.source.style.removeProperty('background'); + update(json); buildGui(json); editor.setValue(JSON.stringify(json, null, 4)); + document.querySelectorAll('.gui>.item').forEach(e => e.classList.add('active')); + content.focus(); + }) + + let colrs = document.querySelector('.colrs'); + document.querySelector('.pickerToggle').addEventListener('click', () => colrs.classList.toggle('display')); + update(json); + +$(document).on('click', '#save-custom', function(e){ +var command = document.getElementById("custom-command").value; +if(!command) return error("provide a custom command!", 4000) +if(command.length > 30) return error("Command length exceeds 30 characters.", 4000); + + error('Successfully saved command, if not saved, read here', 10000) + e.preventDefault(); + $.ajax({ + type: "POST", + url: `/dashboard/${guildID}/embeds`, + data: JSON.stringify({ type: 'customcommand', guild: guildID, json, command:command}), + contentType: 'application/json' + }).done(function(response) { + + + }).fail(function(xhr, status, message) { + error(`${message}`, 4000) + }); + +}); + + +function Clipboard_CopyTo(value) { + var tempInput = document.createElement("input"); + tempInput.value = value; + document.body.appendChild(tempInput); + tempInput.select(); + document.execCommand("copy"); + document.body.removeChild(tempInput); +} + +$(document).ready(function(){ +$(document).on('click', '#copy', function(){ +var toCopy = JSON.stringify(json) +Clipboard_CopyTo(toCopy); +error("Copied Json!", 4000) +}); + + + + +$(document).on('click', '#sendWebhook', function(e){ +var webhook = document.getElementById("webhook").value; +if(!webhook) return error('Provide a valid Webhook', 4000) + if (document.querySelector('.messageContent.empty+.container.empty')) return error(`There's nothing to send.`, 2500); + +var params = { + "content": json.content, + "embeds": [json.embed] +} + + e.preventDefault(); + $.ajax({ + type: "POST", + url: webhook, + data: JSON.stringify(params), + contentType: 'application/json' + }).done(function(response) { + +error('Successfully sent webhook', 4000) + + }).fail(function(xhr, status, message) { + error("403 - There was an error sending your embed.", 6000) + + }); +}); + +}); + + +}; + + + diff --git a/dashboard/static/js/embed-components.js b/dashboard/static/js/embed-components.js new file mode 100644 index 00000000..12ad8547 --- /dev/null +++ b/dashboard/static/js/embed-components.js @@ -0,0 +1,4741 @@ +var emojis = { + "open_hands": "👐", + "open_hands_tone1": "👐🏻", + "open_hands_tone2": "👐🏼", + "open_hands_tone3": "👐🏽", + "open_hands_tone4": "👐🏾", + "open_hands_tone5": "👐🏿", + "raised_hands": "🙌", + "raised_hands_tone1": "🙌🏻", + "raised_hands_tone2": "🙌🏼", + "raised_hands_tone3": "🙌🏽", + "raised_hands_tone4": "🙌🏾", + "raised_hands_tone5": "🙌🏿", + "clap": "👏", + "clap_tone1": "👏🏻", + "clap_tone2": "👏🏼", + "clap_tone3": "👏🏽", + "clap_tone4": "👏🏾", + "clap_tone5": "👏🏿", + "handshake": "🤝", + "shaking_hands": "🤝", + "thumbsup": "👍", + "+1": "👍", + "thumbup": "👍", + "thumbsup_tone1": "👍🏻", + "+1_tone1": "👍🏻", + "thumbup_tone1": "👍🏻", + "thumbsup_tone2": "👍🏼", + "+1_tone2": "👍🏼", + "thumbup_tone2": "👍🏼", + "thumbsup_tone3": "👍🏽", + "+1_tone3": "👍🏽", + "thumbup_tone3": "👍🏽", + "thumbsup_tone4": "👍🏾", + "+1_tone4": "👍🏾", + "thumbup_tone4": "👍🏾", + "thumbsup_tone5": "👍🏿", + "+1_tone5": "👍🏿", + "thumbup_tone5": "👍🏿", + "thumbsdown": "👎", + "-1": "👎", + "thumbdown": "👎", + "thumbsdown_tone1": "👎🏻", + "_1_tone1": "👎🏻", + "thumbdown_tone1": "👎🏻", + "thumbsdown_tone2": "👎🏼", + "_1_tone2": "👎🏼", + "thumbdown_tone2": "👎🏼", + "thumbsdown_tone3": "👎🏽", + "_1_tone3": "👎🏽", + "thumbdown_tone3": "👎🏽", + "thumbsdown_tone4": "👎🏾", + "_1_tone4": "👎🏾", + "thumbdown_tone4": "👎🏾", + "thumbsdown_tone5": "👎🏿", + "_1_tone5": "👎🏿", + "thumbdown_tone5": "👎🏿", + "punch": "👊", + "punch_tone1": "👊🏻", + "punch_tone2": "👊🏼", + "punch_tone3": "👊🏽", + "punch_tone4": "👊🏾", + "punch_tone5": "👊🏿", + "fist": "✊", + "fist_tone1": "✊🏻", + "fist_tone2": "✊🏼", + "fist_tone3": "✊🏽", + "fist_tone4": "✊🏾", + "fist_tone5": "✊🏿", + "left_facing_fist": "🤛", + "left_fist": "🤛", + "left_facing_fist_tone1": "🤛🏻", + "left_fist_tone1": "🤛🏻", + "left_facing_fist_tone2": "🤛🏼", + "left_fist_tone2": "🤛🏼", + "left_facing_fist_tone3": "🤛🏽", + "left_fist_tone3": "🤛🏽", + "left_facing_fist_tone4": "🤛🏾", + "left_fist_tone4": "🤛🏾", + "left_facing_fist_tone5": "🤛🏿", + "left_fist_tone5": "🤛🏿", + "right_facing_fist": "🤜", + "right_fist": "🤜", + "right_facing_fist_tone1": "🤜🏻", + "right_fist_tone1": "🤜🏻", + "right_facing_fist_tone2": "🤜🏼", + "right_fist_tone2": "🤜🏼", + "right_facing_fist_tone3": "🤜🏽", + "right_fist_tone3": "🤜🏽", + "right_facing_fist_tone4": "🤜🏾", + "right_fist_tone4": "🤜🏾", + "right_facing_fist_tone5": "🤜🏿", + "right_fist_tone5": "🤜🏿", + "fingers_crossed": "🤞", + "hand_with_index_and_middle_finger_crossed": "🤞", + "fingers_crossed_tone1": "🤞🏻", + "hand_with_index_and_middle_fingers_crossed_tone1": "🤞🏻", + "fingers_crossed_tone2": "🤞🏼", + "hand_with_index_and_middle_fingers_crossed_tone2": "🤞🏼", + "fingers_crossed_tone3": "🤞🏽", + "hand_with_index_and_middle_fingers_crossed_tone3": "🤞🏽", + "fingers_crossed_tone4": "🤞🏾", + "hand_with_index_and_middle_fingers_crossed_tone4": "🤞🏾", + "fingers_crossed_tone5": "🤞🏿", + "hand_with_index_and_middle_fingers_crossed_tone5": "🤞🏿", + "v": "✌️", + "v_tone1": "✌🏻", + "v_tone2": "✌🏼", + "v_tone3": "✌🏽", + "v_tone4": "✌🏾", + "v_tone5": "✌🏿", + "love_you_gesture": "🤟", + "love_you_gesture_tone1": "🤟🏻", + "love_you_gesture_light_skin_tone": "🤟🏻", + "love_you_gesture_tone2": "🤟🏼", + "love_you_gesture_medium_light_skin_tone": "🤟🏼", + "love_you_gesture_tone3": "🤟🏽", + "love_you_gesture_medium_skin_tone": "🤟🏽", + "love_you_gesture_tone4": "🤟🏾", + "love_you_gesture_medium_dark_skin_tone": "🤟🏾", + "love_you_gesture_tone5": "🤟🏿", + "love_you_gesture_dark_skin_tone": "🤟🏿", + "metal": "🤘", + "sign_of_the_horns": "🤘", + "metal_tone1": "🤘🏻", + "sign_of_the_horns_tone1": "🤘🏻", + "metal_tone2": "🤘🏼", + "sign_of_the_horns_tone2": "🤘🏼", + "metal_tone3": "🤘🏽", + "sign_of_the_horns_tone3": "🤘🏽", + "metal_tone4": "🤘🏾", + "sign_of_the_horns_tone4": "🤘🏾", + "metal_tone5": "🤘🏿", + "sign_of_the_horns_tone5": "🤘🏿", + "ok_hand": "👌", + "ok_hand_tone1": "👌🏻", + "ok_hand_tone2": "👌🏼", + "ok_hand_tone3": "👌🏽", + "ok_hand_tone4": "👌🏾", + "ok_hand_tone5": "👌🏿", + "pinching_hand": "🤏", + "pinching_hand_tone1": "🤏🏻", + "pinching_hand_light_skin_tone": "🤏🏻", + "pinching_hand_tone2": "🤏🏼", + "pinching_hand_medium_light_skin_tone": "🤏🏼", + "pinching_hand_tone3": "🤏🏽", + "pinching_hand_medium_skin_tone": "🤏🏽", + "pinching_hand_tone4": "🤏🏾", + "pinching_hand_medium_dark_skin_tone": "🤏🏾", + "pinching_hand_tone5": "🤏🏿", + "pinching_hand_dark_skin_tone": "🤏🏿", + "pinched_fingers": "🤌", + "pinched_fingers_tone2": "🤌🏼", + "pinched_fingers_medium_light_skin_tone": "🤌🏼", + "pinched_fingers_tone1": "🤌🏻", + "pinched_fingers_light_skin_tone": "🤌🏻", + "pinched_fingers_tone3": "🤌🏽", + "pinched_fingers_medium_skin_tone": "🤌🏽", + "pinched_fingers_tone4": "🤌🏾", + "pinched_fingers_medium_dark_skin_tone": "🤌🏾", + "pinched_fingers_tone5": "🤌🏿", + "pinched_fingers_dark_skin_tone": "🤌🏿", + "point_left": "👈", + "point_left_tone1": "👈🏻", + "point_left_tone2": "👈🏼", + "point_left_tone3": "👈🏽", + "point_left_tone4": "👈🏾", + "point_left_tone5": "👈🏿", + "point_right": "👉", + "point_right_tone1": "👉🏻", + "point_right_tone2": "👉🏼", + "point_right_tone3": "👉🏽", + "point_right_tone4": "👉🏾", + "point_right_tone5": "👉🏿", + "point_up_2": "👆", + "point_up_2_tone1": "👆🏻", + "point_up_2_tone2": "👆🏼", + "point_up_2_tone3": "👆🏽", + "point_up_2_tone4": "👆🏾", + "point_up_2_tone5": "👆🏿", + "point_down": "👇", + "point_down_tone1": "👇🏻", + "point_down_tone2": "👇🏼", + "point_down_tone3": "👇🏽", + "point_down_tone4": "👇🏾", + "point_down_tone5": "👇🏿", + "point_up": "☝️", + "point_up_tone1": "☝🏻", + "point_up_tone2": "☝🏼", + "point_up_tone3": "☝🏽", + "point_up_tone4": "☝🏾", + "point_up_tone5": "☝🏿", + "raised_hand": "✋", + "raised_hand_tone1": "✋🏻", + "raised_hand_tone2": "✋🏼", + "raised_hand_tone3": "✋🏽", + "raised_hand_tone4": "✋🏾", + "raised_hand_tone5": "✋🏿", + "raised_back_of_hand": "🤚", + "back_of_hand": "🤚", + "raised_back_of_hand_tone1": "🤚🏻", + "back_of_hand_tone1": "🤚🏻", + "raised_back_of_hand_tone2": "🤚🏼", + "back_of_hand_tone2": "🤚🏼", + "raised_back_of_hand_tone3": "🤚🏽", + "back_of_hand_tone3": "🤚🏽", + "raised_back_of_hand_tone4": "🤚🏾", + "back_of_hand_tone4": "🤚🏾", + "raised_back_of_hand_tone5": "🤚🏿", + "back_of_hand_tone5": "🤚🏿", + "hand_splayed": "🖐️", + "raised_hand_with_fingers_splayed": "🖐️", + "hand_splayed_tone1": "🖐🏻", + "raised_hand_with_fingers_splayed_tone1": "🖐🏻", + "hand_splayed_tone2": "🖐🏼", + "raised_hand_with_fingers_splayed_tone2": "🖐🏼", + "hand_splayed_tone3": "🖐🏽", + "raised_hand_with_fingers_splayed_tone3": "🖐🏽", + "hand_splayed_tone4": "🖐🏾", + "raised_hand_with_fingers_splayed_tone4": "🖐🏾", + "hand_splayed_tone5": "🖐🏿", + "raised_hand_with_fingers_splayed_tone5": "🖐🏿", + "vulcan": "🖖", + "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", + "vulcan_tone1": "🖖🏻", + "raised_hand_with_part_between_middle_and_ring_fingers_tone1": "🖖🏻", + "vulcan_tone2": "🖖🏼", + "raised_hand_with_part_between_middle_and_ring_fingers_tone2": "🖖🏼", + "vulcan_tone3": "🖖🏽", + "raised_hand_with_part_between_middle_and_ring_fingers_tone3": "🖖🏽", + "vulcan_tone4": "🖖🏾", + "raised_hand_with_part_between_middle_and_ring_fingers_tone4": "🖖🏾", + "vulcan_tone5": "🖖🏿", + "raised_hand_with_part_between_middle_and_ring_fingers_tone5": "🖖🏿", + "wave": "👋", + "wave_tone1": "👋🏻", + "wave_tone2": "👋🏼", + "wave_tone3": "👋🏽", + "wave_tone4": "👋🏾", + "wave_tone5": "👋🏿", + "call_me": "🤙", + "call_me_hand": "🤙", + "call_me_tone1": "🤙🏻", + "call_me_hand_tone1": "🤙🏻", + "call_me_tone2": "🤙🏼", + "call_me_hand_tone2": "🤙🏼", + "call_me_tone3": "🤙🏽", + "call_me_hand_tone3": "🤙🏽", + "call_me_tone4": "🤙🏾", + "call_me_hand_tone4": "🤙🏾", + "call_me_tone5": "🤙🏿", + "call_me_hand_tone5": "🤙🏿", + "muscle": "💪", + "muscle_tone1": "💪🏻", + "muscle_tone2": "💪🏼", + "muscle_tone3": "💪🏽", + "muscle_tone4": "💪🏾", + "muscle_tone5": "💪🏿", + "mechanical_arm": "🦾", + "middle_finger": "🖕", + "reversed_hand_with_middle_finger_extended": "🖕", + "middle_finger_tone1": "🖕🏻", + "reversed_hand_with_middle_finger_extended_tone1": "🖕🏻", + "middle_finger_tone2": "🖕🏼", + "reversed_hand_with_middle_finger_extended_tone2": "🖕🏼", + "middle_finger_tone3": "🖕🏽", + "reversed_hand_with_middle_finger_extended_tone3": "🖕🏽", + "middle_finger_tone4": "🖕🏾", + "reversed_hand_with_middle_finger_extended_tone4": "🖕🏾", + "middle_finger_tone5": "🖕🏿", + "reversed_hand_with_middle_finger_extended_tone5": "🖕🏿", + "writing_hand": "✍️", + "writing_hand_tone1": "✍🏻", + "writing_hand_tone2": "✍🏼", + "writing_hand_tone3": "✍🏽", + "writing_hand_tone4": "✍🏾", + "writing_hand_tone5": "✍🏿", + "pray": "🙏", + "pray_tone1": "🙏🏻", + "pray_tone2": "🙏🏼", + "pray_tone3": "🙏🏽", + "pray_tone4": "🙏🏾", + "pray_tone5": "🙏🏿", + "foot": "🦶", + "foot_tone1": "🦶🏻", + "foot_light_skin_tone": "🦶🏻", + "foot_tone2": "🦶🏼", + "foot_medium_light_skin_tone": "🦶🏼", + "foot_tone3": "🦶🏽", + "foot_medium_skin_tone": "🦶🏽", + "foot_tone4": "🦶🏾", + "foot_medium_dark_skin_tone": "🦶🏾", + "foot_tone5": "🦶🏿", + "foot_dark_skin_tone": "🦶🏿", + "leg": "🦵", + "leg_tone1": "🦵🏻", + "leg_light_skin_tone": "🦵🏻", + "leg_tone2": "🦵🏼", + "leg_medium_light_skin_tone": "🦵🏼", + "leg_tone3": "🦵🏽", + "leg_medium_skin_tone": "🦵🏽", + "leg_tone4": "🦵🏾", + "leg_medium_dark_skin_tone": "🦵🏾", + "leg_tone5": "🦵🏿", + "leg_dark_skin_tone": "🦵🏿", + "mechanical_leg": "🦿", + "lipstick": "💄", + "kiss": "💋", + "lips": "👄", + "tooth": "🦷", + "bone": "🦴", + "tongue": "👅", + "ear": "👂", + "ear_tone1": "👂🏻", + "ear_tone2": "👂🏼", + "ear_tone3": "👂🏽", + "ear_tone4": "👂🏾", + "ear_tone5": "👂🏿", + "ear_with_hearing_aid": "🦻", + "ear_with_hearing_aid_tone1": "🦻🏻", + "ear_with_hearing_aid_light_skin_tone": "🦻🏻", + "ear_with_hearing_aid_tone2": "🦻🏼", + "ear_with_hearing_aid_medium_light_skin_tone": "🦻🏼", + "ear_with_hearing_aid_tone3": "🦻🏽", + "ear_with_hearing_aid_medium_skin_tone": "🦻🏽", + "ear_with_hearing_aid_tone4": "🦻🏾", + "ear_with_hearing_aid_medium_dark_skin_tone": "🦻🏾", + "ear_with_hearing_aid_tone5": "🦻🏿", + "ear_with_hearing_aid_dark_skin_tone": "🦻🏿", + "nose": "👃", + "nose_tone1": "👃🏻", + "nose_tone2": "👃🏼", + "nose_tone3": "👃🏽", + "nose_tone4": "👃🏾", + "nose_tone5": "👃🏿", + "footprints": "👣", + "eye": "👁️", + "eyes": "👀", + "brain": "🧠", + "anatomical_heart": "🫀", + "lungs": "🫁", + "speaking_head": "🗣️", + "speaking_head_in_silhouette": "🗣️", + "bust_in_silhouette": "👤", + "busts_in_silhouette": "👥", + "people_hugging": "🫂", + "baby": "👶", + "baby_tone1": "👶🏻", + "baby_tone2": "👶🏼", + "baby_tone3": "👶🏽", + "baby_tone4": "👶🏾", + "baby_tone5": "👶🏿", + "girl": "👧", + "girl_tone1": "👧🏻", + "girl_tone2": "👧🏼", + "girl_tone3": "👧🏽", + "girl_tone4": "👧🏾", + "girl_tone5": "👧🏿", + "child": "🧒", + "child_tone1": "🧒🏻", + "child_light_skin_tone": "🧒🏻", + "child_tone2": "🧒🏼", + "child_medium_light_skin_tone": "🧒🏼", + "child_tone3": "🧒🏽", + "child_medium_skin_tone": "🧒🏽", + "child_tone4": "🧒🏾", + "child_medium_dark_skin_tone": "🧒🏾", + "child_tone5": "🧒🏿", + "child_dark_skin_tone": "🧒🏿", + "boy": "👦", + "boy_tone1": "👦🏻", + "boy_tone2": "👦🏼", + "boy_tone3": "👦🏽", + "boy_tone4": "👦🏾", + "boy_tone5": "👦🏿", + "woman": "👩", + "woman_tone1": "👩🏻", + "woman_tone2": "👩🏼", + "woman_tone3": "👩🏽", + "woman_tone4": "👩🏾", + "woman_tone5": "👩🏿", + "adult": "🧑", + "adult_tone1": "🧑🏻", + "adult_light_skin_tone": "🧑🏻", + "adult_tone2": "🧑🏼", + "adult_medium_light_skin_tone": "🧑🏼", + "adult_tone3": "🧑🏽", + "adult_medium_skin_tone": "🧑🏽", + "adult_tone4": "🧑🏾", + "adult_medium_dark_skin_tone": "🧑🏾", + "adult_tone5": "🧑🏿", + "adult_dark_skin_tone": "🧑🏿", + "man": "👨", + "man_tone1": "👨🏻", + "man_tone2": "👨🏼", + "man_tone3": "👨🏽", + "man_tone4": "👨🏾", + "man_tone5": "👨🏿", + "person_curly_hair": "🧑‍🦱", + "person_tone1_curly_hair": "🧑🏻‍🦱", + "person_light_skin_tone_curly_hair": "🧑🏻‍🦱", + "person_tone2_curly_hair": "🧑🏼‍🦱", + "person_medium_light_skin_tone_curly_hair": "🧑🏼‍🦱", + "person_tone3_curly_hair": "🧑🏽‍🦱", + "person_medium_skin_tone_curly_hair": "🧑🏽‍🦱", + "person_tone4_curly_hair": "🧑🏾‍🦱", + "person_medium_dark_skin_tone_curly_hair": "🧑🏾‍🦱", + "person_tone5_curly_hair": "🧑🏿‍🦱", + "person_dark_skin_tone_curly_hair": "🧑🏿‍🦱", + "woman_curly_haired": "👩‍🦱", + "woman_curly_haired_tone1": "👩🏻‍🦱", + "woman_curly_haired_light_skin_tone": "👩🏻‍🦱", + "woman_curly_haired_tone2": "👩🏼‍🦱", + "woman_curly_haired_medium_light_skin_tone": "👩🏼‍🦱", + "woman_curly_haired_tone3": "👩🏽‍🦱", + "woman_curly_haired_medium_skin_tone": "👩🏽‍🦱", + "woman_curly_haired_tone4": "👩🏾‍🦱", + "woman_curly_haired_medium_dark_skin_tone": "👩🏾‍🦱", + "woman_curly_haired_tone5": "👩🏿‍🦱", + "woman_curly_haired_dark_skin_tone": "👩🏿‍🦱", + "man_curly_haired": "👨‍🦱", + "man_curly_haired_tone1": "👨🏻‍🦱", + "man_curly_haired_light_skin_tone": "👨🏻‍🦱", + "man_curly_haired_tone2": "👨🏼‍🦱", + "man_curly_haired_medium_light_skin_tone": "👨🏼‍🦱", + "man_curly_haired_tone3": "👨🏽‍🦱", + "man_curly_haired_medium_skin_tone": "👨🏽‍🦱", + "man_curly_haired_tone4": "👨🏾‍🦱", + "man_curly_haired_medium_dark_skin_tone": "👨🏾‍🦱", + "man_curly_haired_tone5": "👨🏿‍🦱", + "man_curly_haired_dark_skin_tone": "👨🏿‍🦱", + "person_red_hair": "🧑‍🦰", + "person_tone1_red_hair": "🧑🏻‍🦰", + "person_light_skin_tone_red_hair": "🧑🏻‍🦰", + "person_tone2_red_hair": "🧑🏼‍🦰", + "person_medium_light_skin_tone_red_hair": "🧑🏼‍🦰", + "person_tone3_red_hair": "🧑🏽‍🦰", + "person_medium_skin_tone_red_hair": "🧑🏽‍🦰", + "person_tone4_red_hair": "🧑🏾‍🦰", + "person_medium_dark_skin_tone_red_hair": "🧑🏾‍🦰", + "person_tone5_red_hair": "🧑🏿‍🦰", + "person_dark_skin_tone_red_hair": "🧑🏿‍🦰", + "woman_red_haired": "👩‍🦰", + "woman_red_haired_tone1": "👩🏻‍🦰", + "woman_red_haired_light_skin_tone": "👩🏻‍🦰", + "woman_red_haired_tone2": "👩🏼‍🦰", + "woman_red_haired_medium_light_skin_tone": "👩🏼‍🦰", + "woman_red_haired_tone3": "👩🏽‍🦰", + "woman_red_haired_medium_skin_tone": "👩🏽‍🦰", + "woman_red_haired_tone4": "👩🏾‍🦰", + "woman_red_haired_medium_dark_skin_tone": "👩🏾‍🦰", + "woman_red_haired_tone5": "👩🏿‍🦰", + "woman_red_haired_dark_skin_tone": "👩🏿‍🦰", + "man_red_haired": "👨‍🦰", + "man_red_haired_tone1": "👨🏻‍🦰", + "man_red_haired_light_skin_tone": "👨🏻‍🦰", + "man_red_haired_tone2": "👨🏼‍🦰", + "man_red_haired_medium_light_skin_tone": "👨🏼‍🦰", + "man_red_haired_tone3": "👨🏽‍🦰", + "man_red_haired_medium_skin_tone": "👨🏽‍🦰", + "man_red_haired_tone4": "👨🏾‍🦰", + "man_red_haired_medium_dark_skin_tone": "👨🏾‍🦰", + "man_red_haired_tone5": "👨🏿‍🦰", + "man_red_haired_dark_skin_tone": "👨🏿‍🦰", + "blond_haired_woman": "👱‍♀️", + "blond_haired_woman_tone1": "👱🏻‍♀️", + "blond_haired_woman_light_skin_tone": "👱🏻‍♀️", + "blond_haired_woman_tone2": "👱🏼‍♀️", + "blond_haired_woman_medium_light_skin_tone": "👱🏼‍♀️", + "blond_haired_woman_tone3": "👱🏽‍♀️", + "blond_haired_woman_medium_skin_tone": "👱🏽‍♀️", + "blond_haired_woman_tone4": "👱🏾‍♀️", + "blond_haired_woman_medium_dark_skin_tone": "👱🏾‍♀️", + "blond_haired_woman_tone5": "👱🏿‍♀️", + "blond_haired_woman_dark_skin_tone": "👱🏿‍♀️", + "blond_haired_person": "👱", + "person_with_blond_hair": "👱", + "blond_haired_person_tone1": "👱🏻", + "person_with_blond_hair_tone1": "👱🏻", + "blond_haired_person_tone2": "👱🏼", + "person_with_blond_hair_tone2": "👱🏼", + "blond_haired_person_tone3": "👱🏽", + "person_with_blond_hair_tone3": "👱🏽", + "blond_haired_person_tone4": "👱🏾", + "person_with_blond_hair_tone4": "👱🏾", + "blond_haired_person_tone5": "👱🏿", + "person_with_blond_hair_tone5": "👱🏿", + "blond_haired_man": "👱‍♂️", + "blond_haired_man_tone1": "👱🏻‍♂️", + "blond_haired_man_light_skin_tone": "👱🏻‍♂️", + "blond_haired_man_tone2": "👱🏼‍♂️", + "blond_haired_man_medium_light_skin_tone": "👱🏼‍♂️", + "blond_haired_man_tone3": "👱🏽‍♂️", + "blond_haired_man_medium_skin_tone": "👱🏽‍♂️", + "blond_haired_man_tone4": "👱🏾‍♂️", + "blond_haired_man_medium_dark_skin_tone": "👱🏾‍♂️", + "blond_haired_man_tone5": "👱🏿‍♂️", + "blond_haired_man_dark_skin_tone": "👱🏿‍♂️", + "person_white_hair": "🧑‍🦳", + "person_tone1_white_hair": "🧑🏻‍🦳", + "person_light_skin_tone_white_hair": "🧑🏻‍🦳", + "person_tone2_white_hair": "🧑🏼‍🦳", + "person_medium_light_skin_tone_white_hair": "🧑🏼‍🦳", + "person_tone3_white_hair": "🧑🏽‍🦳", + "person_medium_skin_tone_white_hair": "🧑🏽‍🦳", + "person_tone4_white_hair": "🧑🏾‍🦳", + "person_medium_dark_skin_tone_white_hair": "🧑🏾‍🦳", + "person_tone5_white_hair": "🧑🏿‍🦳", + "person_dark_skin_tone_white_hair": "🧑🏿‍🦳", + "woman_white_haired": "👩‍🦳", + "woman_white_haired_tone1": "👩🏻‍🦳", + "woman_white_haired_light_skin_tone": "👩🏻‍🦳", + "woman_white_haired_tone2": "👩🏼‍🦳", + "woman_white_haired_medium_light_skin_tone": "👩🏼‍🦳", + "woman_white_haired_tone3": "👩🏽‍🦳", + "woman_white_haired_medium_skin_tone": "👩🏽‍🦳", + "woman_white_haired_tone4": "👩🏾‍🦳", + "woman_white_haired_medium_dark_skin_tone": "👩🏾‍🦳", + "woman_white_haired_tone5": "👩🏿‍🦳", + "woman_white_haired_dark_skin_tone": "👩🏿‍🦳", + "man_white_haired": "👨‍🦳", + "man_white_haired_tone1": "👨🏻‍🦳", + "man_white_haired_light_skin_tone": "👨🏻‍🦳", + "man_white_haired_tone2": "👨🏼‍🦳", + "man_white_haired_medium_light_skin_tone": "👨🏼‍🦳", + "man_white_haired_tone3": "👨🏽‍🦳", + "man_white_haired_medium_skin_tone": "👨🏽‍🦳", + "man_white_haired_tone4": "👨🏾‍🦳", + "man_white_haired_medium_dark_skin_tone": "👨🏾‍🦳", + "man_white_haired_tone5": "👨🏿‍🦳", + "man_white_haired_dark_skin_tone": "👨🏿‍🦳", + "person_bald": "🧑‍🦲", + "person_tone1_bald": "🧑🏻‍🦲", + "person_light_skin_tone_bald": "🧑🏻‍🦲", + "person_tone2_bald": "🧑🏼‍🦲", + "person_medium_light_skin_tone_bald": "🧑🏼‍🦲", + "person_tone3_bald": "🧑🏽‍🦲", + "person_medium_skin_tone_bald": "🧑🏽‍🦲", + "person_tone4_bald": "🧑🏾‍🦲", + "person_medium_dark_skin_tone_bald": "🧑🏾‍🦲", + "person_tone5_bald": "🧑🏿‍🦲", + "person_dark_skin_tone_bald": "🧑🏿‍🦲", + "woman_bald": "👩‍🦲", + "woman_bald_tone1": "👩🏻‍🦲", + "woman_bald_light_skin_tone": "👩🏻‍🦲", + "woman_bald_tone2": "👩🏼‍🦲", + "woman_bald_medium_light_skin_tone": "👩🏼‍🦲", + "woman_bald_tone3": "👩🏽‍🦲", + "woman_bald_medium_skin_tone": "👩🏽‍🦲", + "woman_bald_tone4": "👩🏾‍🦲", + "woman_bald_medium_dark_skin_tone": "👩🏾‍🦲", + "woman_bald_tone5": "👩🏿‍🦲", + "woman_bald_dark_skin_tone": "👩🏿‍🦲", + "man_bald": "👨‍🦲", + "man_bald_tone1": "👨🏻‍🦲", + "man_bald_light_skin_tone": "👨🏻‍🦲", + "man_bald_tone2": "👨🏼‍🦲", + "man_bald_medium_light_skin_tone": "👨🏼‍🦲", + "man_bald_tone3": "👨🏽‍🦲", + "man_bald_medium_skin_tone": "👨🏽‍🦲", + "man_bald_tone4": "👨🏾‍🦲", + "man_bald_medium_dark_skin_tone": "👨🏾‍🦲", + "man_bald_tone5": "👨🏿‍🦲", + "man_bald_dark_skin_tone": "👨🏿‍🦲", + "bearded_person": "🧔", + "bearded_person_tone1": "🧔🏻", + "bearded_person_light_skin_tone": "🧔🏻", + "bearded_person_tone2": "🧔🏼", + "bearded_person_medium_light_skin_tone": "🧔🏼", + "bearded_person_tone3": "🧔🏽", + "bearded_person_medium_skin_tone": "🧔🏽", + "bearded_person_tone4": "🧔🏾", + "bearded_person_medium_dark_skin_tone": "🧔🏾", + "bearded_person_tone5": "🧔🏿", + "bearded_person_dark_skin_tone": "🧔🏿", + "older_woman": "👵", + "grandma": "👵", + "older_woman_tone1": "👵🏻", + "grandma_tone1": "👵🏻", + "older_woman_tone2": "👵🏼", + "grandma_tone2": "👵🏼", + "older_woman_tone3": "👵🏽", + "grandma_tone3": "👵🏽", + "older_woman_tone4": "👵🏾", + "grandma_tone4": "👵🏾", + "older_woman_tone5": "👵🏿", + "grandma_tone5": "👵🏿", + "older_adult": "🧓", + "older_adult_tone1": "🧓🏻", + "older_adult_light_skin_tone": "🧓🏻", + "older_adult_tone2": "🧓🏼", + "older_adult_medium_light_skin_tone": "🧓🏼", + "older_adult_tone3": "🧓🏽", + "older_adult_medium_skin_tone": "🧓🏽", + "older_adult_tone4": "🧓🏾", + "older_adult_medium_dark_skin_tone": "🧓🏾", + "older_adult_tone5": "🧓🏿", + "older_adult_dark_skin_tone": "🧓🏿", + "older_man": "👴", + "older_man_tone1": "👴🏻", + "older_man_tone2": "👴🏼", + "older_man_tone3": "👴🏽", + "older_man_tone4": "👴🏾", + "older_man_tone5": "👴🏿", + "man_with_chinese_cap": "👲", + "man_with_gua_pi_mao": "👲", + "man_with_chinese_cap_tone1": "👲🏻", + "man_with_gua_pi_mao_tone1": "👲🏻", + "man_with_chinese_cap_tone2": "👲🏼", + "man_with_gua_pi_mao_tone2": "👲🏼", + "man_with_chinese_cap_tone3": "👲🏽", + "man_with_gua_pi_mao_tone3": "👲🏽", + "man_with_chinese_cap_tone4": "👲🏾", + "man_with_gua_pi_mao_tone4": "👲🏾", + "man_with_chinese_cap_tone5": "👲🏿", + "man_with_gua_pi_mao_tone5": "👲🏿", + "person_wearing_turban": "👳", + "man_with_turban": "👳", + "person_wearing_turban_tone1": "👳🏻", + "man_with_turban_tone1": "👳🏻", + "person_wearing_turban_tone2": "👳🏼", + "man_with_turban_tone2": "👳🏼", + "person_wearing_turban_tone3": "👳🏽", + "man_with_turban_tone3": "👳🏽", + "person_wearing_turban_tone4": "👳🏾", + "man_with_turban_tone4": "👳🏾", + "person_wearing_turban_tone5": "👳🏿", + "man_with_turban_tone5": "👳🏿", + "woman_wearing_turban": "👳‍♀️", + "woman_wearing_turban_tone1": "👳🏻‍♀️", + "woman_wearing_turban_light_skin_tone": "👳🏻‍♀️", + "woman_wearing_turban_tone2": "👳🏼‍♀️", + "woman_wearing_turban_medium_light_skin_tone": "👳🏼‍♀️", + "woman_wearing_turban_tone3": "👳🏽‍♀️", + "woman_wearing_turban_medium_skin_tone": "👳🏽‍♀️", + "woman_wearing_turban_tone4": "👳🏾‍♀️", + "woman_wearing_turban_medium_dark_skin_tone": "👳🏾‍♀️", + "woman_wearing_turban_tone5": "👳🏿‍♀️", + "woman_wearing_turban_dark_skin_tone": "👳🏿‍♀️", + "man_wearing_turban": "👳‍♂️", + "man_wearing_turban_tone1": "👳🏻‍♂️", + "man_wearing_turban_light_skin_tone": "👳🏻‍♂️", + "man_wearing_turban_tone2": "👳🏼‍♂️", + "man_wearing_turban_medium_light_skin_tone": "👳🏼‍♂️", + "man_wearing_turban_tone3": "👳🏽‍♂️", + "man_wearing_turban_medium_skin_tone": "👳🏽‍♂️", + "man_wearing_turban_tone4": "👳🏾‍♂️", + "man_wearing_turban_medium_dark_skin_tone": "👳🏾‍♂️", + "man_wearing_turban_tone5": "👳🏿‍♂️", + "man_wearing_turban_dark_skin_tone": "👳🏿‍♂️", + "woman_with_headscarf": "🧕", + "woman_with_headscarf_tone1": "🧕🏻", + "woman_with_headscarf_light_skin_tone": "🧕🏻", + "woman_with_headscarf_tone2": "🧕🏼", + "woman_with_headscarf_medium_light_skin_tone": "🧕🏼", + "woman_with_headscarf_tone3": "🧕🏽", + "woman_with_headscarf_medium_skin_tone": "🧕🏽", + "woman_with_headscarf_tone4": "🧕🏾", + "woman_with_headscarf_medium_dark_skin_tone": "🧕🏾", + "woman_with_headscarf_tone5": "🧕🏿", + "woman_with_headscarf_dark_skin_tone": "🧕🏿", + "police_officer": "👮", + "cop": "👮", + "police_officer_tone1": "👮🏻", + "cop_tone1": "👮🏻", + "police_officer_tone2": "👮🏼", + "cop_tone2": "👮🏼", + "police_officer_tone3": "👮🏽", + "cop_tone3": "👮🏽", + "police_officer_tone4": "👮🏾", + "cop_tone4": "👮🏾", + "police_officer_tone5": "👮🏿", + "cop_tone5": "👮🏿", + "woman_police_officer": "👮‍♀️", + "woman_police_officer_tone1": "👮🏻‍♀️", + "woman_police_officer_light_skin_tone": "👮🏻‍♀️", + "woman_police_officer_tone2": "👮🏼‍♀️", + "woman_police_officer_medium_light_skin_tone": "👮🏼‍♀️", + "woman_police_officer_tone3": "👮🏽‍♀️", + "woman_police_officer_medium_skin_tone": "👮🏽‍♀️", + "woman_police_officer_tone4": "👮🏾‍♀️", + "woman_police_officer_medium_dark_skin_tone": "👮🏾‍♀️", + "woman_police_officer_tone5": "👮🏿‍♀️", + "woman_police_officer_dark_skin_tone": "👮🏿‍♀️", + "man_police_officer": "👮‍♂️", + "man_police_officer_tone1": "👮🏻‍♂️", + "man_police_officer_light_skin_tone": "👮🏻‍♂️", + "man_police_officer_tone2": "👮🏼‍♂️", + "man_police_officer_medium_light_skin_tone": "👮🏼‍♂️", + "man_police_officer_tone3": "👮🏽‍♂️", + "man_police_officer_medium_skin_tone": "👮🏽‍♂️", + "man_police_officer_tone4": "👮🏾‍♂️", + "man_police_officer_medium_dark_skin_tone": "👮🏾‍♂️", + "man_police_officer_tone5": "👮🏿‍♂️", + "man_police_officer_dark_skin_tone": "👮🏿‍♂️", + "construction_worker": "👷", + "construction_worker_tone1": "👷🏻", + "construction_worker_tone2": "👷🏼", + "construction_worker_tone3": "👷🏽", + "construction_worker_tone4": "👷🏾", + "construction_worker_tone5": "👷🏿", + "woman_construction_worker": "👷‍♀️", + "woman_construction_worker_tone1": "👷🏻‍♀️", + "woman_construction_worker_light_skin_tone": "👷🏻‍♀️", + "woman_construction_worker_tone2": "👷🏼‍♀️", + "woman_construction_worker_medium_light_skin_tone": "👷🏼‍♀️", + "woman_construction_worker_tone3": "👷🏽‍♀️", + "woman_construction_worker_medium_skin_tone": "👷🏽‍♀️", + "woman_construction_worker_tone4": "👷🏾‍♀️", + "woman_construction_worker_medium_dark_skin_tone": "👷🏾‍♀️", + "woman_construction_worker_tone5": "👷🏿‍♀️", + "woman_construction_worker_dark_skin_tone": "👷🏿‍♀️", + "man_construction_worker": "👷‍♂️", + "man_construction_worker_tone1": "👷🏻‍♂️", + "man_construction_worker_light_skin_tone": "👷🏻‍♂️", + "man_construction_worker_tone2": "👷🏼‍♂️", + "man_construction_worker_medium_light_skin_tone": "👷🏼‍♂️", + "man_construction_worker_tone3": "👷🏽‍♂️", + "man_construction_worker_medium_skin_tone": "👷🏽‍♂️", + "man_construction_worker_tone4": "👷🏾‍♂️", + "man_construction_worker_medium_dark_skin_tone": "👷🏾‍♂️", + "man_construction_worker_tone5": "👷🏿‍♂️", + "man_construction_worker_dark_skin_tone": "👷🏿‍♂️", + "guard": "💂", + "guardsman": "💂", + "guard_tone1": "💂🏻", + "guardsman_tone1": "💂🏻", + "guard_tone2": "💂🏼", + "guardsman_tone2": "💂🏼", + "guard_tone3": "💂🏽", + "guardsman_tone3": "💂🏽", + "guard_tone4": "💂🏾", + "guardsman_tone4": "💂🏾", + "guard_tone5": "💂🏿", + "guardsman_tone5": "💂🏿", + "woman_guard": "💂‍♀️", + "woman_guard_tone1": "💂🏻‍♀️", + "woman_guard_light_skin_tone": "💂🏻‍♀️", + "woman_guard_tone2": "💂🏼‍♀️", + "woman_guard_medium_light_skin_tone": "💂🏼‍♀️", + "woman_guard_tone3": "💂🏽‍♀️", + "woman_guard_medium_skin_tone": "💂🏽‍♀️", + "woman_guard_tone4": "💂🏾‍♀️", + "woman_guard_medium_dark_skin_tone": "💂🏾‍♀️", + "woman_guard_tone5": "💂🏿‍♀️", + "woman_guard_dark_skin_tone": "💂🏿‍♀️", + "man_guard": "💂‍♂️", + "man_guard_tone1": "💂🏻‍♂️", + "man_guard_light_skin_tone": "💂🏻‍♂️", + "man_guard_tone2": "💂🏼‍♂️", + "man_guard_medium_light_skin_tone": "💂🏼‍♂️", + "man_guard_tone3": "💂🏽‍♂️", + "man_guard_medium_skin_tone": "💂🏽‍♂️", + "man_guard_tone4": "💂🏾‍♂️", + "man_guard_medium_dark_skin_tone": "💂🏾‍♂️", + "man_guard_tone5": "💂🏿‍♂️", + "man_guard_dark_skin_tone": "💂🏿‍♂️", + "detective": "🕵️", + "spy": "🕵️", + "sleuth_or_spy": "🕵️", + "detective_tone1": "🕵🏻", + "spy_tone1": "🕵🏻", + "sleuth_or_spy_tone1": "🕵🏻", + "detective_tone2": "🕵🏼", + "spy_tone2": "🕵🏼", + "sleuth_or_spy_tone2": "🕵🏼", + "detective_tone3": "🕵🏽", + "spy_tone3": "🕵🏽", + "sleuth_or_spy_tone3": "🕵🏽", + "detective_tone4": "🕵🏾", + "spy_tone4": "🕵🏾", + "sleuth_or_spy_tone4": "🕵🏾", + "detective_tone5": "🕵🏿", + "spy_tone5": "🕵🏿", + "sleuth_or_spy_tone5": "🕵🏿", + "woman_detective": "🕵️‍♀️", + "woman_detective_tone1": "🕵🏻‍♀️", + "woman_detective_light_skin_tone": "🕵🏻‍♀️", + "woman_detective_tone2": "🕵🏼‍♀️", + "woman_detective_medium_light_skin_tone": "🕵🏼‍♀️", + "woman_detective_tone3": "🕵🏽‍♀️", + "woman_detective_medium_skin_tone": "🕵🏽‍♀️", + "woman_detective_tone4": "🕵🏾‍♀️", + "woman_detective_medium_dark_skin_tone": "🕵🏾‍♀️", + "woman_detective_tone5": "🕵🏿‍♀️", + "woman_detective_dark_skin_tone": "🕵🏿‍♀️", + "man_detective": "🕵️‍♂️", + "man_detective_tone1": "🕵🏻‍♂️", + "man_detective_light_skin_tone": "🕵🏻‍♂️", + "man_detective_tone2": "🕵🏼‍♂️", + "man_detective_medium_light_skin_tone": "🕵🏼‍♂️", + "man_detective_tone3": "🕵🏽‍♂️", + "man_detective_medium_skin_tone": "🕵🏽‍♂️", + "man_detective_tone4": "🕵🏾‍♂️", + "man_detective_medium_dark_skin_tone": "🕵🏾‍♂️", + "man_detective_tone5": "🕵🏿‍♂️", + "man_detective_dark_skin_tone": "🕵🏿‍♂️", + "health_worker": "🧑‍⚕️", + "health_worker_tone1": "🧑🏻‍⚕️", + "health_worker_light_skin_tone": "🧑🏻‍⚕️", + "health_worker_tone2": "🧑🏼‍⚕️", + "health_worker_medium_light_skin_tone": "🧑🏼‍⚕️", + "health_worker_tone3": "🧑🏽‍⚕️", + "health_worker_medium_skin_tone": "🧑🏽‍⚕️", + "health_worker_tone4": "🧑🏾‍⚕️", + "health_worker_medium_dark_skin_tone": "🧑🏾‍⚕️", + "health_worker_tone5": "🧑🏿‍⚕️", + "health_worker_dark_skin_tone": "🧑🏿‍⚕️", + "woman_health_worker": "👩‍⚕️", + "woman_health_worker_tone1": "👩🏻‍⚕️", + "woman_health_worker_light_skin_tone": "👩🏻‍⚕️", + "woman_health_worker_tone2": "👩🏼‍⚕️", + "woman_health_worker_medium_light_skin_tone": "👩🏼‍⚕️", + "woman_health_worker_tone3": "👩🏽‍⚕️", + "woman_health_worker_medium_skin_tone": "👩🏽‍⚕️", + "woman_health_worker_tone4": "👩🏾‍⚕️", + "woman_health_worker_medium_dark_skin_tone": "👩🏾‍⚕️", + "woman_health_worker_tone5": "👩🏿‍⚕️", + "woman_health_worker_dark_skin_tone": "👩🏿‍⚕️", + "man_health_worker": "👨‍⚕️", + "man_health_worker_tone1": "👨🏻‍⚕️", + "man_health_worker_light_skin_tone": "👨🏻‍⚕️", + "man_health_worker_tone2": "👨🏼‍⚕️", + "man_health_worker_medium_light_skin_tone": "👨🏼‍⚕️", + "man_health_worker_tone3": "👨🏽‍⚕️", + "man_health_worker_medium_skin_tone": "👨🏽‍⚕️", + "man_health_worker_tone4": "👨🏾‍⚕️", + "man_health_worker_medium_dark_skin_tone": "👨🏾‍⚕️", + "man_health_worker_tone5": "👨🏿‍⚕️", + "man_health_worker_dark_skin_tone": "👨🏿‍⚕️", + "farmer": "🧑‍🌾", + "farmer_tone1": "🧑🏻‍🌾", + "farmer_light_skin_tone": "🧑🏻‍🌾", + "farmer_tone2": "🧑🏼‍🌾", + "farmer_medium_light_skin_tone": "🧑🏼‍🌾", + "farmer_tone3": "🧑🏽‍🌾", + "farmer_medium_skin_tone": "🧑🏽‍🌾", + "farmer_tone4": "🧑🏾‍🌾", + "farmer_medium_dark_skin_tone": "🧑🏾‍🌾", + "farmer_tone5": "🧑🏿‍🌾", + "farmer_dark_skin_tone": "🧑🏿‍🌾", + "woman_farmer": "👩‍🌾", + "woman_farmer_tone1": "👩🏻‍🌾", + "woman_farmer_light_skin_tone": "👩🏻‍🌾", + "woman_farmer_tone2": "👩🏼‍🌾", + "woman_farmer_medium_light_skin_tone": "👩🏼‍🌾", + "woman_farmer_tone3": "👩🏽‍🌾", + "woman_farmer_medium_skin_tone": "👩🏽‍🌾", + "woman_farmer_tone4": "👩🏾‍🌾", + "woman_farmer_medium_dark_skin_tone": "👩🏾‍🌾", + "woman_farmer_tone5": "👩🏿‍🌾", + "woman_farmer_dark_skin_tone": "👩🏿‍🌾", + "man_farmer": "👨‍🌾", + "man_farmer_tone1": "👨🏻‍🌾", + "man_farmer_light_skin_tone": "👨🏻‍🌾", + "man_farmer_tone2": "👨🏼‍🌾", + "man_farmer_medium_light_skin_tone": "👨🏼‍🌾", + "man_farmer_tone3": "👨🏽‍🌾", + "man_farmer_medium_skin_tone": "👨🏽‍🌾", + "man_farmer_tone4": "👨🏾‍🌾", + "man_farmer_medium_dark_skin_tone": "👨🏾‍🌾", + "man_farmer_tone5": "👨🏿‍🌾", + "man_farmer_dark_skin_tone": "👨🏿‍🌾", + "cook": "🧑‍🍳", + "cook_tone1": "🧑🏻‍🍳", + "cook_light_skin_tone": "🧑🏻‍🍳", + "cook_tone2": "🧑🏼‍🍳", + "cook_medium_light_skin_tone": "🧑🏼‍🍳", + "cook_tone3": "🧑🏽‍🍳", + "cook_medium_skin_tone": "🧑🏽‍🍳", + "cook_tone4": "🧑🏾‍🍳", + "cook_medium_dark_skin_tone": "🧑🏾‍🍳", + "cook_tone5": "🧑🏿‍🍳", + "cook_dark_skin_tone": "🧑🏿‍🍳", + "woman_cook": "👩‍🍳", + "woman_cook_tone1": "👩🏻‍🍳", + "woman_cook_light_skin_tone": "👩🏻‍🍳", + "woman_cook_tone2": "👩🏼‍🍳", + "woman_cook_medium_light_skin_tone": "👩🏼‍🍳", + "woman_cook_tone3": "👩🏽‍🍳", + "woman_cook_medium_skin_tone": "👩🏽‍🍳", + "woman_cook_tone4": "👩🏾‍🍳", + "woman_cook_medium_dark_skin_tone": "👩🏾‍🍳", + "woman_cook_tone5": "👩🏿‍🍳", + "woman_cook_dark_skin_tone": "👩🏿‍🍳", + "man_cook": "👨‍🍳", + "man_cook_tone1": "👨🏻‍🍳", + "man_cook_light_skin_tone": "👨🏻‍🍳", + "man_cook_tone2": "👨🏼‍🍳", + "man_cook_medium_light_skin_tone": "👨🏼‍🍳", + "man_cook_tone3": "👨🏽‍🍳", + "man_cook_medium_skin_tone": "👨🏽‍🍳", + "man_cook_tone4": "👨🏾‍🍳", + "man_cook_medium_dark_skin_tone": "👨🏾‍🍳", + "man_cook_tone5": "👨🏿‍🍳", + "man_cook_dark_skin_tone": "👨🏿‍🍳", + "student": "🧑‍🎓", + "student_tone1": "🧑🏻‍🎓", + "student_light_skin_tone": "🧑🏻‍🎓", + "student_tone2": "🧑🏼‍🎓", + "student_medium_light_skin_tone": "🧑🏼‍🎓", + "student_tone3": "🧑🏽‍🎓", + "student_medium_skin_tone": "🧑🏽‍🎓", + "student_tone4": "🧑🏾‍🎓", + "student_medium_dark_skin_tone": "🧑🏾‍🎓", + "student_tone5": "🧑🏿‍🎓", + "student_dark_skin_tone": "🧑🏿‍🎓", + "woman_student": "👩‍🎓", + "woman_student_tone1": "👩🏻‍🎓", + "woman_student_light_skin_tone": "👩🏻‍🎓", + "woman_student_tone2": "👩🏼‍🎓", + "woman_student_medium_light_skin_tone": "👩🏼‍🎓", + "woman_student_tone3": "👩🏽‍🎓", + "woman_student_medium_skin_tone": "👩🏽‍🎓", + "woman_student_tone4": "👩🏾‍🎓", + "woman_student_medium_dark_skin_tone": "👩🏾‍🎓", + "woman_student_tone5": "👩🏿‍🎓", + "woman_student_dark_skin_tone": "👩🏿‍🎓", + "man_student": "👨‍🎓", + "man_student_tone1": "👨🏻‍🎓", + "man_student_light_skin_tone": "👨🏻‍🎓", + "man_student_tone2": "👨🏼‍🎓", + "man_student_medium_light_skin_tone": "👨🏼‍🎓", + "man_student_tone3": "👨🏽‍🎓", + "man_student_medium_skin_tone": "👨🏽‍🎓", + "man_student_tone4": "👨🏾‍🎓", + "man_student_medium_dark_skin_tone": "👨🏾‍🎓", + "man_student_tone5": "👨🏿‍🎓", + "man_student_dark_skin_tone": "👨🏿‍🎓", + "singer": "🧑‍🎤", + "singer_tone1": "🧑🏻‍🎤", + "singer_light_skin_tone": "🧑🏻‍🎤", + "singer_tone2": "🧑🏼‍🎤", + "singer_medium_light_skin_tone": "🧑🏼‍🎤", + "singer_tone3": "🧑🏽‍🎤", + "singer_medium_skin_tone": "🧑🏽‍🎤", + "singer_tone4": "🧑🏾‍🎤", + "singer_medium_dark_skin_tone": "🧑🏾‍🎤", + "singer_tone5": "🧑🏿‍🎤", + "singer_dark_skin_tone": "🧑🏿‍🎤", + "woman_singer": "👩‍🎤", + "woman_singer_tone1": "👩🏻‍🎤", + "woman_singer_light_skin_tone": "👩🏻‍🎤", + "woman_singer_tone2": "👩🏼‍🎤", + "woman_singer_medium_light_skin_tone": "👩🏼‍🎤", + "woman_singer_tone3": "👩🏽‍🎤", + "woman_singer_medium_skin_tone": "👩🏽‍🎤", + "woman_singer_tone4": "👩🏾‍🎤", + "woman_singer_medium_dark_skin_tone": "👩🏾‍🎤", + "woman_singer_tone5": "👩🏿‍🎤", + "woman_singer_dark_skin_tone": "👩🏿‍🎤", + "man_singer": "👨‍🎤", + "man_singer_tone1": "👨🏻‍🎤", + "man_singer_light_skin_tone": "👨🏻‍🎤", + "man_singer_tone2": "👨🏼‍🎤", + "man_singer_medium_light_skin_tone": "👨🏼‍🎤", + "man_singer_tone3": "👨🏽‍🎤", + "man_singer_medium_skin_tone": "👨🏽‍🎤", + "man_singer_tone4": "👨🏾‍🎤", + "man_singer_medium_dark_skin_tone": "👨🏾‍🎤", + "man_singer_tone5": "👨🏿‍🎤", + "man_singer_dark_skin_tone": "👨🏿‍🎤", + "teacher": "🧑‍🏫", + "teacher_tone1": "🧑🏻‍🏫", + "teacher_light_skin_tone": "🧑🏻‍🏫", + "teacher_tone2": "🧑🏼‍🏫", + "teacher_medium_light_skin_tone": "🧑🏼‍🏫", + "teacher_tone3": "🧑🏽‍🏫", + "teacher_medium_skin_tone": "🧑🏽‍🏫", + "teacher_tone4": "🧑🏾‍🏫", + "teacher_medium_dark_skin_tone": "🧑🏾‍🏫", + "teacher_tone5": "🧑🏿‍🏫", + "teacher_dark_skin_tone": "🧑🏿‍🏫", + "woman_teacher": "👩‍🏫", + "woman_teacher_tone1": "👩🏻‍🏫", + "woman_teacher_light_skin_tone": "👩🏻‍🏫", + "woman_teacher_tone2": "👩🏼‍🏫", + "woman_teacher_medium_light_skin_tone": "👩🏼‍🏫", + "woman_teacher_tone3": "👩🏽‍🏫", + "woman_teacher_medium_skin_tone": "👩🏽‍🏫", + "woman_teacher_tone4": "👩🏾‍🏫", + "woman_teacher_medium_dark_skin_tone": "👩🏾‍🏫", + "woman_teacher_tone5": "👩🏿‍🏫", + "woman_teacher_dark_skin_tone": "👩🏿‍🏫", + "man_teacher": "👨‍🏫", + "man_teacher_tone1": "👨🏻‍🏫", + "man_teacher_light_skin_tone": "👨🏻‍🏫", + "man_teacher_tone2": "👨🏼‍🏫", + "man_teacher_medium_light_skin_tone": "👨🏼‍🏫", + "man_teacher_tone3": "👨🏽‍🏫", + "man_teacher_medium_skin_tone": "👨🏽‍🏫", + "man_teacher_tone4": "👨🏾‍🏫", + "man_teacher_medium_dark_skin_tone": "👨🏾‍🏫", + "man_teacher_tone5": "👨🏿‍🏫", + "man_teacher_dark_skin_tone": "👨🏿‍🏫", + "factory_worker": "🧑‍🏭", + "factory_worker_tone1": "🧑🏻‍🏭", + "factory_worker_light_skin_tone": "🧑🏻‍🏭", + "factory_worker_tone2": "🧑🏼‍🏭", + "factory_worker_medium_light_skin_tone": "🧑🏼‍🏭", + "factory_worker_tone3": "🧑🏽‍🏭", + "factory_worker_medium_skin_tone": "🧑🏽‍🏭", + "factory_worker_tone4": "🧑🏾‍🏭", + "factory_worker_medium_dark_skin_tone": "🧑🏾‍🏭", + "factory_worker_tone5": "🧑🏿‍🏭", + "factory_worker_dark_skin_tone": "🧑🏿‍🏭", + "woman_factory_worker": "👩‍🏭", + "woman_factory_worker_tone1": "👩🏻‍🏭", + "woman_factory_worker_light_skin_tone": "👩🏻‍🏭", + "woman_factory_worker_tone2": "👩🏼‍🏭", + "woman_factory_worker_medium_light_skin_tone": "👩🏼‍🏭", + "woman_factory_worker_tone3": "👩🏽‍🏭", + "woman_factory_worker_medium_skin_tone": "👩🏽‍🏭", + "woman_factory_worker_tone4": "👩🏾‍🏭", + "woman_factory_worker_medium_dark_skin_tone": "👩🏾‍🏭", + "woman_factory_worker_tone5": "👩🏿‍🏭", + "woman_factory_worker_dark_skin_tone": "👩🏿‍🏭", + "man_factory_worker": "👨‍🏭", + "man_factory_worker_tone1": "👨🏻‍🏭", + "man_factory_worker_light_skin_tone": "👨🏻‍🏭", + "man_factory_worker_tone2": "👨🏼‍🏭", + "man_factory_worker_medium_light_skin_tone": "👨🏼‍🏭", + "man_factory_worker_tone3": "👨🏽‍🏭", + "man_factory_worker_medium_skin_tone": "👨🏽‍🏭", + "man_factory_worker_tone4": "👨🏾‍🏭", + "man_factory_worker_medium_dark_skin_tone": "👨🏾‍🏭", + "man_factory_worker_tone5": "👨🏿‍🏭", + "man_factory_worker_dark_skin_tone": "👨🏿‍🏭", + "technologist": "🧑‍💻", + "technologist_tone1": "🧑🏻‍💻", + "technologist_light_skin_tone": "🧑🏻‍💻", + "technologist_tone2": "🧑🏼‍💻", + "technologist_medium_light_skin_tone": "🧑🏼‍💻", + "technologist_tone3": "🧑🏽‍💻", + "technologist_medium_skin_tone": "🧑🏽‍💻", + "technologist_tone4": "🧑🏾‍💻", + "technologist_medium_dark_skin_tone": "🧑🏾‍💻", + "technologist_tone5": "🧑🏿‍💻", + "technologist_dark_skin_tone": "🧑🏿‍💻", + "woman_technologist": "👩‍💻", + "woman_technologist_tone1": "👩🏻‍💻", + "woman_technologist_light_skin_tone": "👩🏻‍💻", + "woman_technologist_tone2": "👩🏼‍💻", + "woman_technologist_medium_light_skin_tone": "👩🏼‍💻", + "woman_technologist_tone3": "👩🏽‍💻", + "woman_technologist_medium_skin_tone": "👩🏽‍💻", + "woman_technologist_tone4": "👩🏾‍💻", + "woman_technologist_medium_dark_skin_tone": "👩🏾‍💻", + "woman_technologist_tone5": "👩🏿‍💻", + "woman_technologist_dark_skin_tone": "👩🏿‍💻", + "man_technologist": "👨‍💻", + "man_technologist_tone1": "👨🏻‍💻", + "man_technologist_light_skin_tone": "👨🏻‍💻", + "man_technologist_tone2": "👨🏼‍💻", + "man_technologist_medium_light_skin_tone": "👨🏼‍💻", + "man_technologist_tone3": "👨🏽‍💻", + "man_technologist_medium_skin_tone": "👨🏽‍💻", + "man_technologist_tone4": "👨🏾‍💻", + "man_technologist_medium_dark_skin_tone": "👨🏾‍💻", + "man_technologist_tone5": "👨🏿‍💻", + "man_technologist_dark_skin_tone": "👨🏿‍💻", + "office_worker": "🧑‍💼", + "office_worker_tone1": "🧑🏻‍💼", + "office_worker_light_skin_tone": "🧑🏻‍💼", + "office_worker_tone2": "🧑🏼‍💼", + "office_worker_medium_light_skin_tone": "🧑🏼‍💼", + "office_worker_tone3": "🧑🏽‍💼", + "office_worker_medium_skin_tone": "🧑🏽‍💼", + "office_worker_tone4": "🧑🏾‍💼", + "office_worker_medium_dark_skin_tone": "🧑🏾‍💼", + "office_worker_tone5": "🧑🏿‍💼", + "office_worker_dark_skin_tone": "🧑🏿‍💼", + "woman_office_worker": "👩‍💼", + "woman_office_worker_tone1": "👩🏻‍💼", + "woman_office_worker_light_skin_tone": "👩🏻‍💼", + "woman_office_worker_tone2": "👩🏼‍💼", + "woman_office_worker_medium_light_skin_tone": "👩🏼‍💼", + "woman_office_worker_tone3": "👩🏽‍💼", + "woman_office_worker_medium_skin_tone": "👩🏽‍💼", + "woman_office_worker_tone4": "👩🏾‍💼", + "woman_office_worker_medium_dark_skin_tone": "👩🏾‍💼", + "woman_office_worker_tone5": "👩🏿‍💼", + "woman_office_worker_dark_skin_tone": "👩🏿‍💼", + "man_office_worker": "👨‍💼", + "man_office_worker_tone1": "👨🏻‍💼", + "man_office_worker_light_skin_tone": "👨🏻‍💼", + "man_office_worker_tone2": "👨🏼‍💼", + "man_office_worker_medium_light_skin_tone": "👨🏼‍💼", + "man_office_worker_tone3": "👨🏽‍💼", + "man_office_worker_medium_skin_tone": "👨🏽‍💼", + "man_office_worker_tone4": "👨🏾‍💼", + "man_office_worker_medium_dark_skin_tone": "👨🏾‍💼", + "man_office_worker_tone5": "👨🏿‍💼", + "man_office_worker_dark_skin_tone": "👨🏿‍💼", + "mechanic": "🧑‍🔧", + "mechanic_tone1": "🧑🏻‍🔧", + "mechanic_light_skin_tone": "🧑🏻‍🔧", + "mechanic_tone2": "🧑🏼‍🔧", + "mechanic_medium_light_skin_tone": "🧑🏼‍🔧", + "mechanic_tone3": "🧑🏽‍🔧", + "mechanic_medium_skin_tone": "🧑🏽‍🔧", + "mechanic_tone4": "🧑🏾‍🔧", + "mechanic_medium_dark_skin_tone": "🧑🏾‍🔧", + "mechanic_tone5": "🧑🏿‍🔧", + "mechanic_dark_skin_tone": "🧑🏿‍🔧", + "woman_mechanic": "👩‍🔧", + "woman_mechanic_tone1": "👩🏻‍🔧", + "woman_mechanic_light_skin_tone": "👩🏻‍🔧", + "woman_mechanic_tone2": "👩🏼‍🔧", + "woman_mechanic_medium_light_skin_tone": "👩🏼‍🔧", + "woman_mechanic_tone3": "👩🏽‍🔧", + "woman_mechanic_medium_skin_tone": "👩🏽‍🔧", + "woman_mechanic_tone4": "👩🏾‍🔧", + "woman_mechanic_medium_dark_skin_tone": "👩🏾‍🔧", + "woman_mechanic_tone5": "👩🏿‍🔧", + "woman_mechanic_dark_skin_tone": "👩🏿‍🔧", + "man_mechanic": "👨‍🔧", + "man_mechanic_tone1": "👨🏻‍🔧", + "man_mechanic_light_skin_tone": "👨🏻‍🔧", + "man_mechanic_tone2": "👨🏼‍🔧", + "man_mechanic_medium_light_skin_tone": "👨🏼‍🔧", + "man_mechanic_tone3": "👨🏽‍🔧", + "man_mechanic_medium_skin_tone": "👨🏽‍🔧", + "man_mechanic_tone4": "👨🏾‍🔧", + "man_mechanic_medium_dark_skin_tone": "👨🏾‍🔧", + "man_mechanic_tone5": "👨🏿‍🔧", + "man_mechanic_dark_skin_tone": "👨🏿‍🔧", + "scientist": "🧑‍🔬", + "scientist_tone1": "🧑🏻‍🔬", + "scientist_light_skin_tone": "🧑🏻‍🔬", + "scientist_tone2": "🧑🏼‍🔬", + "scientist_medium_light_skin_tone": "🧑🏼‍🔬", + "scientist_tone3": "🧑🏽‍🔬", + "scientist_medium_skin_tone": "🧑🏽‍🔬", + "scientist_tone4": "🧑🏾‍🔬", + "scientist_medium_dark_skin_tone": "🧑🏾‍🔬", + "scientist_tone5": "🧑🏿‍🔬", + "scientist_dark_skin_tone": "🧑🏿‍🔬", + "woman_scientist": "👩‍🔬", + "woman_scientist_tone1": "👩🏻‍🔬", + "woman_scientist_light_skin_tone": "👩🏻‍🔬", + "woman_scientist_tone2": "👩🏼‍🔬", + "woman_scientist_medium_light_skin_tone": "👩🏼‍🔬", + "woman_scientist_tone3": "👩🏽‍🔬", + "woman_scientist_medium_skin_tone": "👩🏽‍🔬", + "woman_scientist_tone4": "👩🏾‍🔬", + "woman_scientist_medium_dark_skin_tone": "👩🏾‍🔬", + "woman_scientist_tone5": "👩🏿‍🔬", + "woman_scientist_dark_skin_tone": "👩🏿‍🔬", + "man_scientist": "👨‍🔬", + "man_scientist_tone1": "👨🏻‍🔬", + "man_scientist_light_skin_tone": "👨🏻‍🔬", + "man_scientist_tone2": "👨🏼‍🔬", + "man_scientist_medium_light_skin_tone": "👨🏼‍🔬", + "man_scientist_tone3": "👨🏽‍🔬", + "man_scientist_medium_skin_tone": "👨🏽‍🔬", + "man_scientist_tone4": "👨🏾‍🔬", + "man_scientist_medium_dark_skin_tone": "👨🏾‍🔬", + "man_scientist_tone5": "👨🏿‍🔬", + "man_scientist_dark_skin_tone": "👨🏿‍🔬", + "artist": "🧑‍🎨", + "artist_tone1": "🧑🏻‍🎨", + "artist_light_skin_tone": "🧑🏻‍🎨", + "artist_tone2": "🧑🏼‍🎨", + "artist_medium_light_skin_tone": "🧑🏼‍🎨", + "artist_tone3": "🧑🏽‍🎨", + "artist_medium_skin_tone": "🧑🏽‍🎨", + "artist_tone4": "🧑🏾‍🎨", + "artist_medium_dark_skin_tone": "🧑🏾‍🎨", + "artist_tone5": "🧑🏿‍🎨", + "artist_dark_skin_tone": "🧑🏿‍🎨", + "woman_artist": "👩‍🎨", + "woman_artist_tone1": "👩🏻‍🎨", + "woman_artist_light_skin_tone": "👩🏻‍🎨", + "woman_artist_tone2": "👩🏼‍🎨", + "woman_artist_medium_light_skin_tone": "👩🏼‍🎨", + "woman_artist_tone3": "👩🏽‍🎨", + "woman_artist_medium_skin_tone": "👩🏽‍🎨", + "woman_artist_tone4": "👩🏾‍🎨", + "woman_artist_medium_dark_skin_tone": "👩🏾‍🎨", + "woman_artist_tone5": "👩🏿‍🎨", + "woman_artist_dark_skin_tone": "👩🏿‍🎨", + "man_artist": "👨‍🎨", + "man_artist_tone1": "👨🏻‍🎨", + "man_artist_light_skin_tone": "👨🏻‍🎨", + "man_artist_tone2": "👨🏼‍🎨", + "man_artist_medium_light_skin_tone": "👨🏼‍🎨", + "man_artist_tone3": "👨🏽‍🎨", + "man_artist_medium_skin_tone": "👨🏽‍🎨", + "man_artist_tone4": "👨🏾‍🎨", + "man_artist_medium_dark_skin_tone": "👨🏾‍🎨", + "man_artist_tone5": "👨🏿‍🎨", + "man_artist_dark_skin_tone": "👨🏿‍🎨", + "firefighter": "🧑‍🚒", + "firefighter_tone1": "🧑🏻‍🚒", + "firefighter_light_skin_tone": "🧑🏻‍🚒", + "firefighter_tone2": "🧑🏼‍🚒", + "firefighter_medium_light_skin_tone": "🧑🏼‍🚒", + "firefighter_tone3": "🧑🏽‍🚒", + "firefighter_medium_skin_tone": "🧑🏽‍🚒", + "firefighter_tone4": "🧑🏾‍🚒", + "firefighter_medium_dark_skin_tone": "🧑🏾‍🚒", + "firefighter_tone5": "🧑🏿‍🚒", + "firefighter_dark_skin_tone": "🧑🏿‍🚒", + "woman_firefighter": "👩‍🚒", + "woman_firefighter_tone1": "👩🏻‍🚒", + "woman_firefighter_light_skin_tone": "👩🏻‍🚒", + "woman_firefighter_tone2": "👩🏼‍🚒", + "woman_firefighter_medium_light_skin_tone": "👩🏼‍🚒", + "woman_firefighter_tone3": "👩🏽‍🚒", + "woman_firefighter_medium_skin_tone": "👩🏽‍🚒", + "woman_firefighter_tone4": "👩🏾‍🚒", + "woman_firefighter_medium_dark_skin_tone": "👩🏾‍🚒", + "woman_firefighter_tone5": "👩🏿‍🚒", + "woman_firefighter_dark_skin_tone": "👩🏿‍🚒", + "man_firefighter": "👨‍🚒", + "man_firefighter_tone1": "👨🏻‍🚒", + "man_firefighter_light_skin_tone": "👨🏻‍🚒", + "man_firefighter_tone2": "👨🏼‍🚒", + "man_firefighter_medium_light_skin_tone": "👨🏼‍🚒", + "man_firefighter_tone3": "👨🏽‍🚒", + "man_firefighter_medium_skin_tone": "👨🏽‍🚒", + "man_firefighter_tone4": "👨🏾‍🚒", + "man_firefighter_medium_dark_skin_tone": "👨🏾‍🚒", + "man_firefighter_tone5": "👨🏿‍🚒", + "man_firefighter_dark_skin_tone": "👨🏿‍🚒", + "pilot": "🧑‍✈️", + "pilot_tone1": "🧑🏻‍✈️", + "pilot_light_skin_tone": "🧑🏻‍✈️", + "pilot_tone2": "🧑🏼‍✈️", + "pilot_medium_light_skin_tone": "🧑🏼‍✈️", + "pilot_tone3": "🧑🏽‍✈️", + "pilot_medium_skin_tone": "🧑🏽‍✈️", + "pilot_tone4": "🧑🏾‍✈️", + "pilot_medium_dark_skin_tone": "🧑🏾‍✈️", + "pilot_tone5": "🧑🏿‍✈️", + "pilot_dark_skin_tone": "🧑🏿‍✈️", + "woman_pilot": "👩‍✈️", + "woman_pilot_tone1": "👩🏻‍✈️", + "woman_pilot_light_skin_tone": "👩🏻‍✈️", + "woman_pilot_tone2": "👩🏼‍✈️", + "woman_pilot_medium_light_skin_tone": "👩🏼‍✈️", + "woman_pilot_tone3": "👩🏽‍✈️", + "woman_pilot_medium_skin_tone": "👩🏽‍✈️", + "woman_pilot_tone4": "👩🏾‍✈️", + "woman_pilot_medium_dark_skin_tone": "👩🏾‍✈️", + "woman_pilot_tone5": "👩🏿‍✈️", + "woman_pilot_dark_skin_tone": "👩🏿‍✈️", + "man_pilot": "👨‍✈️", + "man_pilot_tone1": "👨🏻‍✈️", + "man_pilot_light_skin_tone": "👨🏻‍✈️", + "man_pilot_tone2": "👨🏼‍✈️", + "man_pilot_medium_light_skin_tone": "👨🏼‍✈️", + "man_pilot_tone3": "👨🏽‍✈️", + "man_pilot_medium_skin_tone": "👨🏽‍✈️", + "man_pilot_tone4": "👨🏾‍✈️", + "man_pilot_medium_dark_skin_tone": "👨🏾‍✈️", + "man_pilot_tone5": "👨🏿‍✈️", + "man_pilot_dark_skin_tone": "👨🏿‍✈️", + "astronaut": "🧑‍🚀", + "astronaut_tone1": "🧑🏻‍🚀", + "astronaut_light_skin_tone": "🧑🏻‍🚀", + "astronaut_tone2": "🧑🏼‍🚀", + "astronaut_medium_light_skin_tone": "🧑🏼‍🚀", + "astronaut_tone3": "🧑🏽‍🚀", + "astronaut_medium_skin_tone": "🧑🏽‍🚀", + "astronaut_tone4": "🧑🏾‍🚀", + "astronaut_medium_dark_skin_tone": "🧑🏾‍🚀", + "astronaut_tone5": "🧑🏿‍🚀", + "astronaut_dark_skin_tone": "🧑🏿‍🚀", + "woman_astronaut": "👩‍🚀", + "woman_astronaut_tone1": "👩🏻‍🚀", + "woman_astronaut_light_skin_tone": "👩🏻‍🚀", + "woman_astronaut_tone2": "👩🏼‍🚀", + "woman_astronaut_medium_light_skin_tone": "👩🏼‍🚀", + "woman_astronaut_tone3": "👩🏽‍🚀", + "woman_astronaut_medium_skin_tone": "👩🏽‍🚀", + "woman_astronaut_tone4": "👩🏾‍🚀", + "woman_astronaut_medium_dark_skin_tone": "👩🏾‍🚀", + "woman_astronaut_tone5": "👩🏿‍🚀", + "woman_astronaut_dark_skin_tone": "👩🏿‍🚀", + "man_astronaut": "👨‍🚀", + "man_astronaut_tone1": "👨🏻‍🚀", + "man_astronaut_light_skin_tone": "👨🏻‍🚀", + "man_astronaut_tone2": "👨🏼‍🚀", + "man_astronaut_medium_light_skin_tone": "👨🏼‍🚀", + "man_astronaut_tone3": "👨🏽‍🚀", + "man_astronaut_medium_skin_tone": "👨🏽‍🚀", + "man_astronaut_tone4": "👨🏾‍🚀", + "man_astronaut_medium_dark_skin_tone": "👨🏾‍🚀", + "man_astronaut_tone5": "👨🏿‍🚀", + "man_astronaut_dark_skin_tone": "👨🏿‍🚀", + "judge": "🧑‍⚖️", + "judge_tone1": "🧑🏻‍⚖️", + "judge_light_skin_tone": "🧑🏻‍⚖️", + "judge_tone2": "🧑🏼‍⚖️", + "judge_medium_light_skin_tone": "🧑🏼‍⚖️", + "judge_tone3": "🧑🏽‍⚖️", + "judge_medium_skin_tone": "🧑🏽‍⚖️", + "judge_tone4": "🧑🏾‍⚖️", + "judge_medium_dark_skin_tone": "🧑🏾‍⚖️", + "judge_tone5": "🧑🏿‍⚖️", + "judge_dark_skin_tone": "🧑🏿‍⚖️", + "woman_judge": "👩‍⚖️", + "woman_judge_tone1": "👩🏻‍⚖️", + "woman_judge_light_skin_tone": "👩🏻‍⚖️", + "woman_judge_tone2": "👩🏼‍⚖️", + "woman_judge_medium_light_skin_tone": "👩🏼‍⚖️", + "woman_judge_tone3": "👩🏽‍⚖️", + "woman_judge_medium_skin_tone": "👩🏽‍⚖️", + "woman_judge_tone4": "👩🏾‍⚖️", + "woman_judge_medium_dark_skin_tone": "👩🏾‍⚖️", + "woman_judge_tone5": "👩🏿‍⚖️", + "woman_judge_dark_skin_tone": "👩🏿‍⚖️", + "man_judge": "👨‍⚖️", + "man_judge_tone1": "👨🏻‍⚖️", + "man_judge_light_skin_tone": "👨🏻‍⚖️", + "man_judge_tone2": "👨🏼‍⚖️", + "man_judge_medium_light_skin_tone": "👨🏼‍⚖️", + "man_judge_tone3": "👨🏽‍⚖️", + "man_judge_medium_skin_tone": "👨🏽‍⚖️", + "man_judge_tone4": "👨🏾‍⚖️", + "man_judge_medium_dark_skin_tone": "👨🏾‍⚖️", + "man_judge_tone5": "👨🏿‍⚖️", + "man_judge_dark_skin_tone": "👨🏿‍⚖️", + "person_with_veil": "👰", + "person_with_veil_tone1": "👰🏻", + "person_with_veil_tone2": "👰🏼", + "person_with_veil_tone3": "👰🏽", + "person_with_veil_tone4": "👰🏾", + "person_with_veil_tone5": "👰🏿", + "woman_with_veil": "👰‍♀️", + "bride_with_veil": "👰‍♀️", + "woman_with_veil_tone1": "👰🏻‍♀️", + "woman_with_veil_light_skin_tone": "👰🏻‍♀️", + "woman_with_veil_tone2": "👰🏼‍♀️", + "woman_with_veil_medium_light_skin_tone": "👰🏼‍♀️", + "woman_with_veil_tone3": "👰🏽‍♀️", + "woman_with_veil_medium_skin_tone": "👰🏽‍♀️", + "woman_with_veil_tone4": "👰🏾‍♀️", + "woman_with_veil_medium_dark_skin_tone": "👰🏾‍♀️", + "woman_with_veil_tone5": "👰🏿‍♀️", + "woman_with_veil_dark_skin_tone": "👰🏿‍♀️", + "man_with_veil": "👰‍♂️", + "man_with_veil_tone1": "👰🏻‍♂️", + "man_with_veil_light_skin_tone": "👰🏻‍♂️", + "man_with_veil_tone2": "👰🏼‍♂️", + "man_with_veil_medium_light_skin_tone": "👰🏼‍♂️", + "man_with_veil_tone3": "👰🏽‍♂️", + "man_with_veil_medium_skin_tone": "👰🏽‍♂️", + "man_with_veil_tone4": "👰🏾‍♂️", + "man_with_veil_medium_dark_skin_tone": "👰🏾‍♂️", + "man_with_veil_tone5": "👰🏿‍♂️", + "man_with_veil_dark_skin_tone": "👰🏿‍♂️", + "person_in_tuxedo": "🤵", + "person_in_tuxedo_tone1": "🤵🏻", + "tuxedo_tone1": "🤵🏻", + "person_in_tuxedo_tone2": "🤵🏼", + "tuxedo_tone2": "🤵🏼", + "person_in_tuxedo_tone3": "🤵🏽", + "tuxedo_tone3": "🤵🏽", + "person_in_tuxedo_tone4": "🤵🏾", + "tuxedo_tone4": "🤵🏾", + "person_in_tuxedo_tone5": "🤵🏿", + "tuxedo_tone5": "🤵🏿", + "woman_in_tuxedo": "🤵‍♀️", + "woman_in_tuxedo_tone1": "🤵🏻‍♀️", + "woman_in_tuxedo_light_skin_tone": "🤵🏻‍♀️", + "woman_in_tuxedo_tone2": "🤵🏼‍♀️", + "woman_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♀️", + "woman_in_tuxedo_tone3": "🤵🏽‍♀️", + "woman_in_tuxedo_medium_skin_tone": "🤵🏽‍♀️", + "woman_in_tuxedo_tone4": "🤵🏾‍♀️", + "woman_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♀️", + "woman_in_tuxedo_tone5": "🤵🏿‍♀️", + "woman_in_tuxedo_dark_skin_tone": "🤵🏿‍♀️", + "man_in_tuxedo": "🤵‍♂️", + "man_in_tuxedo_tone1": "🤵🏻‍♂️", + "man_in_tuxedo_light_skin_tone": "🤵🏻‍♂️", + "man_in_tuxedo_tone2": "🤵🏼‍♂️", + "man_in_tuxedo_medium_light_skin_tone": "🤵🏼‍♂️", + "man_in_tuxedo_tone3": "🤵🏽‍♂️", + "man_in_tuxedo_medium_skin_tone": "🤵🏽‍♂️", + "man_in_tuxedo_tone4": "🤵🏾‍♂️", + "man_in_tuxedo_medium_dark_skin_tone": "🤵🏾‍♂️", + "man_in_tuxedo_tone5": "🤵🏿‍♂️", + "man_in_tuxedo_dark_skin_tone": "🤵🏿‍♂️", + "princess": "👸", + "princess_tone1": "👸🏻", + "princess_tone2": "👸🏼", + "princess_tone3": "👸🏽", + "princess_tone4": "👸🏾", + "princess_tone5": "👸🏿", + "prince": "🤴", + "prince_tone1": "🤴🏻", + "prince_tone2": "🤴🏼", + "prince_tone3": "🤴🏽", + "prince_tone4": "🤴🏾", + "prince_tone5": "🤴🏿", + "superhero": "🦸", + "superhero_tone1": "🦸🏻", + "superhero_light_skin_tone": "🦸🏻", + "superhero_tone2": "🦸🏼", + "superhero_medium_light_skin_tone": "🦸🏼", + "superhero_tone3": "🦸🏽", + "superhero_medium_skin_tone": "🦸🏽", + "superhero_tone4": "🦸🏾", + "superhero_medium_dark_skin_tone": "🦸🏾", + "superhero_tone5": "🦸🏿", + "superhero_dark_skin_tone": "🦸🏿", + "woman_superhero": "🦸‍♀️", + "woman_superhero_tone1": "🦸🏻‍♀️", + "woman_superhero_light_skin_tone": "🦸🏻‍♀️", + "woman_superhero_tone2": "🦸🏼‍♀️", + "woman_superhero_medium_light_skin_tone": "🦸🏼‍♀️", + "woman_superhero_tone3": "🦸🏽‍♀️", + "woman_superhero_medium_skin_tone": "🦸🏽‍♀️", + "woman_superhero_tone4": "🦸🏾‍♀️", + "woman_superhero_medium_dark_skin_tone": "🦸🏾‍♀️", + "woman_superhero_tone5": "🦸🏿‍♀️", + "woman_superhero_dark_skin_tone": "🦸🏿‍♀️", + "man_superhero": "🦸‍♂️", + "man_superhero_tone1": "🦸🏻‍♂️", + "man_superhero_light_skin_tone": "🦸🏻‍♂️", + "man_superhero_tone2": "🦸🏼‍♂️", + "man_superhero_medium_light_skin_tone": "🦸🏼‍♂️", + "man_superhero_tone3": "🦸🏽‍♂️", + "man_superhero_medium_skin_tone": "🦸🏽‍♂️", + "man_superhero_tone4": "🦸🏾‍♂️", + "man_superhero_medium_dark_skin_tone": "🦸🏾‍♂️", + "man_superhero_tone5": "🦸🏿‍♂️", + "man_superhero_dark_skin_tone": "🦸🏿‍♂️", + "supervillain": "🦹", + "supervillain_tone1": "🦹🏻", + "supervillain_light_skin_tone": "🦹🏻", + "supervillain_tone2": "🦹🏼", + "supervillain_medium_light_skin_tone": "🦹🏼", + "supervillain_tone3": "🦹🏽", + "supervillain_medium_skin_tone": "🦹🏽", + "supervillain_tone4": "🦹🏾", + "supervillain_medium_dark_skin_tone": "🦹🏾", + "supervillain_tone5": "🦹🏿", + "supervillain_dark_skin_tone": "🦹🏿", + "woman_supervillain": "🦹‍♀️", + "woman_supervillain_tone1": "🦹🏻‍♀️", + "woman_supervillain_light_skin_tone": "🦹🏻‍♀️", + "woman_supervillain_tone2": "🦹🏼‍♀️", + "woman_supervillain_medium_light_skin_tone": "🦹🏼‍♀️", + "woman_supervillain_tone3": "🦹🏽‍♀️", + "woman_supervillain_medium_skin_tone": "🦹🏽‍♀️", + "woman_supervillain_tone4": "🦹🏾‍♀️", + "woman_supervillain_medium_dark_skin_tone": "🦹🏾‍♀️", + "woman_supervillain_tone5": "🦹🏿‍♀️", + "woman_supervillain_dark_skin_tone": "🦹🏿‍♀️", + "man_supervillain": "🦹‍♂️", + "man_supervillain_tone1": "🦹🏻‍♂️", + "man_supervillain_light_skin_tone": "🦹🏻‍♂️", + "man_supervillain_tone2": "🦹🏼‍♂️", + "man_supervillain_medium_light_skin_tone": "🦹🏼‍♂️", + "man_supervillain_tone3": "🦹🏽‍♂️", + "man_supervillain_medium_skin_tone": "🦹🏽‍♂️", + "man_supervillain_tone4": "🦹🏾‍♂️", + "man_supervillain_medium_dark_skin_tone": "🦹🏾‍♂️", + "man_supervillain_tone5": "🦹🏿‍♂️", + "man_supervillain_dark_skin_tone": "🦹🏿‍♂️", + "ninja": "🥷", + "ninja_tone1": "🥷🏻", + "ninja_light_skin_tone": "🥷🏻", + "ninja_tone2": "🥷🏼", + "ninja_medium_light_skin_tone": "🥷🏼", + "ninja_tone3": "🥷🏽", + "ninja_medium_skin_tone": "🥷🏽", + "ninja_tone4": "🥷🏾", + "ninja_medium_dark_skin_tone": "🥷🏾", + "ninja_tone5": "🥷🏿", + "ninja_dark_skin_tone": "🥷🏿", + "mx_claus": "🧑‍🎄", + "mx_claus_tone1": "🧑🏻‍🎄", + "mx_claus_light_skin_tone": "🧑🏻‍🎄", + "mx_claus_tone2": "🧑🏼‍🎄", + "mx_claus_medium_light_skin_tone": "🧑🏼‍🎄", + "mx_claus_tone3": "🧑🏽‍🎄", + "mx_claus_medium_skin_tone": "🧑🏽‍🎄", + "mx_claus_tone4": "🧑🏾‍🎄", + "mx_claus_medium_dark_skin_tone": "🧑🏾‍🎄", + "mx_claus_tone5": "🧑🏿‍🎄", + "mx_claus_dark_skin_tone": "🧑🏿‍🎄", + "mrs_claus": "🤶", + "mother_christmas": "🤶", + "mrs_claus_tone1": "🤶🏻", + "mother_christmas_tone1": "🤶🏻", + "mrs_claus_tone2": "🤶🏼", + "mother_christmas_tone2": "🤶🏼", + "mrs_claus_tone3": "🤶🏽", + "mother_christmas_tone3": "🤶🏽", + "mrs_claus_tone4": "🤶🏾", + "mother_christmas_tone4": "🤶🏾", + "mrs_claus_tone5": "🤶🏿", + "mother_christmas_tone5": "🤶🏿", + "santa": "🎅", + "santa_tone1": "🎅🏻", + "santa_tone2": "🎅🏼", + "santa_tone3": "🎅🏽", + "santa_tone4": "🎅🏾", + "santa_tone5": "🎅🏿", + "mage": "🧙", + "mage_tone1": "🧙🏻", + "mage_light_skin_tone": "🧙🏻", + "mage_tone2": "🧙🏼", + "mage_medium_light_skin_tone": "🧙🏼", + "mage_tone3": "🧙🏽", + "mage_medium_skin_tone": "🧙🏽", + "mage_tone4": "🧙🏾", + "mage_medium_dark_skin_tone": "🧙🏾", + "mage_tone5": "🧙🏿", + "mage_dark_skin_tone": "🧙🏿", + "woman_mage": "🧙‍♀️", + "woman_mage_tone1": "🧙🏻‍♀️", + "woman_mage_light_skin_tone": "🧙🏻‍♀️", + "woman_mage_tone2": "🧙🏼‍♀️", + "woman_mage_medium_light_skin_tone": "🧙🏼‍♀️", + "woman_mage_tone3": "🧙🏽‍♀️", + "woman_mage_medium_skin_tone": "🧙🏽‍♀️", + "woman_mage_tone4": "🧙🏾‍♀️", + "woman_mage_medium_dark_skin_tone": "🧙🏾‍♀️", + "woman_mage_tone5": "🧙🏿‍♀️", + "woman_mage_dark_skin_tone": "🧙🏿‍♀️", + "man_mage": "🧙‍♂️", + "man_mage_tone1": "🧙🏻‍♂️", + "man_mage_light_skin_tone": "🧙🏻‍♂️", + "man_mage_tone2": "🧙🏼‍♂️", + "man_mage_medium_light_skin_tone": "🧙🏼‍♂️", + "man_mage_tone3": "🧙🏽‍♂️", + "man_mage_medium_skin_tone": "🧙🏽‍♂️", + "man_mage_tone4": "🧙🏾‍♂️", + "man_mage_medium_dark_skin_tone": "🧙🏾‍♂️", + "man_mage_tone5": "🧙🏿‍♂️", + "man_mage_dark_skin_tone": "🧙🏿‍♂️", + "elf": "🧝", + "elf_tone1": "🧝🏻", + "elf_light_skin_tone": "🧝🏻", + "elf_tone2": "🧝🏼", + "elf_medium_light_skin_tone": "🧝🏼", + "elf_tone3": "🧝🏽", + "elf_medium_skin_tone": "🧝🏽", + "elf_tone4": "🧝🏾", + "elf_medium_dark_skin_tone": "🧝🏾", + "elf_tone5": "🧝🏿", + "elf_dark_skin_tone": "🧝🏿", + "woman_elf": "🧝‍♀️", + "woman_elf_tone1": "🧝🏻‍♀️", + "woman_elf_light_skin_tone": "🧝🏻‍♀️", + "woman_elf_tone2": "🧝🏼‍♀️", + "woman_elf_medium_light_skin_tone": "🧝🏼‍♀️", + "woman_elf_tone3": "🧝🏽‍♀️", + "woman_elf_medium_skin_tone": "🧝🏽‍♀️", + "woman_elf_tone4": "🧝🏾‍♀️", + "woman_elf_medium_dark_skin_tone": "🧝🏾‍♀️", + "woman_elf_tone5": "🧝🏿‍♀️", + "woman_elf_dark_skin_tone": "🧝🏿‍♀️", + "man_elf": "🧝‍♂️", + "man_elf_tone1": "🧝🏻‍♂️", + "man_elf_light_skin_tone": "🧝🏻‍♂️", + "man_elf_tone2": "🧝🏼‍♂️", + "man_elf_medium_light_skin_tone": "🧝🏼‍♂️", + "man_elf_tone3": "🧝🏽‍♂️", + "man_elf_medium_skin_tone": "🧝🏽‍♂️", + "man_elf_tone4": "🧝🏾‍♂️", + "man_elf_medium_dark_skin_tone": "🧝🏾‍♂️", + "man_elf_tone5": "🧝🏿‍♂️", + "man_elf_dark_skin_tone": "🧝🏿‍♂️", + "vampire": "🧛", + "vampire_tone1": "🧛🏻", + "vampire_light_skin_tone": "🧛🏻", + "vampire_tone2": "🧛🏼", + "vampire_medium_light_skin_tone": "🧛🏼", + "vampire_tone3": "🧛🏽", + "vampire_medium_skin_tone": "🧛🏽", + "vampire_tone4": "🧛🏾", + "vampire_medium_dark_skin_tone": "🧛🏾", + "vampire_tone5": "🧛🏿", + "vampire_dark_skin_tone": "🧛🏿", + "woman_vampire": "🧛‍♀️", + "woman_vampire_tone1": "🧛🏻‍♀️", + "woman_vampire_light_skin_tone": "🧛🏻‍♀️", + "woman_vampire_tone2": "🧛🏼‍♀️", + "woman_vampire_medium_light_skin_tone": "🧛🏼‍♀️", + "woman_vampire_tone3": "🧛🏽‍♀️", + "woman_vampire_medium_skin_tone": "🧛🏽‍♀️", + "woman_vampire_tone4": "🧛🏾‍♀️", + "woman_vampire_medium_dark_skin_tone": "🧛🏾‍♀️", + "woman_vampire_tone5": "🧛🏿‍♀️", + "woman_vampire_dark_skin_tone": "🧛🏿‍♀️", + "man_vampire": "🧛‍♂️", + "man_vampire_tone1": "🧛🏻‍♂️", + "man_vampire_light_skin_tone": "🧛🏻‍♂️", + "man_vampire_tone2": "🧛🏼‍♂️", + "man_vampire_medium_light_skin_tone": "🧛🏼‍♂️", + "man_vampire_tone3": "🧛🏽‍♂️", + "man_vampire_medium_skin_tone": "🧛🏽‍♂️", + "man_vampire_tone4": "🧛🏾‍♂️", + "man_vampire_medium_dark_skin_tone": "🧛🏾‍♂️", + "man_vampire_tone5": "🧛🏿‍♂️", + "man_vampire_dark_skin_tone": "🧛🏿‍♂️", + "zombie": "🧟", + "woman_zombie": "🧟‍♀️", + "man_zombie": "🧟‍♂️", + "genie": "🧞", + "woman_genie": "🧞‍♀️", + "man_genie": "🧞‍♂️", + "merperson": "🧜", + "merperson_tone1": "🧜🏻", + "merperson_light_skin_tone": "🧜🏻", + "merperson_tone2": "🧜🏼", + "merperson_medium_light_skin_tone": "🧜🏼", + "merperson_tone3": "🧜🏽", + "merperson_medium_skin_tone": "🧜🏽", + "merperson_tone4": "🧜🏾", + "merperson_medium_dark_skin_tone": "🧜🏾", + "merperson_tone5": "🧜🏿", + "merperson_dark_skin_tone": "🧜🏿", + "mermaid": "🧜‍♀️", + "mermaid_tone1": "🧜🏻‍♀️", + "mermaid_light_skin_tone": "🧜🏻‍♀️", + "mermaid_tone2": "🧜🏼‍♀️", + "mermaid_medium_light_skin_tone": "🧜🏼‍♀️", + "mermaid_tone3": "🧜🏽‍♀️", + "mermaid_medium_skin_tone": "🧜🏽‍♀️", + "mermaid_tone4": "🧜🏾‍♀️", + "mermaid_medium_dark_skin_tone": "🧜🏾‍♀️", + "mermaid_tone5": "🧜🏿‍♀️", + "mermaid_dark_skin_tone": "🧜🏿‍♀️", + "merman": "🧜‍♂️", + "merman_tone1": "🧜🏻‍♂️", + "merman_light_skin_tone": "🧜🏻‍♂️", + "merman_tone2": "🧜🏼‍♂️", + "merman_medium_light_skin_tone": "🧜🏼‍♂️", + "merman_tone3": "🧜🏽‍♂️", + "merman_medium_skin_tone": "🧜🏽‍♂️", + "merman_tone4": "🧜🏾‍♂️", + "merman_medium_dark_skin_tone": "🧜🏾‍♂️", + "merman_tone5": "🧜🏿‍♂️", + "merman_dark_skin_tone": "🧜🏿‍♂️", + "fairy": "🧚", + "fairy_tone1": "🧚🏻", + "fairy_light_skin_tone": "🧚🏻", + "fairy_tone2": "🧚🏼", + "fairy_medium_light_skin_tone": "🧚🏼", + "fairy_tone3": "🧚🏽", + "fairy_medium_skin_tone": "🧚🏽", + "fairy_tone4": "🧚🏾", + "fairy_medium_dark_skin_tone": "🧚🏾", + "fairy_tone5": "🧚🏿", + "fairy_dark_skin_tone": "🧚🏿", + "woman_fairy": "🧚‍♀️", + "woman_fairy_tone1": "🧚🏻‍♀️", + "woman_fairy_light_skin_tone": "🧚🏻‍♀️", + "woman_fairy_tone2": "🧚🏼‍♀️", + "woman_fairy_medium_light_skin_tone": "🧚🏼‍♀️", + "woman_fairy_tone3": "🧚🏽‍♀️", + "woman_fairy_medium_skin_tone": "🧚🏽‍♀️", + "woman_fairy_tone4": "🧚🏾‍♀️", + "woman_fairy_medium_dark_skin_tone": "🧚🏾‍♀️", + "woman_fairy_tone5": "🧚🏿‍♀️", + "woman_fairy_dark_skin_tone": "🧚🏿‍♀️", + "man_fairy": "🧚‍♂️", + "man_fairy_tone1": "🧚🏻‍♂️", + "man_fairy_light_skin_tone": "🧚🏻‍♂️", + "man_fairy_tone2": "🧚🏼‍♂️", + "man_fairy_medium_light_skin_tone": "🧚🏼‍♂️", + "man_fairy_tone3": "🧚🏽‍♂️", + "man_fairy_medium_skin_tone": "🧚🏽‍♂️", + "man_fairy_tone4": "🧚🏾‍♂️", + "man_fairy_medium_dark_skin_tone": "🧚🏾‍♂️", + "man_fairy_tone5": "🧚🏿‍♂️", + "man_fairy_dark_skin_tone": "🧚🏿‍♂️", + "angel": "👼", + "angel_tone1": "👼🏻", + "angel_tone2": "👼🏼", + "angel_tone3": "👼🏽", + "angel_tone4": "👼🏾", + "angel_tone5": "👼🏿", + "pregnant_woman": "🤰", + "expecting_woman": "🤰", + "pregnant_woman_tone1": "🤰🏻", + "expecting_woman_tone1": "🤰🏻", + "pregnant_woman_tone2": "🤰🏼", + "expecting_woman_tone2": "🤰🏼", + "pregnant_woman_tone3": "🤰🏽", + "expecting_woman_tone3": "🤰🏽", + "pregnant_woman_tone4": "🤰🏾", + "expecting_woman_tone4": "🤰🏾", + "pregnant_woman_tone5": "🤰🏿", + "expecting_woman_tone5": "🤰🏿", + "breast_feeding": "🤱", + "breast_feeding_tone1": "🤱🏻", + "breast_feeding_light_skin_tone": "🤱🏻", + "breast_feeding_tone2": "🤱🏼", + "breast_feeding_medium_light_skin_tone": "🤱🏼", + "breast_feeding_tone3": "🤱🏽", + "breast_feeding_medium_skin_tone": "🤱🏽", + "breast_feeding_tone4": "🤱🏾", + "breast_feeding_medium_dark_skin_tone": "🤱🏾", + "breast_feeding_tone5": "🤱🏿", + "breast_feeding_dark_skin_tone": "🤱🏿", + "person_feeding_baby": "🧑‍🍼", + "person_feeding_baby_tone1": "🧑🏻‍🍼", + "person_feeding_baby_light_skin_tone": "🧑🏻‍🍼", + "person_feeding_baby_tone2": "🧑🏼‍🍼", + "person_feeding_baby_medium_light_skin_tone": "🧑🏼‍🍼", + "person_feeding_baby_tone3": "🧑🏽‍🍼", + "person_feeding_baby_medium_skin_tone": "🧑🏽‍🍼", + "person_feeding_baby_tone4": "🧑🏾‍🍼", + "person_feeding_baby_medium_dark_skin_tone": "🧑🏾‍🍼", + "person_feeding_baby_tone5": "🧑🏿‍🍼", + "person_feeding_baby_dark_skin_tone": "🧑🏿‍🍼", + "woman_feeding_baby": "👩‍🍼", + "woman_feeding_baby_tone1": "👩🏻‍🍼", + "woman_feeding_baby_light_skin_tone": "👩🏻‍🍼", + "woman_feeding_baby_tone2": "👩🏼‍🍼", + "woman_feeding_baby_medium_light_skin_tone": "👩🏼‍🍼", + "woman_feeding_baby_tone3": "👩🏽‍🍼", + "woman_feeding_baby_medium_skin_tone": "👩🏽‍🍼", + "woman_feeding_baby_tone4": "👩🏾‍🍼", + "woman_feeding_baby_medium_dark_skin_tone": "👩🏾‍🍼", + "woman_feeding_baby_tone5": "👩🏿‍🍼", + "woman_feeding_baby_dark_skin_tone": "👩🏿‍🍼", + "man_feeding_baby": "👨‍🍼", + "man_feeding_baby_tone1": "👨🏻‍🍼", + "man_feeding_baby_light_skin_tone": "👨🏻‍🍼", + "man_feeding_baby_tone2": "👨🏼‍🍼", + "man_feeding_baby_medium_light_skin_tone": "👨🏼‍🍼", + "man_feeding_baby_tone3": "👨🏽‍🍼", + "man_feeding_baby_medium_skin_tone": "👨🏽‍🍼", + "man_feeding_baby_tone4": "👨🏾‍🍼", + "man_feeding_baby_medium_dark_skin_tone": "👨🏾‍🍼", + "man_feeding_baby_tone5": "👨🏿‍🍼", + "man_feeding_baby_dark_skin_tone": "👨🏿‍🍼", + "person_bowing": "🙇", + "bow": "🙇", + "person_bowing_tone1": "🙇🏻", + "bow_tone1": "🙇🏻", + "person_bowing_tone2": "🙇🏼", + "bow_tone2": "🙇🏼", + "person_bowing_tone3": "🙇🏽", + "bow_tone3": "🙇🏽", + "person_bowing_tone4": "🙇🏾", + "bow_tone4": "🙇🏾", + "person_bowing_tone5": "🙇🏿", + "bow_tone5": "🙇🏿", + "woman_bowing": "🙇‍♀️", + "woman_bowing_tone1": "🙇🏻‍♀️", + "woman_bowing_light_skin_tone": "🙇🏻‍♀️", + "woman_bowing_tone2": "🙇🏼‍♀️", + "woman_bowing_medium_light_skin_tone": "🙇🏼‍♀️", + "woman_bowing_tone3": "🙇🏽‍♀️", + "woman_bowing_medium_skin_tone": "🙇🏽‍♀️", + "woman_bowing_tone4": "🙇🏾‍♀️", + "woman_bowing_medium_dark_skin_tone": "🙇🏾‍♀️", + "woman_bowing_tone5": "🙇🏿‍♀️", + "woman_bowing_dark_skin_tone": "🙇🏿‍♀️", + "man_bowing": "🙇‍♂️", + "man_bowing_tone1": "🙇🏻‍♂️", + "man_bowing_light_skin_tone": "🙇🏻‍♂️", + "man_bowing_tone2": "🙇🏼‍♂️", + "man_bowing_medium_light_skin_tone": "🙇🏼‍♂️", + "man_bowing_tone3": "🙇🏽‍♂️", + "man_bowing_medium_skin_tone": "🙇🏽‍♂️", + "man_bowing_tone4": "🙇🏾‍♂️", + "man_bowing_medium_dark_skin_tone": "🙇🏾‍♂️", + "man_bowing_tone5": "🙇🏿‍♂️", + "man_bowing_dark_skin_tone": "🙇🏿‍♂️", + "person_tipping_hand": "💁", + "information_desk_person": "💁", + "person_tipping_hand_tone1": "💁🏻", + "information_desk_person_tone1": "💁🏻", + "person_tipping_hand_tone2": "💁🏼", + "information_desk_person_tone2": "💁🏼", + "person_tipping_hand_tone3": "💁🏽", + "information_desk_person_tone3": "💁🏽", + "person_tipping_hand_tone4": "💁🏾", + "information_desk_person_tone4": "💁🏾", + "person_tipping_hand_tone5": "💁🏿", + "information_desk_person_tone5": "💁🏿", + "woman_tipping_hand": "💁‍♀️", + "woman_tipping_hand_tone1": "💁🏻‍♀️", + "woman_tipping_hand_light_skin_tone": "💁🏻‍♀️", + "woman_tipping_hand_tone2": "💁🏼‍♀️", + "woman_tipping_hand_medium_light_skin_tone": "💁🏼‍♀️", + "woman_tipping_hand_tone3": "💁🏽‍♀️", + "woman_tipping_hand_medium_skin_tone": "💁🏽‍♀️", + "woman_tipping_hand_tone4": "💁🏾‍♀️", + "woman_tipping_hand_medium_dark_skin_tone": "💁🏾‍♀️", + "woman_tipping_hand_tone5": "💁🏿‍♀️", + "woman_tipping_hand_dark_skin_tone": "💁🏿‍♀️", + "man_tipping_hand": "💁‍♂️", + "man_tipping_hand_tone1": "💁🏻‍♂️", + "man_tipping_hand_light_skin_tone": "💁🏻‍♂️", + "man_tipping_hand_tone2": "💁🏼‍♂️", + "man_tipping_hand_medium_light_skin_tone": "💁🏼‍♂️", + "man_tipping_hand_tone3": "💁🏽‍♂️", + "man_tipping_hand_medium_skin_tone": "💁🏽‍♂️", + "man_tipping_hand_tone4": "💁🏾‍♂️", + "man_tipping_hand_medium_dark_skin_tone": "💁🏾‍♂️", + "man_tipping_hand_tone5": "💁🏿‍♂️", + "man_tipping_hand_dark_skin_tone": "💁🏿‍♂️", + "person_gesturing_no": "🙅", + "no_good": "🙅", + "person_gesturing_no_tone1": "🙅🏻", + "no_good_tone1": "🙅🏻", + "person_gesturing_no_tone2": "🙅🏼", + "no_good_tone2": "🙅🏼", + "person_gesturing_no_tone3": "🙅🏽", + "no_good_tone3": "🙅🏽", + "person_gesturing_no_tone4": "🙅🏾", + "no_good_tone4": "🙅🏾", + "person_gesturing_no_tone5": "🙅🏿", + "no_good_tone5": "🙅🏿", + "woman_gesturing_no": "🙅‍♀️", + "woman_gesturing_no_tone1": "🙅🏻‍♀️", + "woman_gesturing_no_light_skin_tone": "🙅🏻‍♀️", + "woman_gesturing_no_tone2": "🙅🏼‍♀️", + "woman_gesturing_no_medium_light_skin_tone": "🙅🏼‍♀️", + "woman_gesturing_no_tone3": "🙅🏽‍♀️", + "woman_gesturing_no_medium_skin_tone": "🙅🏽‍♀️", + "woman_gesturing_no_tone4": "🙅🏾‍♀️", + "woman_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♀️", + "woman_gesturing_no_tone5": "🙅🏿‍♀️", + "woman_gesturing_no_dark_skin_tone": "🙅🏿‍♀️", + "man_gesturing_no": "🙅‍♂️", + "man_gesturing_no_tone1": "🙅🏻‍♂️", + "man_gesturing_no_light_skin_tone": "🙅🏻‍♂️", + "man_gesturing_no_tone2": "🙅🏼‍♂️", + "man_gesturing_no_medium_light_skin_tone": "🙅🏼‍♂️", + "man_gesturing_no_tone3": "🙅🏽‍♂️", + "man_gesturing_no_medium_skin_tone": "🙅🏽‍♂️", + "man_gesturing_no_tone4": "🙅🏾‍♂️", + "man_gesturing_no_medium_dark_skin_tone": "🙅🏾‍♂️", + "man_gesturing_no_tone5": "🙅🏿‍♂️", + "man_gesturing_no_dark_skin_tone": "🙅🏿‍♂️", + "person_gesturing_ok": "🙆", + "ok_woman": "🙆", + "person_gesturing_ok_tone1": "🙆🏻", + "ok_woman_tone1": "🙆🏻", + "person_gesturing_ok_tone2": "🙆🏼", + "ok_woman_tone2": "🙆🏼", + "person_gesturing_ok_tone3": "🙆🏽", + "ok_woman_tone3": "🙆🏽", + "person_gesturing_ok_tone4": "🙆🏾", + "ok_woman_tone4": "🙆🏾", + "person_gesturing_ok_tone5": "🙆🏿", + "ok_woman_tone5": "🙆🏿", + "woman_gesturing_ok": "🙆‍♀️", + "woman_gesturing_ok_tone1": "🙆🏻‍♀️", + "woman_gesturing_ok_light_skin_tone": "🙆🏻‍♀️", + "woman_gesturing_ok_tone2": "🙆🏼‍♀️", + "woman_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♀️", + "woman_gesturing_ok_tone3": "🙆🏽‍♀️", + "woman_gesturing_ok_medium_skin_tone": "🙆🏽‍♀️", + "woman_gesturing_ok_tone4": "🙆🏾‍♀️", + "woman_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♀️", + "woman_gesturing_ok_tone5": "🙆🏿‍♀️", + "woman_gesturing_ok_dark_skin_tone": "🙆🏿‍♀️", + "man_gesturing_ok": "🙆‍♂️", + "man_gesturing_ok_tone1": "🙆🏻‍♂️", + "man_gesturing_ok_light_skin_tone": "🙆🏻‍♂️", + "man_gesturing_ok_tone2": "🙆🏼‍♂️", + "man_gesturing_ok_medium_light_skin_tone": "🙆🏼‍♂️", + "man_gesturing_ok_tone3": "🙆🏽‍♂️", + "man_gesturing_ok_medium_skin_tone": "🙆🏽‍♂️", + "man_gesturing_ok_tone4": "🙆🏾‍♂️", + "man_gesturing_ok_medium_dark_skin_tone": "🙆🏾‍♂️", + "man_gesturing_ok_tone5": "🙆🏿‍♂️", + "man_gesturing_ok_dark_skin_tone": "🙆🏿‍♂️", + "person_raising_hand": "🙋", + "raising_hand": "🙋", + "person_raising_hand_tone1": "🙋🏻", + "raising_hand_tone1": "🙋🏻", + "person_raising_hand_tone2": "🙋🏼", + "raising_hand_tone2": "🙋🏼", + "person_raising_hand_tone3": "🙋🏽", + "raising_hand_tone3": "🙋🏽", + "person_raising_hand_tone4": "🙋🏾", + "raising_hand_tone4": "🙋🏾", + "person_raising_hand_tone5": "🙋🏿", + "raising_hand_tone5": "🙋🏿", + "woman_raising_hand": "🙋‍♀️", + "woman_raising_hand_tone1": "🙋🏻‍♀️", + "woman_raising_hand_light_skin_tone": "🙋🏻‍♀️", + "woman_raising_hand_tone2": "🙋🏼‍♀️", + "woman_raising_hand_medium_light_skin_tone": "🙋🏼‍♀️", + "woman_raising_hand_tone3": "🙋🏽‍♀️", + "woman_raising_hand_medium_skin_tone": "🙋🏽‍♀️", + "woman_raising_hand_tone4": "🙋🏾‍♀️", + "woman_raising_hand_medium_dark_skin_tone": "🙋🏾‍♀️", + "woman_raising_hand_tone5": "🙋🏿‍♀️", + "woman_raising_hand_dark_skin_tone": "🙋🏿‍♀️", + "man_raising_hand": "🙋‍♂️", + "man_raising_hand_tone1": "🙋🏻‍♂️", + "man_raising_hand_light_skin_tone": "🙋🏻‍♂️", + "man_raising_hand_tone2": "🙋🏼‍♂️", + "man_raising_hand_medium_light_skin_tone": "🙋🏼‍♂️", + "man_raising_hand_tone3": "🙋🏽‍♂️", + "man_raising_hand_medium_skin_tone": "🙋🏽‍♂️", + "man_raising_hand_tone4": "🙋🏾‍♂️", + "man_raising_hand_medium_dark_skin_tone": "🙋🏾‍♂️", + "man_raising_hand_tone5": "🙋🏿‍♂️", + "man_raising_hand_dark_skin_tone": "🙋🏿‍♂️", + "deaf_person": "🧏", + "deaf_person_tone1": "🧏🏻", + "deaf_person_light_skin_tone": "🧏🏻", + "deaf_person_tone2": "🧏🏼", + "deaf_person_medium_light_skin_tone": "🧏🏼", + "deaf_person_tone3": "🧏🏽", + "deaf_person_medium_skin_tone": "🧏🏽", + "deaf_person_tone4": "🧏🏾", + "deaf_person_medium_dark_skin_tone": "🧏🏾", + "deaf_person_tone5": "🧏🏿", + "deaf_person_dark_skin_tone": "🧏🏿", + "deaf_woman": "🧏‍♀️", + "deaf_woman_tone1": "🧏🏻‍♀️", + "deaf_woman_light_skin_tone": "🧏🏻‍♀️", + "deaf_woman_tone2": "🧏🏼‍♀️", + "deaf_woman_medium_light_skin_tone": "🧏🏼‍♀️", + "deaf_woman_tone3": "🧏🏽‍♀️", + "deaf_woman_medium_skin_tone": "🧏🏽‍♀️", + "deaf_woman_tone4": "🧏🏾‍♀️", + "deaf_woman_medium_dark_skin_tone": "🧏🏾‍♀️", + "deaf_woman_tone5": "🧏🏿‍♀️", + "deaf_woman_dark_skin_tone": "🧏🏿‍♀️", + "deaf_man": "🧏‍♂️", + "deaf_man_tone1": "🧏🏻‍♂️", + "deaf_man_light_skin_tone": "🧏🏻‍♂️", + "deaf_man_tone2": "🧏🏼‍♂️", + "deaf_man_medium_light_skin_tone": "🧏🏼‍♂️", + "deaf_man_tone3": "🧏🏽‍♂️", + "deaf_man_medium_skin_tone": "🧏🏽‍♂️", + "deaf_man_tone4": "🧏🏾‍♂️", + "deaf_man_medium_dark_skin_tone": "🧏🏾‍♂️", + "deaf_man_tone5": "🧏🏿‍♂️", + "deaf_man_dark_skin_tone": "🧏🏿‍♂️", + "person_facepalming": "🤦", + "face_palm": "🤦", + "facepalm": "🤦", + "person_facepalming_tone1": "🤦🏻", + "face_palm_tone1": "🤦🏻", + "facepalm_tone1": "🤦🏻", + "person_facepalming_tone2": "🤦🏼", + "face_palm_tone2": "🤦🏼", + "facepalm_tone2": "🤦🏼", + "person_facepalming_tone3": "🤦🏽", + "face_palm_tone3": "🤦🏽", + "facepalm_tone3": "🤦🏽", + "person_facepalming_tone4": "🤦🏾", + "face_palm_tone4": "🤦🏾", + "facepalm_tone4": "🤦🏾", + "person_facepalming_tone5": "🤦🏿", + "face_palm_tone5": "🤦🏿", + "facepalm_tone5": "🤦🏿", + "woman_facepalming": "🤦‍♀️", + "woman_facepalming_tone1": "🤦🏻‍♀️", + "woman_facepalming_light_skin_tone": "🤦🏻‍♀️", + "woman_facepalming_tone2": "🤦🏼‍♀️", + "woman_facepalming_medium_light_skin_tone": "🤦🏼‍♀️", + "woman_facepalming_tone3": "🤦🏽‍♀️", + "woman_facepalming_medium_skin_tone": "🤦🏽‍♀️", + "woman_facepalming_tone4": "🤦🏾‍♀️", + "woman_facepalming_medium_dark_skin_tone": "🤦🏾‍♀️", + "woman_facepalming_tone5": "🤦🏿‍♀️", + "woman_facepalming_dark_skin_tone": "🤦🏿‍♀️", + "man_facepalming": "🤦‍♂️", + "man_facepalming_tone1": "🤦🏻‍♂️", + "man_facepalming_light_skin_tone": "🤦🏻‍♂️", + "man_facepalming_tone2": "🤦🏼‍♂️", + "man_facepalming_medium_light_skin_tone": "🤦🏼‍♂️", + "man_facepalming_tone3": "🤦🏽‍♂️", + "man_facepalming_medium_skin_tone": "🤦🏽‍♂️", + "man_facepalming_tone4": "🤦🏾‍♂️", + "man_facepalming_medium_dark_skin_tone": "🤦🏾‍♂️", + "man_facepalming_tone5": "🤦🏿‍♂️", + "man_facepalming_dark_skin_tone": "🤦🏿‍♂️", + "person_shrugging": "🤷", + "shrug": "🤷", + "person_shrugging_tone1": "🤷🏻", + "shrug_tone1": "🤷🏻", + "person_shrugging_tone2": "🤷🏼", + "shrug_tone2": "🤷🏼", + "person_shrugging_tone3": "🤷🏽", + "shrug_tone3": "🤷🏽", + "person_shrugging_tone4": "🤷🏾", + "shrug_tone4": "🤷🏾", + "person_shrugging_tone5": "🤷🏿", + "shrug_tone5": "🤷🏿", + "woman_shrugging": "🤷‍♀️", + "woman_shrugging_tone1": "🤷🏻‍♀️", + "woman_shrugging_light_skin_tone": "🤷🏻‍♀️", + "woman_shrugging_tone2": "🤷🏼‍♀️", + "woman_shrugging_medium_light_skin_tone": "🤷🏼‍♀️", + "woman_shrugging_tone3": "🤷🏽‍♀️", + "woman_shrugging_medium_skin_tone": "🤷🏽‍♀️", + "woman_shrugging_tone4": "🤷🏾‍♀️", + "woman_shrugging_medium_dark_skin_tone": "🤷🏾‍♀️", + "woman_shrugging_tone5": "🤷🏿‍♀️", + "woman_shrugging_dark_skin_tone": "🤷🏿‍♀️", + "man_shrugging": "🤷‍♂️", + "man_shrugging_tone1": "🤷🏻‍♂️", + "man_shrugging_light_skin_tone": "🤷🏻‍♂️", + "man_shrugging_tone2": "🤷🏼‍♂️", + "man_shrugging_medium_light_skin_tone": "🤷🏼‍♂️", + "man_shrugging_tone3": "🤷🏽‍♂️", + "man_shrugging_medium_skin_tone": "🤷🏽‍♂️", + "man_shrugging_tone4": "🤷🏾‍♂️", + "man_shrugging_medium_dark_skin_tone": "🤷🏾‍♂️", + "man_shrugging_tone5": "🤷🏿‍♂️", + "man_shrugging_dark_skin_tone": "🤷🏿‍♂️", + "person_pouting": "🙎", + "person_with_pouting_face": "🙎", + "person_pouting_tone1": "🙎🏻", + "person_with_pouting_face_tone1": "🙎🏻", + "person_pouting_tone2": "🙎🏼", + "person_with_pouting_face_tone2": "🙎🏼", + "person_pouting_tone3": "🙎🏽", + "person_with_pouting_face_tone3": "🙎🏽", + "person_pouting_tone4": "🙎🏾", + "person_with_pouting_face_tone4": "🙎🏾", + "person_pouting_tone5": "🙎🏿", + "person_with_pouting_face_tone5": "🙎🏿", + "woman_pouting": "🙎‍♀️", + "woman_pouting_tone1": "🙎🏻‍♀️", + "woman_pouting_light_skin_tone": "🙎🏻‍♀️", + "woman_pouting_tone2": "🙎🏼‍♀️", + "woman_pouting_medium_light_skin_tone": "🙎🏼‍♀️", + "woman_pouting_tone3": "🙎🏽‍♀️", + "woman_pouting_medium_skin_tone": "🙎🏽‍♀️", + "woman_pouting_tone4": "🙎🏾‍♀️", + "woman_pouting_medium_dark_skin_tone": "🙎🏾‍♀️", + "woman_pouting_tone5": "🙎🏿‍♀️", + "woman_pouting_dark_skin_tone": "🙎🏿‍♀️", + "man_pouting": "🙎‍♂️", + "man_pouting_tone1": "🙎🏻‍♂️", + "man_pouting_light_skin_tone": "🙎🏻‍♂️", + "man_pouting_tone2": "🙎🏼‍♂️", + "man_pouting_medium_light_skin_tone": "🙎🏼‍♂️", + "man_pouting_tone3": "🙎🏽‍♂️", + "man_pouting_medium_skin_tone": "🙎🏽‍♂️", + "man_pouting_tone4": "🙎🏾‍♂️", + "man_pouting_medium_dark_skin_tone": "🙎🏾‍♂️", + "man_pouting_tone5": "🙎🏿‍♂️", + "man_pouting_dark_skin_tone": "🙎🏿‍♂️", + "person_frowning": "🙍", + "person_frowning_tone1": "🙍🏻", + "person_frowning_tone2": "🙍🏼", + "person_frowning_tone3": "🙍🏽", + "person_frowning_tone4": "🙍🏾", + "person_frowning_tone5": "🙍🏿", + "woman_frowning": "🙍‍♀️", + "woman_frowning_tone1": "🙍🏻‍♀️", + "woman_frowning_light_skin_tone": "🙍🏻‍♀️", + "woman_frowning_tone2": "🙍🏼‍♀️", + "woman_frowning_medium_light_skin_tone": "🙍🏼‍♀️", + "woman_frowning_tone3": "🙍🏽‍♀️", + "woman_frowning_medium_skin_tone": "🙍🏽‍♀️", + "woman_frowning_tone4": "🙍🏾‍♀️", + "woman_frowning_medium_dark_skin_tone": "🙍🏾‍♀️", + "woman_frowning_tone5": "🙍🏿‍♀️", + "woman_frowning_dark_skin_tone": "🙍🏿‍♀️", + "man_frowning": "🙍‍♂️", + "man_frowning_tone1": "🙍🏻‍♂️", + "man_frowning_light_skin_tone": "🙍🏻‍♂️", + "man_frowning_tone2": "🙍🏼‍♂️", + "man_frowning_medium_light_skin_tone": "🙍🏼‍♂️", + "man_frowning_tone3": "🙍🏽‍♂️", + "man_frowning_medium_skin_tone": "🙍🏽‍♂️", + "man_frowning_tone4": "🙍🏾‍♂️", + "man_frowning_medium_dark_skin_tone": "🙍🏾‍♂️", + "man_frowning_tone5": "🙍🏿‍♂️", + "man_frowning_dark_skin_tone": "🙍🏿‍♂️", + "person_getting_haircut": "💇", + "haircut": "💇", + "person_getting_haircut_tone1": "💇🏻", + "haircut_tone1": "💇🏻", + "person_getting_haircut_tone2": "💇🏼", + "haircut_tone2": "💇🏼", + "person_getting_haircut_tone3": "💇🏽", + "haircut_tone3": "💇🏽", + "person_getting_haircut_tone4": "💇🏾", + "haircut_tone4": "💇🏾", + "person_getting_haircut_tone5": "💇🏿", + "haircut_tone5": "💇🏿", + "woman_getting_haircut": "💇‍♀️", + "woman_getting_haircut_tone1": "💇🏻‍♀️", + "woman_getting_haircut_light_skin_tone": "💇🏻‍♀️", + "woman_getting_haircut_tone2": "💇🏼‍♀️", + "woman_getting_haircut_medium_light_skin_tone": "💇🏼‍♀️", + "woman_getting_haircut_tone3": "💇🏽‍♀️", + "woman_getting_haircut_medium_skin_tone": "💇🏽‍♀️", + "woman_getting_haircut_tone4": "💇🏾‍♀️", + "woman_getting_haircut_medium_dark_skin_tone": "💇🏾‍♀️", + "woman_getting_haircut_tone5": "💇🏿‍♀️", + "woman_getting_haircut_dark_skin_tone": "💇🏿‍♀️", + "man_getting_haircut": "💇‍♂️", + "man_getting_haircut_tone1": "💇🏻‍♂️", + "man_getting_haircut_light_skin_tone": "💇🏻‍♂️", + "man_getting_haircut_tone2": "💇🏼‍♂️", + "man_getting_haircut_medium_light_skin_tone": "💇🏼‍♂️", + "man_getting_haircut_tone3": "💇🏽‍♂️", + "man_getting_haircut_medium_skin_tone": "💇🏽‍♂️", + "man_getting_haircut_tone4": "💇🏾‍♂️", + "man_getting_haircut_medium_dark_skin_tone": "💇🏾‍♂️", + "man_getting_haircut_tone5": "💇🏿‍♂️", + "man_getting_haircut_dark_skin_tone": "💇🏿‍♂️", + "person_getting_massage": "💆", + "massage": "💆", + "person_getting_massage_tone1": "💆🏻", + "massage_tone1": "💆🏻", + "person_getting_massage_tone2": "💆🏼", + "massage_tone2": "💆🏼", + "person_getting_massage_tone3": "💆🏽", + "massage_tone3": "💆🏽", + "person_getting_massage_tone4": "💆🏾", + "massage_tone4": "💆🏾", + "person_getting_massage_tone5": "💆🏿", + "massage_tone5": "💆🏿", + "woman_getting_face_massage": "💆‍♀️", + "woman_getting_face_massage_tone1": "💆🏻‍♀️", + "woman_getting_face_massage_light_skin_tone": "💆🏻‍♀️", + "woman_getting_face_massage_tone2": "💆🏼‍♀️", + "woman_getting_face_massage_medium_light_skin_tone": "💆🏼‍♀️", + "woman_getting_face_massage_tone3": "💆🏽‍♀️", + "woman_getting_face_massage_medium_skin_tone": "💆🏽‍♀️", + "woman_getting_face_massage_tone4": "💆🏾‍♀️", + "woman_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♀️", + "woman_getting_face_massage_tone5": "💆🏿‍♀️", + "woman_getting_face_massage_dark_skin_tone": "💆🏿‍♀️", + "man_getting_face_massage": "💆‍♂️", + "man_getting_face_massage_tone1": "💆🏻‍♂️", + "man_getting_face_massage_light_skin_tone": "💆🏻‍♂️", + "man_getting_face_massage_tone2": "💆🏼‍♂️", + "man_getting_face_massage_medium_light_skin_tone": "💆🏼‍♂️", + "man_getting_face_massage_tone3": "💆🏽‍♂️", + "man_getting_face_massage_medium_skin_tone": "💆🏽‍♂️", + "man_getting_face_massage_tone4": "💆🏾‍♂️", + "man_getting_face_massage_medium_dark_skin_tone": "💆🏾‍♂️", + "man_getting_face_massage_tone5": "💆🏿‍♂️", + "man_getting_face_massage_dark_skin_tone": "💆🏿‍♂️", + "person_in_steamy_room": "🧖", + "person_in_steamy_room_tone1": "🧖🏻", + "person_in_steamy_room_light_skin_tone": "🧖🏻", + "person_in_steamy_room_tone2": "🧖🏼", + "person_in_steamy_room_medium_light_skin_tone": "🧖🏼", + "person_in_steamy_room_tone3": "🧖🏽", + "person_in_steamy_room_medium_skin_tone": "🧖🏽", + "person_in_steamy_room_tone4": "🧖🏾", + "person_in_steamy_room_medium_dark_skin_tone": "🧖🏾", + "person_in_steamy_room_tone5": "🧖🏿", + "person_in_steamy_room_dark_skin_tone": "🧖🏿", + "woman_in_steamy_room": "🧖‍♀️", + "woman_in_steamy_room_tone1": "🧖🏻‍♀️", + "woman_in_steamy_room_light_skin_tone": "🧖🏻‍♀️", + "woman_in_steamy_room_tone2": "🧖🏼‍♀️", + "woman_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♀️", + "woman_in_steamy_room_tone3": "🧖🏽‍♀️", + "woman_in_steamy_room_medium_skin_tone": "🧖🏽‍♀️", + "woman_in_steamy_room_tone4": "🧖🏾‍♀️", + "woman_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♀️", + "woman_in_steamy_room_tone5": "🧖🏿‍♀️", + "woman_in_steamy_room_dark_skin_tone": "🧖🏿‍♀️", + "man_in_steamy_room": "🧖‍♂️", + "man_in_steamy_room_tone1": "🧖🏻‍♂️", + "man_in_steamy_room_light_skin_tone": "🧖🏻‍♂️", + "man_in_steamy_room_tone2": "🧖🏼‍♂️", + "man_in_steamy_room_medium_light_skin_tone": "🧖🏼‍♂️", + "man_in_steamy_room_tone3": "🧖🏽‍♂️", + "man_in_steamy_room_medium_skin_tone": "🧖🏽‍♂️", + "man_in_steamy_room_tone4": "🧖🏾‍♂️", + "man_in_steamy_room_medium_dark_skin_tone": "🧖🏾‍♂️", + "man_in_steamy_room_tone5": "🧖🏿‍♂️", + "man_in_steamy_room_dark_skin_tone": "🧖🏿‍♂️", + "nail_care": "💅", + "nail_care_tone1": "💅🏻", + "nail_care_tone2": "💅🏼", + "nail_care_tone3": "💅🏽", + "nail_care_tone4": "💅🏾", + "nail_care_tone5": "💅🏿", + "selfie": "🤳", + "selfie_tone1": "🤳🏻", + "selfie_tone2": "🤳🏼", + "selfie_tone3": "🤳🏽", + "selfie_tone4": "🤳🏾", + "selfie_tone5": "🤳🏿", + "dancer": "💃", + "dancer_tone1": "💃🏻", + "dancer_tone2": "💃🏼", + "dancer_tone3": "💃🏽", + "dancer_tone4": "💃🏾", + "dancer_tone5": "💃🏿", + "man_dancing": "🕺", + "male_dancer": "🕺", + "man_dancing_tone1": "🕺🏻", + "male_dancer_tone1": "🕺🏻", + "man_dancing_tone2": "🕺🏼", + "male_dancer_tone2": "🕺🏼", + "man_dancing_tone3": "🕺🏽", + "male_dancer_tone3": "🕺🏽", + "man_dancing_tone5": "🕺🏿", + "male_dancer_tone5": "🕺🏿", + "man_dancing_tone4": "🕺🏾", + "male_dancer_tone4": "🕺🏾", + "people_with_bunny_ears_partying": "👯", + "dancers": "👯", + "women_with_bunny_ears_partying": "👯‍♀️", + "men_with_bunny_ears_partying": "👯‍♂️", + "levitate": "🕴️", + "man_in_business_suit_levitating": "🕴️", + "levitate_tone1": "🕴🏻", + "man_in_business_suit_levitating_tone1": "🕴🏻", + "man_in_business_suit_levitating_light_skin_tone": "🕴🏻", + "levitate_tone2": "🕴🏼", + "man_in_business_suit_levitating_tone2": "🕴🏼", + "man_in_business_suit_levitating_medium_light_skin_tone": "🕴🏼", + "levitate_tone3": "🕴🏽", + "man_in_business_suit_levitating_tone3": "🕴🏽", + "man_in_business_suit_levitating_medium_skin_tone": "🕴🏽", + "levitate_tone4": "🕴🏾", + "man_in_business_suit_levitating_tone4": "🕴🏾", + "man_in_business_suit_levitating_medium_dark_skin_tone": "🕴🏾", + "levitate_tone5": "🕴🏿", + "man_in_business_suit_levitating_tone5": "🕴🏿", + "man_in_business_suit_levitating_dark_skin_tone": "🕴🏿", + "person_in_manual_wheelchair": "🧑‍🦽", + "person_in_manual_wheelchair_tone1": "🧑🏻‍🦽", + "person_in_manual_wheelchair_light_skin_tone": "🧑🏻‍🦽", + "person_in_manual_wheelchair_tone2": "🧑🏼‍🦽", + "person_in_manual_wheelchair_medium_light_skin_tone": "🧑🏼‍🦽", + "person_in_manual_wheelchair_tone3": "🧑🏽‍🦽", + "person_in_manual_wheelchair_medium_skin_tone": "🧑🏽‍🦽", + "person_in_manual_wheelchair_tone4": "🧑🏾‍🦽", + "person_in_manual_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦽", + "person_in_manual_wheelchair_tone5": "🧑🏿‍🦽", + "person_in_manual_wheelchair_dark_skin_tone": "🧑🏿‍🦽", + "woman_in_manual_wheelchair": "👩‍🦽", + "woman_in_manual_wheelchair_tone1": "👩🏻‍🦽", + "woman_in_manual_wheelchair_light_skin_tone": "👩🏻‍🦽", + "woman_in_manual_wheelchair_tone2": "👩🏼‍🦽", + "woman_in_manual_wheelchair_medium_light_skin_tone": "👩🏼‍🦽", + "woman_in_manual_wheelchair_tone3": "👩🏽‍🦽", + "woman_in_manual_wheelchair_medium_skin_tone": "👩🏽‍🦽", + "woman_in_manual_wheelchair_tone4": "👩🏾‍🦽", + "woman_in_manual_wheelchair_medium_dark_skin_tone": "👩🏾‍🦽", + "woman_in_manual_wheelchair_tone5": "👩🏿‍🦽", + "woman_in_manual_wheelchair_dark_skin_tone": "👩🏿‍🦽", + "man_in_manual_wheelchair": "👨‍🦽", + "man_in_manual_wheelchair_tone1": "👨🏻‍🦽", + "man_in_manual_wheelchair_light_skin_tone": "👨🏻‍🦽", + "man_in_manual_wheelchair_tone2": "👨🏼‍🦽", + "man_in_manual_wheelchair_medium_light_skin_tone": "👨🏼‍🦽", + "man_in_manual_wheelchair_tone3": "👨🏽‍🦽", + "man_in_manual_wheelchair_medium_skin_tone": "👨🏽‍🦽", + "man_in_manual_wheelchair_tone4": "👨🏾‍🦽", + "man_in_manual_wheelchair_medium_dark_skin_tone": "👨🏾‍🦽", + "man_in_manual_wheelchair_tone5": "👨🏿‍🦽", + "man_in_manual_wheelchair_dark_skin_tone": "👨🏿‍🦽", + "person_in_motorized_wheelchair": "🧑‍🦼", + "person_in_motorized_wheelchair_tone1": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_light_skin_tone": "🧑🏻‍🦼", + "person_in_motorized_wheelchair_tone2": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_medium_light_skin_tone": "🧑🏼‍🦼", + "person_in_motorized_wheelchair_tone3": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_medium_skin_tone": "🧑🏽‍🦼", + "person_in_motorized_wheelchair_tone4": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_medium_dark_skin_tone": "🧑🏾‍🦼", + "person_in_motorized_wheelchair_tone5": "🧑🏿‍🦼", + "person_in_motorized_wheelchair_dark_skin_tone": "🧑🏿‍🦼", + "woman_in_motorized_wheelchair": "👩‍🦼", + "woman_in_motorized_wheelchair_tone1": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_light_skin_tone": "👩🏻‍🦼", + "woman_in_motorized_wheelchair_tone2": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_medium_light_skin_tone": "👩🏼‍🦼", + "woman_in_motorized_wheelchair_tone3": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_medium_skin_tone": "👩🏽‍🦼", + "woman_in_motorized_wheelchair_tone4": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_medium_dark_skin_tone": "👩🏾‍🦼", + "woman_in_motorized_wheelchair_tone5": "👩🏿‍🦼", + "woman_in_motorized_wheelchair_dark_skin_tone": "👩🏿‍🦼", + "man_in_motorized_wheelchair": "👨‍🦼", + "man_in_motorized_wheelchair_tone1": "👨🏻‍🦼", + "man_in_motorized_wheelchair_light_skin_tone": "👨🏻‍🦼", + "man_in_motorized_wheelchair_tone2": "👨🏼‍🦼", + "man_in_motorized_wheelchair_medium_light_skin_tone": "👨🏼‍🦼", + "man_in_motorized_wheelchair_tone3": "👨🏽‍🦼", + "man_in_motorized_wheelchair_medium_skin_tone": "👨🏽‍🦼", + "man_in_motorized_wheelchair_tone4": "👨🏾‍🦼", + "man_in_motorized_wheelchair_medium_dark_skin_tone": "👨🏾‍🦼", + "man_in_motorized_wheelchair_tone5": "👨🏿‍🦼", + "man_in_motorized_wheelchair_dark_skin_tone": "👨🏿‍🦼", + "person_walking": "🚶", + "walking": "🚶", + "person_walking_tone1": "🚶🏻", + "walking_tone1": "🚶🏻", + "person_walking_tone2": "🚶🏼", + "walking_tone2": "🚶🏼", + "person_walking_tone3": "🚶🏽", + "walking_tone3": "🚶🏽", + "person_walking_tone4": "🚶🏾", + "walking_tone4": "🚶🏾", + "person_walking_tone5": "🚶🏿", + "walking_tone5": "🚶🏿", + "woman_walking": "🚶‍♀️", + "woman_walking_tone1": "🚶🏻‍♀️", + "woman_walking_light_skin_tone": "🚶🏻‍♀️", + "woman_walking_tone2": "🚶🏼‍♀️", + "woman_walking_medium_light_skin_tone": "🚶🏼‍♀️", + "woman_walking_tone3": "🚶🏽‍♀️", + "woman_walking_medium_skin_tone": "🚶🏽‍♀️", + "woman_walking_tone4": "🚶🏾‍♀️", + "woman_walking_medium_dark_skin_tone": "🚶🏾‍♀️", + "woman_walking_tone5": "🚶🏿‍♀️", + "woman_walking_dark_skin_tone": "🚶🏿‍♀️", + "man_walking": "🚶‍♂️", + "man_walking_tone1": "🚶🏻‍♂️", + "man_walking_light_skin_tone": "🚶🏻‍♂️", + "man_walking_tone2": "🚶🏼‍♂️", + "man_walking_medium_light_skin_tone": "🚶🏼‍♂️", + "man_walking_tone3": "🚶🏽‍♂️", + "man_walking_medium_skin_tone": "🚶🏽‍♂️", + "man_walking_tone4": "🚶🏾‍♂️", + "man_walking_medium_dark_skin_tone": "🚶🏾‍♂️", + "man_walking_tone5": "🚶🏿‍♂️", + "man_walking_dark_skin_tone": "🚶🏿‍♂️", + "person_with_probing_cane": "🧑‍🦯", + "person_with_probing_cane_tone1": "🧑🏻‍🦯", + "person_with_probing_cane_light_skin_tone": "🧑🏻‍🦯", + "person_with_probing_cane_tone2": "🧑🏼‍🦯", + "person_with_probing_cane_medium_light_skin_tone": "🧑🏼‍🦯", + "person_with_probing_cane_tone3": "🧑🏽‍🦯", + "person_with_probing_cane_medium_skin_tone": "🧑🏽‍🦯", + "person_with_probing_cane_tone4": "🧑🏾‍🦯", + "person_with_probing_cane_medium_dark_skin_tone": "🧑🏾‍🦯", + "person_with_probing_cane_tone5": "🧑🏿‍🦯", + "person_with_probing_cane_dark_skin_tone": "🧑🏿‍🦯", + "woman_with_probing_cane": "👩‍🦯", + "woman_with_probing_cane_tone1": "👩🏻‍🦯", + "woman_with_probing_cane_light_skin_tone": "👩🏻‍🦯", + "woman_with_probing_cane_tone2": "👩🏼‍🦯", + "woman_with_probing_cane_medium_light_skin_tone": "👩🏼‍🦯", + "woman_with_probing_cane_tone3": "👩🏽‍🦯", + "woman_with_probing_cane_medium_skin_tone": "👩🏽‍🦯", + "woman_with_probing_cane_tone4": "👩🏾‍🦯", + "woman_with_probing_cane_medium_dark_skin_tone": "👩🏾‍🦯", + "woman_with_probing_cane_tone5": "👩🏿‍🦯", + "woman_with_probing_cane_dark_skin_tone": "👩🏿‍🦯", + "man_with_probing_cane": "👨‍🦯", + "man_with_probing_cane_tone1": "👨🏻‍🦯", + "man_with_probing_cane_light_skin_tone": "👨🏻‍🦯", + "man_with_probing_cane_tone3": "👨🏽‍🦯", + "man_with_probing_cane_medium_skin_tone": "👨🏽‍🦯", + "man_with_probing_cane_tone2": "👨🏼‍🦯", + "man_with_probing_cane_medium_light_skin_tone": "👨🏼‍🦯", + "man_with_probing_cane_tone4": "👨🏾‍🦯", + "man_with_probing_cane_medium_dark_skin_tone": "👨🏾‍🦯", + "man_with_probing_cane_tone5": "👨🏿‍🦯", + "man_with_probing_cane_dark_skin_tone": "👨🏿‍🦯", + "person_kneeling": "🧎", + "person_kneeling_tone1": "🧎🏻", + "person_kneeling_light_skin_tone": "🧎🏻", + "person_kneeling_tone2": "🧎🏼", + "person_kneeling_medium_light_skin_tone": "🧎🏼", + "person_kneeling_tone3": "🧎🏽", + "person_kneeling_medium_skin_tone": "🧎🏽", + "person_kneeling_tone4": "🧎🏾", + "person_kneeling_medium_dark_skin_tone": "🧎🏾", + "person_kneeling_tone5": "🧎🏿", + "person_kneeling_dark_skin_tone": "🧎🏿", + "woman_kneeling": "🧎‍♀️", + "woman_kneeling_tone1": "🧎🏻‍♀️", + "woman_kneeling_light_skin_tone": "🧎🏻‍♀️", + "woman_kneeling_tone2": "🧎🏼‍♀️", + "woman_kneeling_medium_light_skin_tone": "🧎🏼‍♀️", + "woman_kneeling_tone3": "🧎🏽‍♀️", + "woman_kneeling_medium_skin_tone": "🧎🏽‍♀️", + "woman_kneeling_tone4": "🧎🏾‍♀️", + "woman_kneeling_medium_dark_skin_tone": "🧎🏾‍♀️", + "woman_kneeling_tone5": "🧎🏿‍♀️", + "woman_kneeling_dark_skin_tone": "🧎🏿‍♀️", + "man_kneeling": "🧎‍♂️", + "man_kneeling_tone1": "🧎🏻‍♂️", + "man_kneeling_light_skin_tone": "🧎🏻‍♂️", + "man_kneeling_tone2": "🧎🏼‍♂️", + "man_kneeling_medium_light_skin_tone": "🧎🏼‍♂️", + "man_kneeling_tone3": "🧎🏽‍♂️", + "man_kneeling_medium_skin_tone": "🧎🏽‍♂️", + "man_kneeling_tone4": "🧎🏾‍♂️", + "man_kneeling_medium_dark_skin_tone": "🧎🏾‍♂️", + "man_kneeling_tone5": "🧎🏿‍♂️", + "man_kneeling_dark_skin_tone": "🧎🏿‍♂️", + "person_running": "🏃", + "runner": "🏃", + "person_running_tone1": "🏃🏻", + "runner_tone1": "🏃🏻", + "person_running_tone2": "🏃🏼", + "runner_tone2": "🏃🏼", + "person_running_tone3": "🏃🏽", + "runner_tone3": "🏃🏽", + "person_running_tone4": "🏃🏾", + "runner_tone4": "🏃🏾", + "person_running_tone5": "🏃🏿", + "runner_tone5": "🏃🏿", + "woman_running": "🏃‍♀️", + "woman_running_tone1": "🏃🏻‍♀️", + "woman_running_light_skin_tone": "🏃🏻‍♀️", + "woman_running_tone2": "🏃🏼‍♀️", + "woman_running_medium_light_skin_tone": "🏃🏼‍♀️", + "woman_running_tone3": "🏃🏽‍♀️", + "woman_running_medium_skin_tone": "🏃🏽‍♀️", + "woman_running_tone4": "🏃🏾‍♀️", + "woman_running_medium_dark_skin_tone": "🏃🏾‍♀️", + "woman_running_tone5": "🏃🏿‍♀️", + "woman_running_dark_skin_tone": "🏃🏿‍♀️", + "man_running": "🏃‍♂️", + "man_running_tone1": "🏃🏻‍♂️", + "man_running_light_skin_tone": "🏃🏻‍♂️", + "man_running_tone2": "🏃🏼‍♂️", + "man_running_medium_light_skin_tone": "🏃🏼‍♂️", + "man_running_tone3": "🏃🏽‍♂️", + "man_running_medium_skin_tone": "🏃🏽‍♂️", + "man_running_tone4": "🏃🏾‍♂️", + "man_running_medium_dark_skin_tone": "🏃🏾‍♂️", + "man_running_tone5": "🏃🏿‍♂️", + "man_running_dark_skin_tone": "🏃🏿‍♂️", + "person_standing": "🧍", + "person_standing_tone1": "🧍🏻", + "person_standing_light_skin_tone": "🧍🏻", + "person_standing_tone2": "🧍🏼", + "person_standing_medium_light_skin_tone": "🧍🏼", + "person_standing_tone3": "🧍🏽", + "person_standing_medium_skin_tone": "🧍🏽", + "person_standing_tone4": "🧍🏾", + "person_standing_medium_dark_skin_tone": "🧍🏾", + "person_standing_tone5": "🧍🏿", + "person_standing_dark_skin_tone": "🧍🏿", + "woman_standing": "🧍‍♀️", + "woman_standing_tone1": "🧍🏻‍♀️", + "woman_standing_light_skin_tone": "🧍🏻‍♀️", + "woman_standing_tone2": "🧍🏼‍♀️", + "woman_standing_medium_light_skin_tone": "🧍🏼‍♀️", + "woman_standing_tone3": "🧍🏽‍♀️", + "woman_standing_medium_skin_tone": "🧍🏽‍♀️", + "woman_standing_tone4": "🧍🏾‍♀️", + "woman_standing_medium_dark_skin_tone": "🧍🏾‍♀️", + "woman_standing_tone5": "🧍🏿‍♀️", + "woman_standing_dark_skin_tone": "🧍🏿‍♀️", + "man_standing": "🧍‍♂️", + "man_standing_tone1": "🧍🏻‍♂️", + "man_standing_light_skin_tone": "🧍🏻‍♂️", + "man_standing_tone2": "🧍🏼‍♂️", + "man_standing_medium_light_skin_tone": "🧍🏼‍♂️", + "man_standing_tone3": "🧍🏽‍♂️", + "man_standing_medium_skin_tone": "🧍🏽‍♂️", + "man_standing_tone4": "🧍🏾‍♂️", + "man_standing_medium_dark_skin_tone": "🧍🏾‍♂️", + "man_standing_tone5": "🧍🏿‍♂️", + "man_standing_dark_skin_tone": "🧍🏿‍♂️", + "people_holding_hands": "🧑‍🤝‍🧑", + "people_holding_hands_tone1": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_light_skin_tone": "🧑🏻‍🤝‍🧑🏻", + "people_holding_hands_tone1_tone2": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_light_skin_tone_medium_light_skin_tone": "🧑🏻‍🤝‍🧑🏼", + "people_holding_hands_tone1_tone3": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_light_skin_tone_medium_skin_tone": "🧑🏻‍🤝‍🧑🏽", + "people_holding_hands_tone1_tone4": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_light_skin_tone_medium_dark_skin_tone": "🧑🏻‍🤝‍🧑🏾", + "people_holding_hands_tone1_tone5": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_light_skin_tone_dark_skin_tone": "🧑🏻‍🤝‍🧑🏿", + "people_holding_hands_tone2_tone1": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_medium_light_skin_tone_light_skin_tone": "🧑🏼‍🤝‍🧑🏻", + "people_holding_hands_tone2": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_medium_light_skin_tone": "🧑🏼‍🤝‍🧑🏼", + "people_holding_hands_tone2_tone3": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_medium_light_skin_tone_medium_skin_tone": "🧑🏼‍🤝‍🧑🏽", + "people_holding_hands_tone2_tone4": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "🧑🏼‍🤝‍🧑🏾", + "people_holding_hands_tone2_tone5": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_medium_light_skin_tone_dark_skin_tone": "🧑🏼‍🤝‍🧑🏿", + "people_holding_hands_tone3_tone1": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_medium_skin_tone_light_skin_tone": "🧑🏽‍🤝‍🧑🏻", + "people_holding_hands_tone3_tone2": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_medium_skin_tone_medium_light_skin_tone": "🧑🏽‍🤝‍🧑🏼", + "people_holding_hands_tone3": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_medium_skin_tone": "🧑🏽‍🤝‍🧑🏽", + "people_holding_hands_tone3_tone4": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_medium_skin_tone_medium_dark_skin_tone": "🧑🏽‍🤝‍🧑🏾", + "people_holding_hands_tone3_tone5": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_medium_skin_tone_dark_skin_tone": "🧑🏽‍🤝‍🧑🏿", + "people_holding_hands_tone4_tone1": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_medium_dark_skin_tone_light_skin_tone": "🧑🏾‍🤝‍🧑🏻", + "people_holding_hands_tone4_tone2": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "🧑🏾‍🤝‍🧑🏼", + "people_holding_hands_tone4_tone3": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_medium_dark_skin_tone_medium_skin_tone": "🧑🏾‍🤝‍🧑🏽", + "people_holding_hands_tone4": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_medium_dark_skin_tone": "🧑🏾‍🤝‍🧑🏾", + "people_holding_hands_tone4_tone5": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_medium_dark_skin_tone_dark_skin_tone": "🧑🏾‍🤝‍🧑🏿", + "people_holding_hands_tone5_tone1": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_dark_skin_tone_light_skin_tone": "🧑🏿‍🤝‍🧑🏻", + "people_holding_hands_tone5_tone2": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_dark_skin_tone_medium_light_skin_tone": "🧑🏿‍🤝‍🧑🏼", + "people_holding_hands_tone5_tone3": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_dark_skin_tone_medium_skin_tone": "🧑🏿‍🤝‍🧑🏽", + "people_holding_hands_tone5_tone4": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_dark_skin_tone_medium_dark_skin_tone": "🧑🏿‍🤝‍🧑🏾", + "people_holding_hands_tone5": "🧑🏿‍🤝‍🧑🏿", + "people_holding_hands_dark_skin_tone": "🧑🏿‍🤝‍🧑🏿", + "couple": "👫", + "woman_and_man_holding_hands_tone1": "👫🏻", + "woman_and_man_holding_hands_light_skin_tone": "👫🏻", + "woman_and_man_holding_hands_tone1_tone2": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone1_tone3": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone1_tone4": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone1_tone5": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone2_tone1": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone2": "👫🏼", + "woman_and_man_holding_hands_medium_light_skin_tone": "👫🏼", + "woman_and_man_holding_hands_tone2_tone3": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone2_tone4": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone2_tone5": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone3_tone1": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone3_tone2": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone3": "👫🏽", + "woman_and_man_holding_hands_medium_skin_tone": "👫🏽", + "woman_and_man_holding_hands_tone3_tone4": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone3_tone5": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone4_tone1": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone4_tone2": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone4_tone3": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone4": "👫🏾", + "woman_and_man_holding_hands_medium_dark_skin_tone": "👫🏾", + "woman_and_man_holding_hands_tone4_tone5": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👨🏿", + "woman_and_man_holding_hands_tone5_tone1": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👨🏻", + "woman_and_man_holding_hands_tone5_tone2": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👨🏼", + "woman_and_man_holding_hands_tone5_tone3": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👨🏽", + "woman_and_man_holding_hands_tone5_tone4": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👨🏾", + "woman_and_man_holding_hands_tone5": "👫🏿", + "woman_and_man_holding_hands_dark_skin_tone": "👫🏿", + "two_women_holding_hands": "👭", + "women_holding_hands_tone1": "👭🏻", + "women_holding_hands_light_skin_tone": "👭🏻", + "women_holding_hands_tone1_tone2": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_light_skin_tone_medium_light_skin_tone": "👩🏻‍🤝‍👩🏼", + "women_holding_hands_tone1_tone3": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_light_skin_tone_medium_skin_tone": "👩🏻‍🤝‍👩🏽", + "women_holding_hands_tone1_tone4": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_light_skin_tone_medium_dark_skin_tone": "👩🏻‍🤝‍👩🏾", + "women_holding_hands_tone1_tone5": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_light_skin_tone_dark_skin_tone": "👩🏻‍🤝‍👩🏿", + "women_holding_hands_tone2_tone1": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_medium_light_skin_tone_light_skin_tone": "👩🏼‍🤝‍👩🏻", + "women_holding_hands_tone2": "👭🏼", + "women_holding_hands_medium_light_skin_tone": "👭🏼", + "women_holding_hands_tone2_tone3": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_medium_light_skin_tone_medium_skin_tone": "👩🏼‍🤝‍👩🏽", + "women_holding_hands_tone2_tone4": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👩🏼‍🤝‍👩🏾", + "women_holding_hands_tone2_tone5": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_medium_light_skin_tone_dark_skin_tone": "👩🏼‍🤝‍👩🏿", + "women_holding_hands_tone3_tone1": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_medium_skin_tone_light_skin_tone": "👩🏽‍🤝‍👩🏻", + "women_holding_hands_tone3_tone2": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_medium_skin_tone_medium_light_skin_tone": "👩🏽‍🤝‍👩🏼", + "women_holding_hands_tone3": "👭🏽", + "women_holding_hands_medium_skin_tone": "👭🏽", + "women_holding_hands_tone3_tone4": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👩🏽‍🤝‍👩🏾", + "women_holding_hands_tone3_tone5": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_medium_skin_tone_dark_skin_tone": "👩🏽‍🤝‍👩🏿", + "women_holding_hands_tone4_tone1": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_medium_dark_skin_tone_light_skin_tone": "👩🏾‍🤝‍👩🏻", + "women_holding_hands_tone4_tone2": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👩🏾‍🤝‍👩🏼", + "women_holding_hands_tone4_tone3": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👩🏾‍🤝‍👩🏽", + "women_holding_hands_tone4": "👭🏾", + "women_holding_hands_medium_dark_skin_tone": "👭🏾", + "women_holding_hands_tone4_tone5": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👩🏾‍🤝‍👩🏿", + "women_holding_hands_tone5_tone1": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_dark_skin_tone_light_skin_tone": "👩🏿‍🤝‍👩🏻", + "women_holding_hands_tone5_tone2": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_dark_skin_tone_medium_light_skin_tone": "👩🏿‍🤝‍👩🏼", + "women_holding_hands_tone5_tone3": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_dark_skin_tone_medium_skin_tone": "👩🏿‍🤝‍👩🏽", + "women_holding_hands_tone5_tone4": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👩🏿‍🤝‍👩🏾", + "women_holding_hands_tone5": "👭🏿", + "women_holding_hands_dark_skin_tone": "👭🏿", + "two_men_holding_hands": "👬", + "men_holding_hands_tone1": "👬🏻", + "men_holding_hands_light_skin_tone": "👬🏻", + "men_holding_hands_tone1_tone2": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_light_skin_tone_medium_light_skin_tone": "👨🏻‍🤝‍👨🏼", + "men_holding_hands_tone1_tone3": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_light_skin_tone_medium_skin_tone": "👨🏻‍🤝‍👨🏽", + "men_holding_hands_tone1_tone4": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_light_skin_tone_medium_dark_skin_tone": "👨🏻‍🤝‍👨🏾", + "men_holding_hands_tone1_tone5": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_light_skin_tone_dark_skin_tone": "👨🏻‍🤝‍👨🏿", + "men_holding_hands_tone2_tone1": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_medium_light_skin_tone_light_skin_tone": "👨🏼‍🤝‍👨🏻", + "men_holding_hands_tone2": "👬🏼", + "men_holding_hands_medium_light_skin_tone": "👬🏼", + "men_holding_hands_tone2_tone3": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_medium_light_skin_tone_medium_skin_tone": "👨🏼‍🤝‍👨🏽", + "men_holding_hands_tone2_tone4": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone": "👨🏼‍🤝‍👨🏾", + "men_holding_hands_tone2_tone5": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_medium_light_skin_tone_dark_skin_tone": "👨🏼‍🤝‍👨🏿", + "men_holding_hands_tone3_tone1": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_medium_skin_tone_light_skin_tone": "👨🏽‍🤝‍👨🏻", + "men_holding_hands_tone3_tone2": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_medium_skin_tone_medium_light_skin_tone": "👨🏽‍🤝‍👨🏼", + "men_holding_hands_tone3": "👬🏽", + "men_holding_hands_medium_skin_tone": "👬🏽", + "men_holding_hands_tone3_tone4": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_medium_skin_tone_medium_dark_skin_tone": "👨🏽‍🤝‍👨🏾", + "men_holding_hands_tone3_tone5": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_medium_skin_tone_dark_skin_tone": "👨🏽‍🤝‍👨🏿", + "men_holding_hands_tone4_tone1": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_medium_dark_skin_tone_light_skin_tone": "👨🏾‍🤝‍👨🏻", + "men_holding_hands_tone4_tone2": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone": "👨🏾‍🤝‍👨🏼", + "men_holding_hands_tone4_tone3": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_medium_dark_skin_tone_medium_skin_tone": "👨🏾‍🤝‍👨🏽", + "men_holding_hands_tone4": "👬🏾", + "men_holding_hands_medium_dark_skin_tone": "👬🏾", + "men_holding_hands_tone4_tone5": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_medium_dark_skin_tone_dark_skin_tone": "👨🏾‍🤝‍👨🏿", + "men_holding_hands_tone5_tone1": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_dark_skin_tone_light_skin_tone": "👨🏿‍🤝‍👨🏻", + "men_holding_hands_tone5_tone2": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_dark_skin_tone_medium_light_skin_tone": "👨🏿‍🤝‍👨🏼", + "men_holding_hands_tone5_tone3": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_dark_skin_tone_medium_skin_tone": "👨🏿‍🤝‍👨🏽", + "men_holding_hands_tone5_tone4": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_dark_skin_tone_medium_dark_skin_tone": "👨🏿‍🤝‍👨🏾", + "men_holding_hands_tone5": "👬🏿", + "men_holding_hands_dark_skin_tone": "👬🏿", + "couple_with_heart": "💑", + "couple_with_heart_woman_man": "👩‍❤️‍👨", + "couple_ww": "👩‍❤️‍👩", + "couple_with_heart_ww": "👩‍❤️‍👩", + "couple_mm": "👨‍❤️‍👨", + "couple_with_heart_mm": "👨‍❤️‍👨", + "couplekiss": "💏", + "kiss_woman_man": "👩‍❤️‍💋‍👨", + "kiss_ww": "👩‍❤️‍💋‍👩", + "couplekiss_ww": "👩‍❤️‍💋‍👩", + "kiss_mm": "👨‍❤️‍💋‍👨", + "couplekiss_mm": "👨‍❤️‍💋‍👨", + "family": "👪", + "family_man_woman_boy": "👨‍👩‍👦", + "family_mwg": "👨‍👩‍👧", + "family_mwgb": "👨‍👩‍👧‍👦", + "family_mwbb": "👨‍👩‍👦‍👦", + "family_mwgg": "👨‍👩‍👧‍👧", + "family_wwb": "👩‍👩‍👦", + "family_wwg": "👩‍👩‍👧", + "family_wwgb": "👩‍👩‍👧‍👦", + "family_wwbb": "👩‍👩‍👦‍👦", + "family_wwgg": "👩‍👩‍👧‍👧", + "family_mmb": "👨‍👨‍👦", + "family_mmg": "👨‍👨‍👧", + "family_mmgb": "👨‍👨‍👧‍👦", + "family_mmbb": "👨‍👨‍👦‍👦", + "family_mmgg": "👨‍👨‍👧‍👧", + "family_woman_boy": "👩‍👦", + "family_woman_girl": "👩‍👧", + "family_woman_girl_boy": "👩‍👧‍👦", + "family_woman_boy_boy": "👩‍👦‍👦", + "family_woman_girl_girl": "👩‍👧‍👧", + "family_man_boy": "👨‍👦", + "family_man_girl": "👨‍👧", + "family_man_girl_boy": "👨‍👧‍👦", + "family_man_boy_boy": "👨‍👦‍👦", + "family_man_girl_girl": "👨‍👧‍👧", + "yarn": "🧶", + "thread": "🧵", + "coat": "🧥", + "lab_coat": "🥼", + "safety_vest": "🦺", + "womans_clothes": "👚", + "shirt": "👕", + "jeans": "👖", + "briefs": "🩲", + "shorts": "🩳", + "necktie": "👔", + "dress": "👗", + "bikini": "👙", + "one_piece_swimsuit": "🩱", + "kimono": "👘", + "sari": "🥻", + "womans_flat_shoe": "🥿", + "high_heel": "👠", + "sandal": "👡", + "boot": "👢", + "mans_shoe": "👞", + "athletic_shoe": "👟", + "hiking_boot": "🥾", + "thong_sandal": "🩴", + "socks": "🧦", + "gloves": "🧤", + "scarf": "🧣", + "tophat": "🎩", + "billed_cap": "🧢", + "womans_hat": "👒", + "mortar_board": "🎓", + "helmet_with_cross": "⛑️", + "helmet_with_white_cross": "⛑️", + "military_helmet": "🪖", + "crown": "👑", + "ring": "💍", + "pouch": "👝", + "purse": "👛", + "handbag": "👜", + "briefcase": "💼", + "school_satchel": "🎒", + "luggage": "🧳", + "eyeglasses": "👓", + "dark_sunglasses": "🕶️", + "goggles": "🥽", + "closed_umbrella": "🌂", + "dog": "🐶", + "cat": "🐱", + "mouse": "🐭", + "hamster": "🐹", + "rabbit": "🐰", + "fox": "🦊", + "fox_face": "🦊", + "bear": "🐻", + "panda_face": "🐼", + "polar_bear": "🐻‍❄️", + "koala": "🐨", + "tiger": "🐯", + "lion_face": "🦁", + "lion": "🦁", + "cow": "🐮", + "pig": "🐷", + "pig_nose": "🐽", + "frog": "🐸", + "monkey_face": "🐵", + "see_no_evil": "🙈", + "hear_no_evil": "🙉", + "speak_no_evil": "🙊", + "monkey": "🐒", + "chicken": "🐔", + "penguin": "🐧", + "bird": "🐦", + "baby_chick": "🐤", + "hatching_chick": "🐣", + "hatched_chick": "🐥", + "duck": "🦆", + "dodo": "🦤", + "eagle": "🦅", + "owl": "🦉", + "bat": "🦇", + "wolf": "🐺", + "boar": "🐗", + "horse": "🐴", + "unicorn": "🦄", + "unicorn_face": "🦄", + "bee": "🐝", + "bug": "🐛", + "butterfly": "🦋", + "snail": "🐌", + "worm": "🪱", + "lady_beetle": "🐞", + "ant": "🐜", + "fly": "🪰", + "mosquito": "🦟", + "cockroach": "🪳", + "beetle": "🪲", + "cricket": "🦗", + "spider": "🕷️", + "spider_web": "🕸️", + "scorpion": "🦂", + "turtle": "🐢", + "snake": "🐍", + "lizard": "🦎", + "t_rex": "🦖", + "sauropod": "🦕", + "octopus": "🐙", + "squid": "🦑", + "shrimp": "🦐", + "lobster": "🦞", + "crab": "🦀", + "blowfish": "🐡", + "tropical_fish": "🐠", + "fish": "🐟", + "seal": "🦭", + "dolphin": "🐬", + "whale": "🐳", + "whale2": "🐋", + "shark": "🦈", + "crocodile": "🐊", + "tiger2": "🐅", + "leopard": "🐆", + "zebra": "🦓", + "gorilla": "🦍", + "orangutan": "🦧", + "elephant": "🐘", + "mammoth": "🦣", + "bison": "🦬", + "hippopotamus": "🦛", + "rhino": "🦏", + "rhinoceros": "🦏", + "dromedary_camel": "🐪", + "camel": "🐫", + "giraffe": "🦒", + "kangaroo": "🦘", + "water_buffalo": "🐃", + "ox": "🐂", + "cow2": "🐄", + "racehorse": "🐎", + "pig2": "🐖", + "ram": "🐏", + "sheep": "🐑", + "llama": "🦙", + "goat": "🐐", + "deer": "🦌", + "dog2": "🐕", + "poodle": "🐩", + "guide_dog": "🦮", + "service_dog": "🐕‍🦺", + "cat2": "🐈", + "black_cat": "🐈‍⬛", + "rooster": "🐓", + "turkey": "🦃", + "peacock": "🦚", + "parrot": "🦜", + "swan": "🦢", + "flamingo": "🦩", + "dove": "🕊️", + "dove_of_peace": "🕊️", + "rabbit2": "🐇", + "raccoon": "🦝", + "skunk": "🦨", + "badger": "🦡", + "beaver": "🦫", + "otter": "🦦", + "sloth": "🦥", + "mouse2": "🐁", + "rat": "🐀", + "chipmunk": "🐿️", + "hedgehog": "🦔", + "feet": "🐾", + "paw_prints": "🐾", + "dragon": "🐉", + "dragon_face": "🐲", + "cactus": "🌵", + "christmas_tree": "🎄", + "evergreen_tree": "🌲", + "deciduous_tree": "🌳", + "palm_tree": "🌴", + "seedling": "🌱", + "herb": "🌿", + "shamrock": "☘️", + "four_leaf_clover": "🍀", + "bamboo": "🎍", + "tanabata_tree": "🎋", + "leaves": "🍃", + "fallen_leaf": "🍂", + "maple_leaf": "🍁", + "feather": "🪶", + "mushroom": "🍄", + "shell": "🐚", + "rock": "🪨", + "wood": "🪵", + "ear_of_rice": "🌾", + "potted_plant": "🪴", + "bouquet": "💐", + "tulip": "🌷", + "rose": "🌹", + "wilted_rose": "🥀", + "wilted_flower": "🥀", + "wink": "😉", + "unamused": "😒", + "sweat_smile": "😅", + "sweat": "😓", + "sunglasses": "😎", + "stuck_out_tongue": "😛", + "sob": "😭", + "smiling_imp": "😈", + "slight_smile": "🙂", + "pensive": "😔", + "angry": "😠", + "blush": "😊", + "confused": "😕", + "cry": "😢", + "frowning": "😦", + "frowning2": "☹️", + "imp": "👿", + "innocent": "😇", + "joy": "😂", + "kissing": "😗", + "laughing": "😆", + "neutral_face": "😐", + "open_mouth": "😮", + "rage": "😡", + "smile": "😄", + "stuck_out_tongue_winking_eye": "😜", + "hibiscus": "🌺", + "cherry_blossom": "🌸", + "blossom": "🌼", + "sunflower": "🌻", + "sun_with_face": "🌞", + "full_moon_with_face": "🌝", + "first_quarter_moon_with_face": "🌛", + "last_quarter_moon_with_face": "🌜", + "new_moon_with_face": "🌚", + "full_moon": "🌕", + "waning_gibbous_moon": "🌖", + "last_quarter_moon": "🌗", + "waning_crescent_moon": "🌘", + "new_moon": "🌑", + "waxing_crescent_moon": "🌒", + "first_quarter_moon": "🌓", + "waxing_gibbous_moon": "🌔", + "crescent_moon": "🌙", + "earth_americas": "🌎", + "earth_africa": "🌍", + "earth_asia": "🌏", + "ringed_planet": "🪐", + "dizzy": "💫", + "star": "⭐", + "star2": "🌟", + "sparkles": "✨", + "zap": "⚡", + "comet": "☄️", + "boom": "💥", + "fire": "🔥", + "flame": "🔥", + "cloud_tornado": "🌪️", + "cloud_with_tornado": "🌪️", + "rainbow": "🌈", + "sunny": "☀️", + "white_sun_small_cloud": "🌤️", + "white_sun_with_small_cloud": "🌤️", + "partly_sunny": "⛅", + "white_sun_cloud": "🌥️", + "white_sun_behind_cloud": "🌥️", + "cloud": "☁️", + "white_sun_rain_cloud": "🌦️", + "white_sun_behind_cloud_with_rain": "🌦️", + "cloud_rain": "🌧️", + "cloud_with_rain": "🌧️", + "thunder_cloud_rain": "⛈️", + "thunder_cloud_and_rain": "⛈️", + "cloud_lightning": "🌩️", + "cloud_with_lightning": "🌩️", + "cloud_snow": "🌨️", + "cloud_with_snow": "🌨️", + "snowflake": "❄️", + "snowman2": "☃️", + "snowman": "⛄", + "wind_blowing_face": "🌬️", + "dash": "💨", + "droplet": "💧", + "sweat_drops": "💦", + "umbrella": "☔", + "umbrella2": "☂️", + "ocean": "🌊", + "fog": "🌫️", + "green_apple": "🍏", + "apple": "🍎", + "pear": "🍐", + "tangerine": "🍊", + "lemon": "🍋", + "banana": "🍌", + "watermelon": "🍉", + "grapes": "🍇", + "blueberries": "🫐", + "strawberry": "🍓", + "melon": "🍈", + "cherries": "🍒", + "peach": "🍑", + "mango": "🥭", + "pineapple": "🍍", + "coconut": "🥥", + "kiwi": "🥝", + "kiwifruit": "🥝", + "tomato": "🍅", + "eggplant": "🍆", + "avocado": "🥑", + "olive": "🫒", + "broccoli": "🥦", + "leafy_green": "🥬", + "bell_pepper": "🫑", + "cucumber": "🥒", + "hot_pepper": "🌶️", + "corn": "🌽", + "carrot": "🥕", + "garlic": "🧄", + "onion": "🧅", + "potato": "🥔", + "sweet_potato": "🍠", + "croissant": "🥐", + "bagel": "🥯", + "bread": "🍞", + "french_bread": "🥖", + "baguette_bread": "🥖", + "flatbread": "🫓", + "pretzel": "🥨", + "cheese": "🧀", + "cheese_wedge": "🧀", + "egg": "🥚", + "cooking": "🍳", + "butter": "🧈", + "pancakes": "🥞", + "waffle": "🧇", + "bacon": "🥓", + "cut_of_meat": "🥩", + "poultry_leg": "🍗", + "meat_on_bone": "🍖", + "hotdog": "🌭", + "hot_dog": "🌭", + "hamburger": "🍔", + "fries": "🍟", + "pizza": "🍕", + "sandwich": "🥪", + "stuffed_flatbread": "🥙", + "stuffed_pita": "🥙", + "falafel": "🧆", + "taco": "🌮", + "burrito": "🌯", + "tamale": "🫔", + "salad": "🥗", + "green_salad": "🥗", + "shallow_pan_of_food": "🥘", + "paella": "🥘", + "fondue": "🫕", + "canned_food": "🥫", + "spaghetti": "🍝", + "ramen": "🍜", + "stew": "🍲", + "curry": "🍛", + "sushi": "🍣", + "bento": "🍱", + "dumpling": "🥟", + "oyster": "🦪", + "fried_shrimp": "🍤", + "rice_ball": "🍙", + "rice": "🍚", + "rice_cracker": "🍘", + "fish_cake": "🍥", + "fortune_cookie": "🥠", + "moon_cake": "🥮", + "oden": "🍢", + "dango": "🍡", + "shaved_ice": "🍧", + "ice_cream": "🍨", + "icecream": "🍦", + "pie": "🥧", + "cupcake": "🧁", + "cake": "🍰", + "birthday": "🎂", + "custard": "🍮", + "pudding": "🍮", + "flan": "🍮", + "lollipop": "🍭", + "candy": "🍬", + "chocolate_bar": "🍫", + "popcorn": "🍿", + "doughnut": "🍩", + "cookie": "🍪", + "chestnut": "🌰", + "peanuts": "🥜", + "shelled_peanut": "🥜", + "honey_pot": "🍯", + "milk": "🥛", + "glass_of_milk": "🥛", + "baby_bottle": "🍼", + "coffee": "☕", + "tea": "🍵", + "teapot": "🫖", + "mate": "🧉", + "bubble_tea": "🧋", + "beverage_box": "🧃", + "cup_with_straw": "🥤", + "sake": "🍶", + "beer": "🍺", + "beers": "🍻", + "champagne_glass": "🥂", + "clinking_glass": "🥂", + "wine_glass": "🍷", + "tumbler_glass": "🥃", + "whisky": "🥃", + "cocktail": "🍸", + "tropical_drink": "🍹", + "champagne": "🍾", + "bottle_with_popping_cork": "🍾", + "ice_cube": "🧊", + "spoon": "🥄", + "fork_and_knife": "🍴", + "fork_knife_plate": "🍽️", + "fork_and_knife_with_plate": "🍽️", + "bowl_with_spoon": "🥣", + "takeout_box": "🥡", + "chopsticks": "🥢", + "salt": "🧂", + "soccer": "⚽", + "basketball": "🏀", + "football": "🏈", + "baseball": "⚾", + "softball": "🥎", + "tennis": "🎾", + "volleyball": "🏐", + "rugby_football": "🏉", + "flying_disc": "🥏", + "boomerang": "🪃", + "8ball": "🎱", + "yo_yo": "🪀", + "ping_pong": "🏓", + "table_tennis": "🏓", + "badminton": "🏸", + "hockey": "🏒", + "field_hockey": "🏑", + "lacrosse": "🥍", + "cricket_game": "🏏", + "cricket_bat_ball": "🏏", + "goal": "🥅", + "goal_net": "🥅", + "golf": "⛳", + "kite": "🪁", + "bow_and_arrow": "🏹", + "archery": "🏹", + "fishing_pole_and_fish": "🎣", + "diving_mask": "🤿", + "boxing_glove": "🥊", + "boxing_gloves": "🥊", + "martial_arts_uniform": "🥋", + "karate_uniform": "🥋", + "running_shirt_with_sash": "🎽", + "skateboard": "🛹", + "roller_skate": "🛼", + "sled": "🛷", + "ice_skate": "⛸️", + "curling_stone": "🥌", + "ski": "🎿", + "skier": "⛷️", + "snowboarder": "🏂", + "snowboarder_tone1": "🏂🏻", + "snowboarder_light_skin_tone": "🏂🏻", + "snowboarder_tone2": "🏂🏼", + "snowboarder_medium_light_skin_tone": "🏂🏼", + "snowboarder_tone3": "🏂🏽", + "snowboarder_medium_skin_tone": "🏂🏽", + "snowboarder_tone4": "🏂🏾", + "snowboarder_medium_dark_skin_tone": "🏂🏾", + "snowboarder_tone5": "🏂🏿", + "snowboarder_dark_skin_tone": "🏂🏿", + "parachute": "🪂", + "person_lifting_weights": "🏋️", + "lifter": "🏋️", + "weight_lifter": "🏋️", + "person_lifting_weights_tone1": "🏋🏻", + "lifter_tone1": "🏋🏻", + "weight_lifter_tone1": "🏋🏻", + "person_lifting_weights_tone2": "🏋🏼", + "lifter_tone2": "🏋🏼", + "weight_lifter_tone2": "🏋🏼", + "person_lifting_weights_tone3": "🏋🏽", + "lifter_tone3": "🏋🏽", + "weight_lifter_tone3": "🏋🏽", + "person_lifting_weights_tone4": "🏋🏾", + "lifter_tone4": "🏋🏾", + "weight_lifter_tone4": "🏋🏾", + "person_lifting_weights_tone5": "🏋🏿", + "lifter_tone5": "🏋🏿", + "weight_lifter_tone5": "🏋🏿", + "woman_lifting_weights": "🏋️‍♀️", + "woman_lifting_weights_tone1": "🏋🏻‍♀️", + "woman_lifting_weights_light_skin_tone": "🏋🏻‍♀️", + "woman_lifting_weights_tone2": "🏋🏼‍♀️", + "woman_lifting_weights_medium_light_skin_tone": "🏋🏼‍♀️", + "woman_lifting_weights_tone3": "🏋🏽‍♀️", + "woman_lifting_weights_medium_skin_tone": "🏋🏽‍♀️", + "woman_lifting_weights_tone4": "🏋🏾‍♀️", + "woman_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♀️", + "woman_lifting_weights_tone5": "🏋🏿‍♀️", + "woman_lifting_weights_dark_skin_tone": "🏋🏿‍♀️", + "man_lifting_weights": "🏋️‍♂️", + "man_lifting_weights_tone1": "🏋🏻‍♂️", + "man_lifting_weights_light_skin_tone": "🏋🏻‍♂️", + "man_lifting_weights_tone2": "🏋🏼‍♂️", + "man_lifting_weights_medium_light_skin_tone": "🏋🏼‍♂️", + "man_lifting_weights_tone3": "🏋🏽‍♂️", + "man_lifting_weights_medium_skin_tone": "🏋🏽‍♂️", + "man_lifting_weights_tone4": "🏋🏾‍♂️", + "man_lifting_weights_medium_dark_skin_tone": "🏋🏾‍♂️", + "man_lifting_weights_tone5": "🏋🏿‍♂️", + "man_lifting_weights_dark_skin_tone": "🏋🏿‍♂️", + "people_wrestling": "🤼", + "wrestlers": "🤼", + "wrestling": "🤼", + "women_wrestling": "🤼‍♀️", + "men_wrestling": "🤼‍♂️", + "person_doing_cartwheel": "🤸", + "cartwheel": "🤸", + "person_doing_cartwheel_tone1": "🤸🏻", + "cartwheel_tone1": "🤸🏻", + "person_doing_cartwheel_tone2": "🤸🏼", + "cartwheel_tone2": "🤸🏼", + "person_doing_cartwheel_tone3": "🤸🏽", + "cartwheel_tone3": "🤸🏽", + "person_doing_cartwheel_tone4": "🤸🏾", + "cartwheel_tone4": "🤸🏾", + "person_doing_cartwheel_tone5": "🤸🏿", + "cartwheel_tone5": "🤸🏿", + "woman_cartwheeling": "🤸‍♀️", + "woman_cartwheeling_tone1": "🤸🏻‍♀️", + "woman_cartwheeling_light_skin_tone": "🤸🏻‍♀️", + "woman_cartwheeling_tone2": "🤸🏼‍♀️", + "woman_cartwheeling_medium_light_skin_tone": "🤸🏼‍♀️", + "woman_cartwheeling_tone3": "🤸🏽‍♀️", + "woman_cartwheeling_medium_skin_tone": "🤸🏽‍♀️", + "woman_cartwheeling_tone4": "🤸🏾‍♀️", + "woman_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♀️", + "woman_cartwheeling_tone5": "🤸🏿‍♀️", + "woman_cartwheeling_dark_skin_tone": "🤸🏿‍♀️", + "man_cartwheeling": "🤸‍♂️", + "man_cartwheeling_tone1": "🤸🏻‍♂️", + "man_cartwheeling_light_skin_tone": "🤸🏻‍♂️", + "man_cartwheeling_tone2": "🤸🏼‍♂️", + "man_cartwheeling_medium_light_skin_tone": "🤸🏼‍♂️", + "man_cartwheeling_tone3": "🤸🏽‍♂️", + "man_cartwheeling_medium_skin_tone": "🤸🏽‍♂️", + "man_cartwheeling_tone4": "🤸🏾‍♂️", + "man_cartwheeling_medium_dark_skin_tone": "🤸🏾‍♂️", + "man_cartwheeling_tone5": "🤸🏿‍♂️", + "man_cartwheeling_dark_skin_tone": "🤸🏿‍♂️", + "person_bouncing_ball": "⛹️", + "basketball_player": "⛹️", + "person_with_ball": "⛹️", + "person_bouncing_ball_tone1": "⛹🏻", + "basketball_player_tone1": "⛹🏻", + "person_with_ball_tone1": "⛹🏻", + "person_bouncing_ball_tone2": "⛹🏼", + "basketball_player_tone2": "⛹🏼", + "person_with_ball_tone2": "⛹🏼", + "person_bouncing_ball_tone3": "⛹🏽", + "basketball_player_tone3": "⛹🏽", + "person_with_ball_tone3": "⛹🏽", + "person_bouncing_ball_tone4": "⛹🏾", + "basketball_player_tone4": "⛹🏾", + "person_with_ball_tone4": "⛹🏾", + "person_bouncing_ball_tone5": "⛹🏿", + "basketball_player_tone5": "⛹🏿", + "person_with_ball_tone5": "⛹🏿", + "woman_bouncing_ball": "⛹️‍♀️", + "woman_bouncing_ball_tone1": "⛹🏻‍♀️", + "woman_bouncing_ball_light_skin_tone": "⛹🏻‍♀️", + "woman_bouncing_ball_tone2": "⛹🏼‍♀️", + "woman_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♀️", + "woman_bouncing_ball_tone3": "⛹🏽‍♀️", + "woman_bouncing_ball_medium_skin_tone": "⛹🏽‍♀️", + "woman_bouncing_ball_tone4": "⛹🏾‍♀️", + "woman_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♀️", + "woman_bouncing_ball_tone5": "⛹🏿‍♀️", + "woman_bouncing_ball_dark_skin_tone": "⛹🏿‍♀️", + "man_bouncing_ball": "⛹️‍♂️", + "man_bouncing_ball_tone1": "⛹🏻‍♂️", + "man_bouncing_ball_light_skin_tone": "⛹🏻‍♂️", + "man_bouncing_ball_tone2": "⛹🏼‍♂️", + "man_bouncing_ball_medium_light_skin_tone": "⛹🏼‍♂️", + "man_bouncing_ball_tone3": "⛹🏽‍♂️", + "man_bouncing_ball_medium_skin_tone": "⛹🏽‍♂️", + "man_bouncing_ball_tone4": "⛹🏾‍♂️", + "man_bouncing_ball_medium_dark_skin_tone": "⛹🏾‍♂️", + "man_bouncing_ball_tone5": "⛹🏿‍♂️", + "man_bouncing_ball_dark_skin_tone": "⛹🏿‍♂️", + "person_fencing": "🤺", + "fencer": "🤺", + "fencing": "🤺", + "person_playing_handball": "🤾", + "handball": "🤾", + "person_playing_handball_tone1": "🤾🏻", + "handball_tone1": "🤾🏻", + "person_playing_handball_tone2": "🤾🏼", + "handball_tone2": "🤾🏼", + "person_playing_handball_tone3": "🤾🏽", + "handball_tone3": "🤾🏽", + "person_playing_handball_tone4": "🤾🏾", + "handball_tone4": "🤾🏾", + "person_playing_handball_tone5": "🤾🏿", + "handball_tone5": "🤾🏿", + "woman_playing_handball": "🤾‍♀️", + "woman_playing_handball_tone1": "🤾🏻‍♀️", + "woman_playing_handball_light_skin_tone": "🤾🏻‍♀️", + "woman_playing_handball_tone2": "🤾🏼‍♀️", + "woman_playing_handball_medium_light_skin_tone": "🤾🏼‍♀️", + "woman_playing_handball_tone3": "🤾🏽‍♀️", + "woman_playing_handball_medium_skin_tone": "🤾🏽‍♀️", + "woman_playing_handball_tone4": "🤾🏾‍♀️", + "woman_playing_handball_medium_dark_skin_tone": "🤾🏾‍♀️", + "woman_playing_handball_tone5": "🤾🏿‍♀️", + "woman_playing_handball_dark_skin_tone": "🤾🏿‍♀️", + "man_playing_handball": "🤾‍♂️", + "man_playing_handball_tone1": "🤾🏻‍♂️", + "man_playing_handball_light_skin_tone": "🤾🏻‍♂️", + "man_playing_handball_tone2": "🤾🏼‍♂️", + "man_playing_handball_medium_light_skin_tone": "🤾🏼‍♂️", + "man_playing_handball_tone3": "🤾🏽‍♂️", + "man_playing_handball_medium_skin_tone": "🤾🏽‍♂️", + "man_playing_handball_tone4": "🤾🏾‍♂️", + "man_playing_handball_medium_dark_skin_tone": "🤾🏾‍♂️", + "man_playing_handball_tone5": "🤾🏿‍♂️", + "man_playing_handball_dark_skin_tone": "🤾🏿‍♂️", + "person_golfing": "🏌️", + "golfer": "🏌️", + "person_golfing_tone1": "🏌🏻", + "person_golfing_light_skin_tone": "🏌🏻", + "person_golfing_tone2": "🏌🏼", + "person_golfing_medium_light_skin_tone": "🏌🏼", + "person_golfing_tone3": "🏌🏽", + "person_golfing_medium_skin_tone": "🏌🏽", + "person_golfing_tone4": "🏌🏾", + "person_golfing_medium_dark_skin_tone": "🏌🏾", + "person_golfing_tone5": "🏌🏿", + "person_golfing_dark_skin_tone": "🏌🏿", + "woman_golfing": "🏌️‍♀️", + "woman_golfing_tone1": "🏌🏻‍♀️", + "woman_golfing_light_skin_tone": "🏌🏻‍♀️", + "woman_golfing_tone2": "🏌🏼‍♀️", + "woman_golfing_medium_light_skin_tone": "🏌🏼‍♀️", + "woman_golfing_tone3": "🏌🏽‍♀️", + "woman_golfing_medium_skin_tone": "🏌🏽‍♀️", + "woman_golfing_tone4": "🏌🏾‍♀️", + "woman_golfing_medium_dark_skin_tone": "🏌🏾‍♀️", + "woman_golfing_tone5": "🏌🏿‍♀️", + "woman_golfing_dark_skin_tone": "🏌🏿‍♀️", + "man_golfing": "🏌️‍♂️", + "man_golfing_tone1": "🏌🏻‍♂️", + "man_golfing_light_skin_tone": "🏌🏻‍♂️", + "man_golfing_tone2": "🏌🏼‍♂️", + "man_golfing_medium_light_skin_tone": "🏌🏼‍♂️", + "man_golfing_tone3": "🏌🏽‍♂️", + "man_golfing_medium_skin_tone": "🏌🏽‍♂️", + "man_golfing_tone4": "🏌🏾‍♂️", + "man_golfing_medium_dark_skin_tone": "🏌🏾‍♂️", + "man_golfing_tone5": "🏌🏿‍♂️", + "man_golfing_dark_skin_tone": "🏌🏿‍♂️", + "horse_racing": "🏇", + "horse_racing_tone1": "🏇🏻", + "horse_racing_tone2": "🏇🏼", + "horse_racing_tone3": "🏇🏽", + "horse_racing_tone4": "🏇🏾", + "horse_racing_tone5": "🏇🏿", + "person_in_lotus_position": "🧘", + "person_in_lotus_position_tone1": "🧘🏻", + "person_in_lotus_position_light_skin_tone": "🧘🏻", + "person_in_lotus_position_tone2": "🧘🏼", + "person_in_lotus_position_medium_light_skin_tone": "🧘🏼", + "person_in_lotus_position_tone3": "🧘🏽", + "person_in_lotus_position_medium_skin_tone": "🧘🏽", + "person_in_lotus_position_tone4": "🧘🏾", + "person_in_lotus_position_medium_dark_skin_tone": "🧘🏾", + "person_in_lotus_position_tone5": "🧘🏿", + "person_in_lotus_position_dark_skin_tone": "🧘🏿", + "woman_in_lotus_position": "🧘‍♀️", + "woman_in_lotus_position_tone1": "🧘🏻‍♀️", + "woman_in_lotus_position_light_skin_tone": "🧘🏻‍♀️", + "woman_in_lotus_position_tone2": "🧘🏼‍♀️", + "woman_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♀️", + "woman_in_lotus_position_tone3": "🧘🏽‍♀️", + "woman_in_lotus_position_medium_skin_tone": "🧘🏽‍♀️", + "woman_in_lotus_position_tone4": "🧘🏾‍♀️", + "woman_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♀️", + "woman_in_lotus_position_tone5": "🧘🏿‍♀️", + "woman_in_lotus_position_dark_skin_tone": "🧘🏿‍♀️", + "man_in_lotus_position": "🧘‍♂️", + "man_in_lotus_position_tone1": "🧘🏻‍♂️", + "man_in_lotus_position_light_skin_tone": "🧘🏻‍♂️", + "man_in_lotus_position_tone2": "🧘🏼‍♂️", + "man_in_lotus_position_medium_light_skin_tone": "🧘🏼‍♂️", + "man_in_lotus_position_tone3": "🧘🏽‍♂️", + "man_in_lotus_position_medium_skin_tone": "🧘🏽‍♂️", + "man_in_lotus_position_tone4": "🧘🏾‍♂️", + "man_in_lotus_position_medium_dark_skin_tone": "🧘🏾‍♂️", + "man_in_lotus_position_tone5": "🧘🏿‍♂️", + "man_in_lotus_position_dark_skin_tone": "🧘🏿‍♂️", + "person_surfing": "🏄", + "surfer": "🏄", + "person_surfing_tone1": "🏄🏻", + "surfer_tone1": "🏄🏻", + "person_surfing_tone2": "🏄🏼", + "surfer_tone2": "🏄🏼", + "person_surfing_tone3": "🏄🏽", + "surfer_tone3": "🏄🏽", + "person_surfing_tone4": "🏄🏾", + "surfer_tone4": "🏄🏾", + "person_surfing_tone5": "🏄🏿", + "surfer_tone5": "🏄🏿", + "woman_surfing": "🏄‍♀️", + "woman_surfing_tone1": "🏄🏻‍♀️", + "woman_surfing_light_skin_tone": "🏄🏻‍♀️", + "woman_surfing_tone2": "🏄🏼‍♀️", + "woman_surfing_medium_light_skin_tone": "🏄🏼‍♀️", + "woman_surfing_tone3": "🏄🏽‍♀️", + "woman_surfing_medium_skin_tone": "🏄🏽‍♀️", + "woman_surfing_tone4": "🏄🏾‍♀️", + "woman_surfing_medium_dark_skin_tone": "🏄🏾‍♀️", + "woman_surfing_tone5": "🏄🏿‍♀️", + "woman_surfing_dark_skin_tone": "🏄🏿‍♀️", + "man_surfing": "🏄‍♂️", + "man_surfing_tone1": "🏄🏻‍♂️", + "man_surfing_light_skin_tone": "🏄🏻‍♂️", + "man_surfing_tone2": "🏄🏼‍♂️", + "man_surfing_medium_light_skin_tone": "🏄🏼‍♂️", + "man_surfing_tone3": "🏄🏽‍♂️", + "man_surfing_medium_skin_tone": "🏄🏽‍♂️", + "man_surfing_tone4": "🏄🏾‍♂️", + "man_surfing_medium_dark_skin_tone": "🏄🏾‍♂️", + "man_surfing_tone5": "🏄🏿‍♂️", + "man_surfing_dark_skin_tone": "🏄🏿‍♂️", + "person_swimming": "🏊", + "swimmer": "🏊", + "person_swimming_tone1": "🏊🏻", + "swimmer_tone1": "🏊🏻", + "person_swimming_tone2": "🏊🏼", + "swimmer_tone2": "🏊🏼", + "person_swimming_tone3": "🏊🏽", + "swimmer_tone3": "🏊🏽", + "person_swimming_tone4": "🏊🏾", + "swimmer_tone4": "🏊🏾", + "person_swimming_tone5": "🏊🏿", + "swimmer_tone5": "🏊🏿", + "woman_swimming": "🏊‍♀️", + "woman_swimming_tone1": "🏊🏻‍♀️", + "woman_swimming_light_skin_tone": "🏊🏻‍♀️", + "woman_swimming_tone2": "🏊🏼‍♀️", + "woman_swimming_medium_light_skin_tone": "🏊🏼‍♀️", + "woman_swimming_tone3": "🏊🏽‍♀️", + "woman_swimming_medium_skin_tone": "🏊🏽‍♀️", + "woman_swimming_tone4": "🏊🏾‍♀️", + "woman_swimming_medium_dark_skin_tone": "🏊🏾‍♀️", + "woman_swimming_tone5": "🏊🏿‍♀️", + "woman_swimming_dark_skin_tone": "🏊🏿‍♀️", + "man_swimming": "🏊‍♂️", + "man_swimming_tone1": "🏊🏻‍♂️", + "man_swimming_light_skin_tone": "🏊🏻‍♂️", + "man_swimming_tone2": "🏊🏼‍♂️", + "man_swimming_medium_light_skin_tone": "🏊🏼‍♂️", + "man_swimming_tone3": "🏊🏽‍♂️", + "man_swimming_medium_skin_tone": "🏊🏽‍♂️", + "man_swimming_tone4": "🏊🏾‍♂️", + "man_swimming_medium_dark_skin_tone": "🏊🏾‍♂️", + "man_swimming_tone5": "🏊🏿‍♂️", + "man_swimming_dark_skin_tone": "🏊🏿‍♂️", + "person_playing_water_polo": "🤽", + "water_polo": "🤽", + "person_playing_water_polo_tone1": "🤽🏻", + "water_polo_tone1": "🤽🏻", + "person_playing_water_polo_tone2": "🤽🏼", + "water_polo_tone2": "🤽🏼", + "person_playing_water_polo_tone3": "🤽🏽", + "water_polo_tone3": "🤽🏽", + "person_playing_water_polo_tone4": "🤽🏾", + "water_polo_tone4": "🤽🏾", + "person_playing_water_polo_tone5": "🤽🏿", + "water_polo_tone5": "🤽🏿", + "woman_playing_water_polo": "🤽‍♀️", + "woman_playing_water_polo_tone1": "🤽🏻‍♀️", + "woman_playing_water_polo_light_skin_tone": "🤽🏻‍♀️", + "woman_playing_water_polo_tone2": "🤽🏼‍♀️", + "woman_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♀️", + "woman_playing_water_polo_tone3": "🤽🏽‍♀️", + "woman_playing_water_polo_medium_skin_tone": "🤽🏽‍♀️", + "woman_playing_water_polo_tone4": "🤽🏾‍♀️", + "woman_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♀️", + "woman_playing_water_polo_tone5": "🤽🏿‍♀️", + "woman_playing_water_polo_dark_skin_tone": "🤽🏿‍♀️", + "man_playing_water_polo": "🤽‍♂️", + "man_playing_water_polo_tone1": "🤽🏻‍♂️", + "man_playing_water_polo_light_skin_tone": "🤽🏻‍♂️", + "man_playing_water_polo_tone2": "🤽🏼‍♂️", + "man_playing_water_polo_medium_light_skin_tone": "🤽🏼‍♂️", + "man_playing_water_polo_tone3": "🤽🏽‍♂️", + "man_playing_water_polo_medium_skin_tone": "🤽🏽‍♂️", + "man_playing_water_polo_tone4": "🤽🏾‍♂️", + "man_playing_water_polo_medium_dark_skin_tone": "🤽🏾‍♂️", + "man_playing_water_polo_tone5": "🤽🏿‍♂️", + "man_playing_water_polo_dark_skin_tone": "🤽🏿‍♂️", + "person_rowing_boat": "🚣", + "rowboat": "🚣", + "person_rowing_boat_tone1": "🚣🏻", + "rowboat_tone1": "🚣🏻", + "person_rowing_boat_tone2": "🚣🏼", + "rowboat_tone2": "🚣🏼", + "person_rowing_boat_tone3": "🚣🏽", + "rowboat_tone3": "🚣🏽", + "person_rowing_boat_tone4": "🚣🏾", + "rowboat_tone4": "🚣🏾", + "person_rowing_boat_tone5": "🚣🏿", + "rowboat_tone5": "🚣🏿", + "woman_rowing_boat": "🚣‍♀️", + "woman_rowing_boat_tone1": "🚣🏻‍♀️", + "woman_rowing_boat_light_skin_tone": "🚣🏻‍♀️", + "woman_rowing_boat_tone2": "🚣🏼‍♀️", + "woman_rowing_boat_medium_light_skin_tone": "🚣🏼‍♀️", + "woman_rowing_boat_tone3": "🚣🏽‍♀️", + "woman_rowing_boat_medium_skin_tone": "🚣🏽‍♀️", + "woman_rowing_boat_tone4": "🚣🏾‍♀️", + "woman_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♀️", + "woman_rowing_boat_tone5": "🚣🏿‍♀️", + "woman_rowing_boat_dark_skin_tone": "🚣🏿‍♀️", + "man_rowing_boat": "🚣‍♂️", + "man_rowing_boat_tone1": "🚣🏻‍♂️", + "man_rowing_boat_light_skin_tone": "🚣🏻‍♂️", + "man_rowing_boat_tone2": "🚣🏼‍♂️", + "man_rowing_boat_medium_light_skin_tone": "🚣🏼‍♂️", + "man_rowing_boat_tone3": "🚣🏽‍♂️", + "man_rowing_boat_medium_skin_tone": "🚣🏽‍♂️", + "man_rowing_boat_tone4": "🚣🏾‍♂️", + "man_rowing_boat_medium_dark_skin_tone": "🚣🏾‍♂️", + "man_rowing_boat_tone5": "🚣🏿‍♂️", + "man_rowing_boat_dark_skin_tone": "🚣🏿‍♂️", + "person_climbing": "🧗", + "person_climbing_tone1": "🧗🏻", + "person_climbing_light_skin_tone": "🧗🏻", + "person_climbing_tone2": "🧗🏼", + "person_climbing_medium_light_skin_tone": "🧗🏼", + "person_climbing_tone3": "🧗🏽", + "person_climbing_medium_skin_tone": "🧗🏽", + "person_climbing_tone4": "🧗🏾", + "person_climbing_medium_dark_skin_tone": "🧗🏾", + "person_climbing_tone5": "🧗🏿", + "person_climbing_dark_skin_tone": "🧗🏿", + "woman_climbing": "🧗‍♀️", + "woman_climbing_tone1": "🧗🏻‍♀️", + "woman_climbing_light_skin_tone": "🧗🏻‍♀️", + "woman_climbing_tone2": "🧗🏼‍♀️", + "woman_climbing_medium_light_skin_tone": "🧗🏼‍♀️", + "woman_climbing_tone3": "🧗🏽‍♀️", + "woman_climbing_medium_skin_tone": "🧗🏽‍♀️", + "woman_climbing_tone4": "🧗🏾‍♀️", + "woman_climbing_medium_dark_skin_tone": "🧗🏾‍♀️", + "woman_climbing_tone5": "🧗🏿‍♀️", + "woman_climbing_dark_skin_tone": "🧗🏿‍♀️", + "man_climbing": "🧗‍♂️", + "man_climbing_tone1": "🧗🏻‍♂️", + "man_climbing_light_skin_tone": "🧗🏻‍♂️", + "man_climbing_tone2": "🧗🏼‍♂️", + "man_climbing_medium_light_skin_tone": "🧗🏼‍♂️", + "man_climbing_tone3": "🧗🏽‍♂️", + "man_climbing_medium_skin_tone": "🧗🏽‍♂️", + "man_climbing_tone4": "🧗🏾‍♂️", + "man_climbing_medium_dark_skin_tone": "🧗🏾‍♂️", + "man_climbing_tone5": "🧗🏿‍♂️", + "man_climbing_dark_skin_tone": "🧗🏿‍♂️", + "person_mountain_biking": "🚵", + "mountain_bicyclist": "🚵", + "person_mountain_biking_tone1": "🚵🏻", + "mountain_bicyclist_tone1": "🚵🏻", + "person_mountain_biking_tone2": "🚵🏼", + "mountain_bicyclist_tone2": "🚵🏼", + "person_mountain_biking_tone3": "🚵🏽", + "mountain_bicyclist_tone3": "🚵🏽", + "person_mountain_biking_tone4": "🚵🏾", + "mountain_bicyclist_tone4": "🚵🏾", + "person_mountain_biking_tone5": "🚵🏿", + "mountain_bicyclist_tone5": "🚵🏿", + "woman_mountain_biking": "🚵‍♀️", + "woman_mountain_biking_tone1": "🚵🏻‍♀️", + "woman_mountain_biking_light_skin_tone": "🚵🏻‍♀️", + "woman_mountain_biking_tone2": "🚵🏼‍♀️", + "woman_mountain_biking_medium_light_skin_tone": "🚵🏼‍♀️", + "woman_mountain_biking_tone3": "🚵🏽‍♀️", + "woman_mountain_biking_medium_skin_tone": "🚵🏽‍♀️", + "woman_mountain_biking_tone4": "🚵🏾‍♀️", + "woman_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♀️", + "woman_mountain_biking_tone5": "🚵🏿‍♀️", + "woman_mountain_biking_dark_skin_tone": "🚵🏿‍♀️", + "man_mountain_biking": "🚵‍♂️", + "man_mountain_biking_tone1": "🚵🏻‍♂️", + "man_mountain_biking_light_skin_tone": "🚵🏻‍♂️", + "man_mountain_biking_tone2": "🚵🏼‍♂️", + "man_mountain_biking_medium_light_skin_tone": "🚵🏼‍♂️", + "man_mountain_biking_tone3": "🚵🏽‍♂️", + "man_mountain_biking_medium_skin_tone": "🚵🏽‍♂️", + "man_mountain_biking_tone4": "🚵🏾‍♂️", + "man_mountain_biking_medium_dark_skin_tone": "🚵🏾‍♂️", + "man_mountain_biking_tone5": "🚵🏿‍♂️", + "man_mountain_biking_dark_skin_tone": "🚵🏿‍♂️", + "person_biking": "🚴", + "bicyclist": "🚴", + "person_biking_tone1": "🚴🏻", + "bicyclist_tone1": "🚴🏻", + "person_biking_tone2": "🚴🏼", + "bicyclist_tone2": "🚴🏼", + "person_biking_tone3": "🚴🏽", + "bicyclist_tone3": "🚴🏽", + "person_biking_tone4": "🚴🏾", + "bicyclist_tone4": "🚴🏾", + "person_biking_tone5": "🚴🏿", + "bicyclist_tone5": "🚴🏿", + "woman_biking": "🚴‍♀️", + "woman_biking_tone1": "🚴🏻‍♀️", + "woman_biking_light_skin_tone": "🚴🏻‍♀️", + "woman_biking_tone2": "🚴🏼‍♀️", + "woman_biking_medium_light_skin_tone": "🚴🏼‍♀️", + "woman_biking_tone3": "🚴🏽‍♀️", + "woman_biking_medium_skin_tone": "🚴🏽‍♀️", + "woman_biking_tone4": "🚴🏾‍♀️", + "woman_biking_medium_dark_skin_tone": "🚴🏾‍♀️", + "woman_biking_tone5": "🚴🏿‍♀️", + "woman_biking_dark_skin_tone": "🚴🏿‍♀️", + "man_biking": "🚴‍♂️", + "man_biking_tone1": "🚴🏻‍♂️", + "man_biking_light_skin_tone": "🚴🏻‍♂️", + "man_biking_tone2": "🚴🏼‍♂️", + "man_biking_medium_light_skin_tone": "🚴🏼‍♂️", + "man_biking_tone3": "🚴🏽‍♂️", + "man_biking_medium_skin_tone": "🚴🏽‍♂️", + "man_biking_tone4": "🚴🏾‍♂️", + "man_biking_medium_dark_skin_tone": "🚴🏾‍♂️", + "man_biking_tone5": "🚴🏿‍♂️", + "man_biking_dark_skin_tone": "🚴🏿‍♂️", + "trophy": "🏆", + "first_place": "🥇", + "first_place_medal": "🥇", + "second_place": "🥈", + "second_place_medal": "🥈", + "third_place": "🥉", + "third_place_medal": "🥉", + "medal": "🏅", + "sports_medal": "🏅", + "military_medal": "🎖️", + "rosette": "🏵️", + "reminder_ribbon": "🎗️", + "ticket": "🎫", + "tickets": "🎟️", + "admission_tickets": "🎟️", + "circus_tent": "🎪", + "person_juggling": "🤹", + "juggling": "🤹", + "juggler": "🤹", + "person_juggling_tone1": "🤹🏻", + "juggling_tone1": "🤹🏻", + "juggler_tone1": "🤹🏻", + "person_juggling_tone2": "🤹🏼", + "juggling_tone2": "🤹🏼", + "juggler_tone2": "🤹🏼", + "person_juggling_tone3": "🤹🏽", + "juggling_tone3": "🤹🏽", + "juggler_tone3": "🤹🏽", + "person_juggling_tone4": "🤹🏾", + "juggling_tone4": "🤹🏾", + "juggler_tone4": "🤹🏾", + "person_juggling_tone5": "🤹🏿", + "juggling_tone5": "🤹🏿", + "juggler_tone5": "🤹🏿", + "woman_juggling": "🤹‍♀️", + "woman_juggling_tone1": "🤹🏻‍♀️", + "woman_juggling_light_skin_tone": "🤹🏻‍♀️", + "woman_juggling_tone2": "🤹🏼‍♀️", + "woman_juggling_medium_light_skin_tone": "🤹🏼‍♀️", + "woman_juggling_tone3": "🤹🏽‍♀️", + "woman_juggling_medium_skin_tone": "🤹🏽‍♀️", + "woman_juggling_tone4": "🤹🏾‍♀️", + "woman_juggling_medium_dark_skin_tone": "🤹🏾‍♀️", + "woman_juggling_tone5": "🤹🏿‍♀️", + "woman_juggling_dark_skin_tone": "🤹🏿‍♀️", + "man_juggling": "🤹‍♂️", + "man_juggling_tone1": "🤹🏻‍♂️", + "man_juggling_light_skin_tone": "🤹🏻‍♂️", + "man_juggling_tone2": "🤹🏼‍♂️", + "man_juggling_medium_light_skin_tone": "🤹🏼‍♂️", + "man_juggling_tone3": "🤹🏽‍♂️", + "man_juggling_medium_skin_tone": "🤹🏽‍♂️", + "man_juggling_tone4": "🤹🏾‍♂️", + "man_juggling_medium_dark_skin_tone": "🤹🏾‍♂️", + "man_juggling_tone5": "🤹🏿‍♂️", + "man_juggling_dark_skin_tone": "🤹🏿‍♂️", + "performing_arts": "🎭", + "ballet_shoes": "🩰", + "art": "🎨", + "clapper": "🎬", + "microphone": "🎤", + "headphones": "🎧", + "musical_score": "🎼", + "musical_keyboard": "🎹", + "drum": "🥁", + "drum_with_drumsticks": "🥁", + "long_drum": "🪘", + "saxophone": "🎷", + "trumpet": "🎺", + "guitar": "🎸", + "banjo": "🪕", + "violin": "🎻", + "accordion": "🪗", + "game_die": "🎲", + "chess_pawn": "♟️", + "dart": "🎯", + "bowling": "🎳", + "video_game": "🎮", + "slot_machine": "🎰", + "jigsaw": "🧩", + "red_car": "🚗", + "taxi": "🚕", + "blue_car": "🚙", + "pickup_truck": "🛻", + "bus": "🚌", + "trolleybus": "🚎", + "race_car": "🏎️", + "racing_car": "🏎️", + "police_car": "🚓", + "ambulance": "🚑", + "fire_engine": "🚒", + "minibus": "🚐", + "truck": "🚚", + "articulated_lorry": "🚛", + "tractor": "🚜", + "probing_cane": "🦯", + "manual_wheelchair": "🦽", + "motorized_wheelchair": "🦼", + "scooter": "🛴", + "bike": "🚲", + "motor_scooter": "🛵", + "motorbike": "🛵", + "motorcycle": "🏍️", + "racing_motorcycle": "🏍️", + "auto_rickshaw": "🛺", + "rotating_light": "🚨", + "oncoming_police_car": "🚔", + "oncoming_bus": "🚍", + "oncoming_automobile": "🚘", + "oncoming_taxi": "🚖", + "aerial_tramway": "🚡", + "mountain_cableway": "🚠", + "suspension_railway": "🚟", + "railway_car": "🚃", + "train": "🚋", + "mountain_railway": "🚞", + "monorail": "🚝", + "bullettrain_side": "🚄", + "bullettrain_front": "🚅", + "light_rail": "🚈", + "steam_locomotive": "🚂", + "train2": "🚆", + "metro": "🚇", + "tram": "🚊", + "station": "🚉", + "airplane": "✈️", + "airplane_departure": "🛫", + "airplane_arriving": "🛬", + "airplane_small": "🛩️", + "small_airplane": "🛩️", + "seat": "💺", + "satellite_orbital": "🛰️", + "rocket": "🚀", + "flying_saucer": "🛸", + "helicopter": "🚁", + "canoe": "🛶", + "kayak": "🛶", + "sailboat": "⛵", + "speedboat": "🚤", + "motorboat": "🛥️", + "cruise_ship": "🛳️", + "passenger_ship": "🛳️", + "ferry": "⛴️", + "ship": "🚢", + "anchor": "⚓", + "fuelpump": "⛽", + "construction": "🚧", + "vertical_traffic_light": "🚦", + "traffic_light": "🚥", + "busstop": "🚏", + "map": "🗺️", + "world_map": "🗺️", + "moyai": "🗿", + "statue_of_liberty": "🗽", + "tokyo_tower": "🗼", + "european_castle": "🏰", + "japanese_castle": "🏯", + "stadium": "🏟️", + "ferris_wheel": "🎡", + "roller_coaster": "🎢", + "carousel_horse": "🎠", + "fountain": "⛲", + "beach_umbrella": "⛱️", + "umbrella_on_ground": "⛱️", + "beach": "🏖️", + "beach_with_umbrella": "🏖️", + "island": "🏝️", + "desert_island": "🏝️", + "desert": "🏜️", + "volcano": "🌋", + "mountain": "⛰️", + "mountain_snow": "🏔️", + "snow_capped_mountain": "🏔️", + "mount_fuji": "🗻", + "camping": "🏕️", + "tent": "⛺", + "house": "🏠", + "house_with_garden": "🏡", + "homes": "🏘️", + "house_buildings": "🏘️", + "house_abandoned": "🏚️", + "derelict_house_building": "🏚️", + "hut": "🛖", + "construction_site": "🏗️", + "building_construction": "🏗️", + "factory": "🏭", + "office": "🏢", + "department_store": "🏬", + "post_office": "🏣", + "european_post_office": "🏤", + "hospital": "🏥", + "bank": "🏦", + "hotel": "🏨", + "convenience_store": "🏪", + "school": "🏫", + "love_hotel": "🏩", + "wedding": "💒", + "classical_building": "🏛️", + "church": "⛪", + "mosque": "🕌", + "synagogue": "🕍", + "hindu_temple": "🛕", + "kaaba": "🕋", + "shinto_shrine": "⛩️", + "railway_track": "🛤️", + "railroad_track": "🛤️", + "motorway": "🛣️", + "japan": "🗾", + "rice_scene": "🎑", + "park": "🏞️", + "national_park": "🏞️", + "sunrise": "🌅", + "sunrise_over_mountains": "🌄", + "stars": "🌠", + "sparkler": "🎇", + "fireworks": "🎆", + "city_sunset": "🌇", + "city_sunrise": "🌇", + "city_dusk": "🌆", + "cityscape": "🏙️", + "night_with_stars": "🌃", + "milky_way": "🌌", + "bridge_at_night": "🌉", + "foggy": "🌁", + "watch": "⌚", + "mobile_phone": "📱", + "iphone": "📱", + "calling": "📲", + "computer": "💻", + "keyboard": "⌨️", + "desktop": "🖥️", + "desktop_computer": "🖥️", + "printer": "🖨️", + "mouse_three_button": "🖱️", + "three_button_mouse": "🖱️", + "trackball": "🖲️", + "joystick": "🕹️", + "compression": "🗜️", + "minidisc": "💽", + "floppy_disk": "💾", + "cd": "💿", + "dvd": "📀", + "vhs": "📼", + "camera": "📷", + "camera_with_flash": "📸", + "video_camera": "📹", + "movie_camera": "🎥", + "projector": "📽️", + "film_projector": "📽️", + "film_frames": "🎞️", + "telephone_receiver": "📞", + "telephone": "☎️", + "pager": "📟", + "fax": "📠", + "tv": "📺", + "radio": "📻", + "microphone2": "🎙️", + "studio_microphone": "🎙️", + "level_slider": "🎚️", + "control_knobs": "🎛️", + "compass": "🧭", + "stopwatch": "⏱️", + "timer": "⏲️", + "timer_clock": "⏲️", + "alarm_clock": "⏰", + "clock": "🕰️", + "mantlepiece_clock": "🕰️", + "hourglass": "⌛", + "hourglass_flowing_sand": "⏳", + "satellite": "📡", + "battery": "🔋", + "electric_plug": "🔌", + "bulb": "💡", + "flashlight": "🔦", + "candle": "🕯️", + "diya_lamp": "🪔", + "fire_extinguisher": "🧯", + "oil": "🛢️", + "oil_drum": "🛢️", + "money_with_wings": "💸", + "dollar": "💵", + "yen": "💴", + "euro": "💶", + "pound": "💷", + "coin": "🪙", + "moneybag": "💰", + "credit_card": "💳", + "gem": "💎", + "scales": "⚖️", + "ladder": "🪜", + "toolbox": "🧰", + "screwdriver": "🪛", + "wrench": "🔧", + "hammer": "🔨", + "hammer_pick": "⚒️", + "hammer_and_pick": "⚒️", + "tools": "🛠️", + "hammer_and_wrench": "🛠️", + "pick": "⛏️", + "nut_and_bolt": "🔩", + "gear": "⚙️", + "bricks": "🧱", + "chains": "⛓️", + "hook": "🪝", + "knot": "🪢", + "magnet": "🧲", + "gun": "🔫", + "bomb": "💣", + "firecracker": "🧨", + "axe": "🪓", + "carpentry_saw": "🪚", + "knife": "🔪", + "dagger": "🗡️", + "dagger_knife": "🗡️", + "crossed_swords": "⚔️", + "shield": "🛡️", + "smoking": "🚬", + "coffin": "⚰️", + "headstone": "🪦", + "urn": "⚱️", + "funeral_urn": "⚱️", + "amphora": "🏺", + "magic_wand": "🪄", + "crystal_ball": "🔮", + "prayer_beads": "📿", + "nazar_amulet": "🧿", + "barber": "💈", + "alembic": "⚗️", + "telescope": "🔭", + "microscope": "🔬", + "hole": "🕳️", + "window": "🪟", + "adhesive_bandage": "🩹", + "stethoscope": "🩺", + "pill": "💊", + "syringe": "💉", + "drop_of_blood": "🩸", + "dna": "🧬", + "microbe": "🦠", + "petri_dish": "🧫", + "test_tube": "🧪", + "thermometer": "🌡️", + "mouse_trap": "🪤", + "broom": "🧹", + "basket": "🧺", + "sewing_needle": "🪡", + "roll_of_paper": "🧻", + "toilet": "🚽", + "plunger": "🪠", + "bucket": "🪣", + "potable_water": "🚰", + "shower": "🚿", + "bathtub": "🛁", + "bath": "🛀", + "bath_tone1": "🛀🏻", + "bath_tone2": "🛀🏼", + "bath_tone3": "🛀🏽", + "bath_tone4": "🛀🏾", + "bath_tone5": "🛀🏿", + "toothbrush": "🪥", + "soap": "🧼", + "razor": "🪒", + "sponge": "🧽", + "squeeze_bottle": "🧴", + "bellhop": "🛎️", + "bellhop_bell": "🛎️", + "key": "🔑", + "key2": "🗝️", + "old_key": "🗝️", + "door": "🚪", + "chair": "🪑", + "mirror": "🪞", + "couch": "🛋️", + "couch_and_lamp": "🛋️", + "bed": "🛏️", + "sleeping_accommodation": "🛌", + "person_in_bed_tone1": "🛌🏻", + "person_in_bed_light_skin_tone": "🛌🏻", + "person_in_bed_tone2": "🛌🏼", + "person_in_bed_medium_light_skin_tone": "🛌🏼", + "person_in_bed_tone3": "🛌🏽", + "person_in_bed_medium_skin_tone": "🛌🏽", + "person_in_bed_tone4": "🛌🏾", + "person_in_bed_medium_dark_skin_tone": "🛌🏾", + "person_in_bed_tone5": "🛌🏿", + "person_in_bed_dark_skin_tone": "🛌🏿", + "teddy_bear": "🧸", + "frame_photo": "🖼️", + "frame_with_picture": "🖼️", + "shopping_bags": "🛍️", + "shopping_cart": "🛒", + "shopping_trolley": "🛒", + "gift": "🎁", + "balloon": "🎈", + "flags": "🎏", + "ribbon": "🎀", + "confetti_ball": "🎊", + "tada": "🎉", + "piñata": "🪅", + "nesting_dolls": "🪆", + "dolls": "🎎", + "izakaya_lantern": "🏮", + "wind_chime": "🎐", + "red_envelope": "🧧", + "envelope": "✉️", + "envelope_with_arrow": "📩", + "incoming_envelope": "📨", + "e_mail": "📧", + "email": "📧", + "love_letter": "💌", + "inbox_tray": "📥", + "outbox_tray": "📤", + "package": "📦", + "label": "🏷️", + "mailbox_closed": "📪", + "mailbox": "📫", + "mailbox_with_mail": "📬", + "mailbox_with_no_mail": "📭", + "postbox": "📮", + "postal_horn": "📯", + "placard": "🪧", + "scroll": "📜", + "page_with_curl": "📃", + "page_facing_up": "📄", + "bookmark_tabs": "📑", + "receipt": "🧾", + "bar_chart": "📊", + "chart_with_upwards_trend": "📈", + "chart_with_downwards_trend": "📉", + "notepad_spiral": "🗒️", + "spiral_note_pad": "🗒️", + "calendar_spiral": "🗓️", + "spiral_calendar_pad": "🗓️", + "calendar": "📆", + "date": "📅", + "wastebasket": "🗑️", + "card_index": "📇", + "card_box": "🗃️", + "card_file_box": "🗃️", + "ballot_box": "🗳️", + "ballot_box_with_ballot": "🗳️", + "file_cabinet": "🗄️", + "clipboard": "📋", + "file_folder": "📁", + "open_file_folder": "📂", + "dividers": "🗂️", + "card_index_dividers": "🗂️", + "newspaper2": "🗞️", + "rolled_up_newspaper": "🗞️", + "newspaper": "📰", + "notebook": "📓", + "notebook_with_decorative_cover": "📔", + "ledger": "📒", + "closed_book": "📕", + "green_book": "📗", + "blue_book": "📘", + "orange_book": "📙", + "books": "📚", + "book": "📖", + "bookmark": "🔖", + "safety_pin": "🧷", + "link": "🔗", + "paperclip": "📎", + "paperclips": "🖇️", + "linked_paperclips": "🖇️", + "triangular_ruler": "📐", + "straight_ruler": "📏", + "abacus": "🧮", + "pushpin": "📌", + "round_pushpin": "📍", + "scissors": "✂️", + "pen_ballpoint": "🖊️", + "lower_left_ballpoint_pen": "🖊️", + "pen_fountain": "🖋️", + "lower_left_fountain_pen": "🖋️", + "black_nib": "✒️", + "paintbrush": "🖌️", + "lower_left_paintbrush": "🖌️", + "crayon": "🖍️", + "lower_left_crayon": "🖍️", + "pencil": "📝", + "memo": "📝", + "pencil2": "✏️", + "mag": "🔍", + "mag_right": "🔎", + "lock_with_ink_pen": "🔏", + "closed_lock_with_key": "🔐", + "lock": "🔒", + "unlock": "🔓", + "heart": "❤️", + "orange_heart": "🧡", + "yellow_heart": "💛", + "green_heart": "💚", + "blue_heart": "💙", + "purple_heart": "💜", + "black_heart": "🖤", + "brown_heart": "🤎", + "white_heart": "🤍", + "broken_heart": "💔", + "heart_exclamation": "❣️", + "heavy_heart_exclamation_mark_ornament": "❣️", + "two_hearts": "💕", + "revolving_hearts": "💞", + "heartbeat": "💓", + "heartpulse": "💗", + "sparkling_heart": "💖", + "cupid": "💘", + "gift_heart": "💝", + "heart_decoration": "💟", + "peace": "☮️", + "peace_symbol": "☮️", + "cross": "✝️", + "latin_cross": "✝️", + "star_and_crescent": "☪️", + "om_symbol": "🕉️", + "wheel_of_dharma": "☸️", + "star_of_david": "✡️", + "six_pointed_star": "🔯", + "menorah": "🕎", + "yin_yang": "☯️", + "orthodox_cross": "☦️", + "place_of_worship": "🛐", + "worship_symbol": "🛐", + "ophiuchus": "⛎", + "aries": "♈", + "taurus": "♉", + "gemini": "♊", + "cancer": "♋", + "leo": "♌", + "virgo": "♍", + "libra": "♎", + "scorpius": "♏", + "sagittarius": "♐", + "capricorn": "♑", + "aquarius": "♒", + "pisces": "♓", + "id": "🆔", + "atom": "⚛️", + "atom_symbol": "⚛️", + "accept": "🉑", + "radioactive": "☢️", + "radioactive_sign": "☢️", + "biohazard": "☣️", + "biohazard_sign": "☣️", + "mobile_phone_off": "📴", + "vibration_mode": "📳", + "u6709": "🈶", + "u7121": "🈚", + "u7533": "🈸", + "u55b6": "🈺", + "u6708": "🈷️", + "eight_pointed_black_star": "✴️", + "vs": "🆚", + "white_flower": "💮", + "ideograph_advantage": "🉐", + "secret": "㊙️", + "congratulations": "㊗️", + "u5408": "🈴", + "u6e80": "🈵", + "u5272": "🈹", + "u7981": "🈲", + "a": "🅰️", + "b": "🅱️", + "ab": "🆎", + "cl": "🆑", + "o2": "🅾️", + "sos": "🆘", + "x": "❌", + "o": "⭕", + "octagonal_sign": "🛑", + "stop_sign": "🛑", + "no_entry": "⛔", + "name_badge": "📛", + "no_entry_sign": "🚫", + "100": "💯", + "anger": "💢", + "hotsprings": "♨️", + "no_pedestrians": "🚷", + "do_not_litter": "🚯", + "no_bicycles": "🚳", + "non_potable_water": "🚱", + "underage": "🔞", + "no_mobile_phones": "📵", + "no_smoking": "🚭", + "exclamation": "❗", + "grey_exclamation": "❕", + "question": "❓", + "grey_question": "❔", + "bangbang": "‼️", + "interrobang": "⁉️", + "low_brightness": "🔅", + "high_brightness": "🔆", + "part_alternation_mark": "〽️", + "warning": "⚠️", + "children_crossing": "🚸", + "trident": "🔱", + "fleur_de_lis": "⚜️", + "beginner": "🔰", + "recycle": "♻️", + "white_check_mark": "✅", + "u6307": "🈯", + "chart": "💹", + "sparkle": "❇️", + "eight_spoked_asterisk": "✳️", + "negative_squared_cross_mark": "❎", + "globe_with_meridians": "🌐", + "diamond_shape_with_a_dot_inside": "💠", + "m": "Ⓜ️", + "cyclone": "🌀", + "zzz": "💤", + "atm": "🏧", + "wc": "🚾", + "wheelchair": "♿", + "parking": "🅿️", + "u7a7a": "🈳", + "sa": "🈂️", + "passport_control": "🛂", + "customs": "🛃", + "baggage_claim": "🛄", + "left_luggage": "🛅", + "elevator": "🛗", + "mens": "🚹", + "womens": "🚺", + "baby_symbol": "🚼", + "restroom": "🚻", + "put_litter_in_its_place": "🚮", + "cinema": "🎦", + "signal_strength": "📶", + "koko": "🈁", + "symbols": "🔣", + "information_source": "ℹ️", + "abc": "🔤", + "abcd": "🔡", + "capital_abcd": "🔠", + "ng": "🆖", + "ok": "🆗", + "up": "🆙", + "cool": "🆒", + "new": "🆕", + "free": "🆓", + "zero": "0️⃣", + "one": "1️⃣", + "two": "2️⃣", + "three": "3️⃣", + "four": "4️⃣", + "five": "5️⃣", + "six": "6️⃣", + "seven": "7️⃣", + "eight": "8️⃣", + "nine": "9️⃣", + "keycap_ten": "🔟", + "1234": "🔢", + "hash": "#️⃣", + "asterisk": "*️⃣", + "keycap_asterisk": "*️⃣", + "eject": "⏏️", + "eject_symbol": "⏏️", + "arrow_forward": "▶️", + "pause_button": "⏸️", + "double_vertical_bar": "⏸️", + "play_pause": "⏯️", + "stop_button": "⏹️", + "record_button": "⏺️", + "track_next": "⏭️", + "next_track": "⏭️", + "track_previous": "⏮️", + "previous_track": "⏮️", + "fast_forward": "⏩", + "rewind": "⏪", + "arrow_double_up": "⏫", + "arrow_double_down": "⏬", + "arrow_backward": "◀️", + "arrow_up_small": "🔼", + "arrow_down_small": "🔽", + "arrow_right": "➡️", + "arrow_left": "⬅️", + "arrow_up": "⬆️", + "arrow_down": "⬇️", + "arrow_upper_right": "↗️", + "arrow_lower_right": "↘️", + "arrow_lower_left": "↙️", + "arrow_upper_left": "↖️", + "arrow_up_down": "↕️", + "left_right_arrow": "↔️", + "arrow_right_hook": "↪️", + "leftwards_arrow_with_hook": "↩️", + "arrow_heading_up": "⤴️", + "arrow_heading_down": "⤵️", + "twisted_rightwards_arrows": "🔀", + "repeat": "🔁", + "repeat_one": "🔂", + "arrows_counterclockwise": "🔄", + "arrows_clockwise": "🔃", + "musical_note": "🎵", + "notes": "🎶", + "heavy_plus_sign": "➕", + "heavy_minus_sign": "➖", + "heavy_division_sign": "➗", + "heavy_multiplication_x": "✖️", + "infinity": "♾️", + "heavy_dollar_sign": "💲", + "currency_exchange": "💱", + "tm": "™️", + "copyright": "©️", + "registered": "®️", + "wavy_dash": "〰️", + "curly_loop": "➰", + "loop": "➿", + "end": "🔚", + "back": "🔙", + "on": "🔛", + "top": "🔝", + "soon": "🔜", + "heavy_check_mark": "✔️", + "ballot_box_with_check": "☑️", + "radio_button": "🔘", + "white_circle": "⚪", + "black_circle": "⚫", + "red_circle": "🔴", + "blue_circle": "🔵", + "brown_circle": "🟤", + "purple_circle": "🟣", + "green_circle": "🟢", + "yellow_circle": "🟡", + "orange_circle": "🟠", + "small_red_triangle": "🔺", + "small_red_triangle_down": "🔻", + "small_orange_diamond": "🔸", + "small_blue_diamond": "🔹", + "large_orange_diamond": "🔶", + "large_blue_diamond": "🔷", + "white_square_button": "🔳", + "black_square_button": "🔲", + "black_small_square": "▪️", + "white_small_square": "▫️", + "black_medium_small_square": "◾", + "white_medium_small_square": "◽", + "black_medium_square": "◼️", + "white_medium_square": "◻️", + "black_large_square": "⬛", + "white_large_square": "⬜", + "orange_square": "🟧", + "blue_square": "🟦", + "red_square": "🟥", + "brown_square": "🟫", + "purple_square": "🟪", + "green_square": "🟩", + "yellow_square": "🟨", + "speaker": "🔈", + "mute": "🔇", + "sound": "🔉", + "loud_sound": "🔊", + "bell": "🔔", + "no_bell": "🔕", + "mega": "📣", + "loudspeaker": "📢", + "speech_left": "🗨️", + "left_speech_bubble": "🗨️", + "eye_in_speech_bubble": "👁‍🗨", + "speech_balloon": "💬", + "thought_balloon": "💭", + "anger_right": "🗯️", + "right_anger_bubble": "🗯️", + "spades": "♠️", + "clubs": "♣️", + "hearts": "♥️", + "diamonds": "♦️", + "black_joker": "🃏", + "flower_playing_cards": "🎴", + "mahjong": "🀄", + "clock1": "🕐", + "clock2": "🕑", + "clock3": "🕒", + "clock4": "🕓", + "clock5": "🕔", + "clock6": "🕕", + "clock7": "🕖", + "clock8": "🕗", + "clock9": "🕘", + "clock10": "🕙", + "clock11": "🕚", + "clock12": "🕛", + "clock130": "🕜", + "clock230": "🕝", + "clock330": "🕞", + "clock430": "🕟", + "clock530": "🕠", + "clock630": "🕡", + "clock730": "🕢", + "clock830": "🕣", + "clock930": "🕤", + "clock1030": "🕥", + "clock1130": "🕦", + "clock1230": "🕧", + "female_sign": "♀️", + "male_sign": "♂️", + "transgender_symbol": "⚧", + "medical_symbol": "⚕️", + "regional_indicator_z": "🇿", + "regional_indicator_y": "🇾", + "regional_indicator_x": "🇽", + "regional_indicator_w": "🇼", + "regional_indicator_v": "🇻", + "regional_indicator_u": "🇺", + "regional_indicator_t": "🇹", + "regional_indicator_s": "🇸", + "regional_indicator_r": "🇷", + "regional_indicator_q": "🇶", + "regional_indicator_p": "🇵", + "regional_indicator_o": "🇴", + "regional_indicator_n": "🇳", + "regional_indicator_m": "🇲", + "regional_indicator_l": "🇱", + "regional_indicator_k": "🇰", + "regional_indicator_j": "🇯", + "regional_indicator_i": "🇮", + "regional_indicator_h": "🇭", + "regional_indicator_g": "🇬", + "regional_indicator_f": "🇫", + "regional_indicator_e": "🇪", + "regional_indicator_d": "🇩", + "regional_indicator_c": "🇨", + "regional_indicator_b": "🇧", + "regional_indicator_a": "🇦", + "flag_white": "🏳️", + "flag_black": "🏴", + "checkered_flag": "🏁", + "triangular_flag_on_post": "🚩", + "rainbow_flag": "🏳️‍🌈", + "gay_pride_flag": "🏳️‍🌈", + "transgender_flag": "🏳️‍⚧️", + "pirate_flag": "🏴‍☠️", + "flag_af": "🇦🇫", + "flag_ax": "🇦🇽", + "flag_al": "🇦🇱", + "flag_dz": "🇩🇿", + "flag_as": "🇦🇸", + "flag_ad": "🇦🇩", + "flag_ao": "🇦🇴", + "flag_ai": "🇦🇮", + "flag_aq": "🇦🇶", + "flag_ag": "🇦🇬", + "flag_ar": "🇦🇷", + "flag_am": "🇦🇲", + "flag_aw": "🇦🇼", + "flag_au": "🇦🇺", + "flag_at": "🇦🇹", + "flag_az": "🇦🇿", + "flag_bs": "🇧🇸", + "flag_bh": "🇧🇭", + "flag_bd": "🇧🇩", + "flag_bb": "🇧🇧", + "flag_by": "🇧🇾", + "flag_be": "🇧🇪", + "flag_bz": "🇧🇿", + "flag_bj": "🇧🇯", + "flag_bm": "🇧🇲", + "flag_bt": "🇧🇹", + "flag_bo": "🇧🇴", + "flag_ba": "🇧🇦", + "flag_bw": "🇧🇼", + "flag_br": "🇧🇷", + "flag_io": "🇮🇴", + "flag_vg": "🇻🇬", + "flag_bn": "🇧🇳", + "flag_bg": "🇧🇬", + "flag_bf": "🇧🇫", + "flag_bi": "🇧🇮", + "flag_kh": "🇰🇭", + "flag_cm": "🇨🇲", + "flag_ca": "🇨🇦", + "flag_ic": "🇮🇨", + "flag_cv": "🇨🇻", + "flag_bq": "🇧🇶", + "flag_ky": "🇰🇾", + "flag_cf": "🇨🇫", + "flag_td": "🇹🇩", + "flag_cl": "🇨🇱", + "flag_cn": "🇨🇳", + "flag_cx": "🇨🇽", + "flag_cc": "🇨🇨", + "flag_co": "🇨🇴", + "flag_km": "🇰🇲", + "flag_cg": "🇨🇬", + "flag_cd": "🇨🇩", + "flag_ck": "🇨🇰", + "flag_cr": "🇨🇷", + "flag_ci": "🇨🇮", + "flag_hr": "🇭🇷", + "flag_cu": "🇨🇺", + "flag_cw": "🇨🇼", + "flag_cy": "🇨🇾", + "flag_cz": "🇨🇿", + "flag_dk": "🇩🇰", + "flag_dj": "🇩🇯", + "flag_dm": "🇩🇲", + "flag_do": "🇩🇴", + "flag_ec": "🇪🇨", + "flag_eg": "🇪🇬", + "flag_sv": "🇸🇻", + "flag_gq": "🇬🇶", + "flag_er": "🇪🇷", + "flag_ee": "🇪🇪", + "flag_et": "🇪🇹", + "flag_eu": "🇪🇺", + "flag_fk": "🇫🇰", + "flag_fo": "🇫🇴", + "flag_fj": "🇫🇯", + "flag_fi": "🇫🇮", + "flag_fr": "🇫🇷", + "flag_gf": "🇬🇫", + "flag_pf": "🇵🇫", + "flag_tf": "🇹🇫", + "flag_ga": "🇬🇦", + "flag_gm": "🇬🇲", + "flag_ge": "🇬🇪", + "flag_de": "🇩🇪", + "flag_gh": "🇬🇭", + "flag_gi": "🇬🇮", + "flag_gr": "🇬🇷", + "flag_gl": "🇬🇱", + "flag_gd": "🇬🇩", + "flag_gp": "🇬🇵", + "flag_gu": "🇬🇺", + "flag_gt": "🇬🇹", + "flag_gg": "🇬🇬", + "flag_gn": "🇬🇳", + "flag_gw": "🇬🇼", + "flag_gy": "🇬🇾", + "flag_ht": "🇭🇹", + "flag_hn": "🇭🇳", + "flag_hk": "🇭🇰", + "flag_hu": "🇭🇺", + "flag_is": "🇮🇸", + "flag_in": "🇮🇳", + "flag_id": "🇮🇩", + "flag_ir": "🇮🇷", + "flag_iq": "🇮🇶", + "flag_ie": "🇮🇪", + "flag_im": "🇮🇲", + "flag_il": "🇮🇱", + "flag_it": "🇮🇹", + "flag_jm": "🇯🇲", + "flag_jp": "🇯🇵", + "crossed_flags": "🎌", + "flag_je": "🇯🇪", + "flag_jo": "🇯🇴", + "flag_kz": "🇰🇿", + "flag_ke": "🇰🇪", + "flag_ki": "🇰🇮", + "flag_xk": "🇽🇰", + "flag_kw": "🇰🇼", + "flag_kg": "🇰🇬", + "flag_la": "🇱🇦", + "flag_lv": "🇱🇻", + "flag_lb": "🇱🇧", + "flag_ls": "🇱🇸", + "flag_lr": "🇱🇷", + "flag_ly": "🇱🇾", + "flag_li": "🇱🇮", + "flag_lt": "🇱🇹", + "flag_lu": "🇱🇺", + "flag_mo": "🇲🇴", + "flag_mk": "🇲🇰", + "flag_mg": "🇲🇬", + "flag_mw": "🇲🇼", + "flag_my": "🇲🇾", + "flag_mv": "🇲🇻", + "flag_ml": "🇲🇱", + "flag_mt": "🇲🇹", + "flag_mh": "🇲🇭", + "flag_mq": "🇲🇶", + "flag_mr": "🇲🇷", + "flag_mu": "🇲🇺", + "flag_yt": "🇾🇹", + "flag_mx": "🇲🇽", + "flag_fm": "🇫🇲", + "flag_md": "🇲🇩", + "flag_mc": "🇲🇨", + "flag_mn": "🇲🇳", + "flag_me": "🇲🇪", + "flag_ms": "🇲🇸", + "flag_ma": "🇲🇦", + "flag_mz": "🇲🇿", + "flag_mm": "🇲🇲", + "flag_na": "🇳🇦", + "flag_nr": "🇳🇷", + "flag_np": "🇳🇵", + "flag_nl": "🇳🇱", + "flag_nc": "🇳🇨", + "flag_nz": "🇳🇿", + "flag_ni": "🇳🇮", + "flag_ne": "🇳🇪", + "flag_ng": "🇳🇬", + "flag_nu": "🇳🇺", + "flag_nf": "🇳🇫", + "flag_kp": "🇰🇵", + "flag_mp": "🇲🇵", + "flag_no": "🇳🇴", + "flag_om": "🇴🇲", + "flag_pk": "🇵🇰", + "flag_pw": "🇵🇼", + "flag_ps": "🇵🇸", + "flag_pa": "🇵🇦", + "flag_pg": "🇵🇬", + "flag_py": "🇵🇾", + "flag_pe": "🇵🇪", + "flag_ph": "🇵🇭", + "flag_pn": "🇵🇳", + "flag_pl": "🇵🇱", + "flag_pt": "🇵🇹", + "flag_pr": "🇵🇷", + "flag_qa": "🇶🇦", + "flag_re": "🇷🇪", + "flag_ro": "🇷🇴", + "flag_ru": "🇷🇺", + "flag_rw": "🇷🇼", + "flag_ws": "🇼🇸", + "flag_sm": "🇸🇲", + "flag_st": "🇸🇹", + "flag_sa": "🇸🇦", + "flag_sn": "🇸🇳", + "flag_rs": "🇷🇸", + "flag_sc": "🇸🇨", + "flag_sl": "🇸🇱", + "flag_sg": "🇸🇬", + "flag_sx": "🇸🇽", + "flag_sk": "🇸🇰", + "flag_si": "🇸🇮", + "flag_gs": "🇬🇸", + "flag_sb": "🇸🇧", + "flag_so": "🇸🇴", + "flag_za": "🇿🇦", + "flag_kr": "🇰🇷", + "flag_ss": "🇸🇸", + "flag_es": "🇪🇸", + "flag_lk": "🇱🇰", + "flag_bl": "🇧🇱", + "flag_sh": "🇸🇭", + "flag_kn": "🇰🇳", + "flag_lc": "🇱🇨", + "flag_pm": "🇵🇲", + "flag_vc": "🇻🇨", + "flag_sd": "🇸🇩", + "flag_sr": "🇸🇷", + "flag_sz": "🇸🇿", + "flag_se": "🇸🇪", + "flag_ch": "🇨🇭", + "flag_sy": "🇸🇾", + "flag_tw": "🇹🇼", + "flag_tj": "🇹🇯", + "flag_tz": "🇹🇿", + "flag_th": "🇹🇭", + "flag_tl": "🇹🇱", + "flag_tg": "🇹🇬", + "flag_tk": "🇹🇰", + "flag_to": "🇹🇴", + "flag_tt": "🇹🇹", + "flag_tn": "🇹🇳", + "flag_tr": "🇹🇷", + "flag_tm": "🇹🇲", + "flag_tc": "🇹🇨", + "flag_vi": "🇻🇮", + "flag_tv": "🇹🇻", + "flag_ug": "🇺🇬", + "flag_ua": "🇺🇦", + "flag_ae": "🇦🇪", + "flag_gb": "🇬🇧", + "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", + "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", + "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", + "flag_us": "🇺🇸", + "flag_uy": "🇺🇾", + "flag_uz": "🇺🇿", + "flag_vu": "🇻🇺", + "flag_va": "🇻🇦", + "flag_ve": "🇻🇪", + "flag_vn": "🇻🇳", + "flag_wf": "🇼🇫", + "flag_eh": "🇪🇭", + "flag_ye": "🇾🇪", + "flag_zm": "🇿🇲", + "flag_zw": "🇿🇼", + "flag_ac": "🇦🇨", + "flag_bv": "🇧🇻", + "flag_cp": "🇨🇵", + "flag_ea": "🇪🇦", + "flag_dg": "🇩🇬", + "flag_hm": "🇭🇲", + "flag_mf": "🇲🇫", + "flag_sj": "🇸🇯", + "flag_ta": "🇹🇦", + "flag_um": "🇺🇲", + "united_nations": "🇺🇳" +} \ No newline at end of file diff --git a/dashboard/static/js/embed.js b/dashboard/static/js/embed.js new file mode 100644 index 00000000..18a77d62 --- /dev/null +++ b/dashboard/static/js/embed.js @@ -0,0 +1,348 @@ +let number = 4; +let rgx = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; + +$(document).ready(() => { + let switches = { + title: false, + url: false, + icon: false }; + + + let fields = 0; + + let embed = { + title: 'Embed Title', + author: { + name: '', + url: '', + icon: '' }, + + description: '', + url: '', + thumb_url: '', + color: '', + fields: [{}], + + + footer: '' }; + + + function resetEmbed() { + $('.embed-inner').html(''); + $('.embed-footer').remove(); + $('.embed-thumb').remove(); + } + + function updateEmbed(embed) { + resetEmbed(); + + if (embed.footer) { + $('.card.embed').append(``); + + + } + + if (embed.url) { + $('.embed-inner').append(``); + + + } else { + $('.embed-inner').append(`
${embed.title.match(/.{1,46}/g).join("
")}
`); + + + } + + if (embed.description) { + $('.embed-inner').append(`
${embed.description.match(/.{1,46}/g).join("
").replace(/{user}/g, `{User}`).replace(/{user_tag}/g, `{user_tag}`).replace(/{guild}/g, `{guild}`).replace(/{memberCount}/g, `{memberCount}`)}
`); + + + } + + if (embed.color) { + $('.side-colored').css('background-color', embed.color); + + + } + + + + if (embed.author.name) { + + + $('.embed-title').before(``); + + + if (embed.author.icon) { + $('.embed-author-name').before(``); + + + } + + + } + + if (embed.thumb_url) { + // add thumbnail + + + $('.card.embed .card-block').append(``); + $('.embed-thumb').height($('.embed-thumb')[0].naturalHeight); + + + + + } + + + + + + + } + + // run once on startup + updateEmbed(embed); + + function generateInputFields(fields) { + // generate inputs for fields + $('.input-fields').html(''); + for (let i = 0; i < fields; i++) { + $('.input-fields').append(`
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
`); + $(`#field-${i}-name`).keyup(() => { + updateFieldName(i, $(`#field-${i}-name`).val()); + }); + + $(`#field-${i}-value`).keyup(() => { + updateFieldValue(i, $(`#field-${i}-value`).val()); + }); + + $(`#field-${i}-inline`).click(() => { + updateFieldInline(i, $(`#field-${i}-inline`).is(':checked')); + }); + + $(`#field-${i}-delete`).click(e => { + e.preventDefault(); + deleteField(i); + }); + } + $('.input-fields').append(``); + $('#add-field').click(e => { + e.preventDefault(); + addField(); + }); + } + + generateInputFields(fields); + + function updateFieldName(index, value) { + embed.fields[index].name = value; + updateEmbed(embed); + } + + function updateFieldValue(index, value) { + embed.fields[index].value = value; + updateEmbed(embed); + } + + function updateFieldInline(index, value) { + embed.fields[index].inline = value; + updateEmbed(embed); + } + + function deleteField(index) { + embed.fields.splice(index, 1); + updateEmbed(embed); + fields -= 1; + generateInputFields(fields); + } + + function addField() { + embed.fields.push({ inline: true }); + fields += 1; + generateInputFields(fields); + } + + function updateTitle(value) { + embed.title = value || ''; + updateEmbed(embed); + } + + function updateUrl(value) { + embed.url = value || ''; + updateEmbed(embed); + } + + function updateThumb(value) { + embed.thumb_url = value || false; + updateEmbed(embed); + } + + function updateDescription(value) { + embed.description = value || ''; + updateEmbed(embed); + } + + function updateColor(value) { + embed.color = value || false; + updateEmbed(embed); + } + + function updateAuthorName(value) { + embed.author.name = value || ''; + updateEmbed(embed); + } + + function updateAuthorUrl(value) { + embed.author.url = value || ''; + updateEmbed(embed); + } + + function updateAuthorIcon(value) { + embed.author.icon = value || ''; + updateEmbed(embed); + } + + function updateFooter(value) { + embed.footer = value || ''; + updateEmbed(embed); + } + + $('#form').submit(e => { + e.preventDefault(); + }); + + // checking helpers + function addWarning(item, type, message) { + item.addClass('form-control-warning'); + item.removeClass('form-control-success'); + item.parent().addClass('has-warning'); + item.parent().removeClass('has-success'); + if ($(`#${type}-feedback`).length === 0) { + item.after(``); + } + } + + function addSuccess(item, type) { + item.removeClass('form-control-warning'); + item.addClass('form-control-success'); + item.parent().addClass('has-success'); + item.parent().removeClass('has-warning'); + $(`#${type}-feedback`).remove(); + } + + $('#title').keyup(() => { + let item = $('#title'); + let title = item.val(); + + // preform checks + if (title.length === 0) { + addWarning(item, 'title', 'title cannot be empty'); + } else { + addSuccess(item, 'title'); + // update + updateTitle(title); + } + + }); + + $('#url').keyup(() => { + let item = $('#url'); + let url = item.val(); + + if (number == "69") { + addWarning(item, 'url', 'invalid url'); + } else { + addSuccess(item, 'url'); + // update + updateUrl(url); + } + + + }); + + $('#icon').keyup(() => { + let item = $('#icon'); + let icon = item.val(); + + if (number == "69") { + addWarning(item, 'icon', 'invalid url'); + } else { + addSuccess(item, 'icon'); + // update + updateThumb(icon); + } + }); + + $('#description').keyup(() => { + let item = $('#description'); + let description = item.val(); + addSuccess(item, 'description'); + // update + updateDescription(description); + }); + + $('#color').change(() => { + updateColor($('#color').val()); + }); + + $('#author_name').keyup(() => { + let item = $('#author_name'); + let author_name = item.val(); + + addSuccess(item, 'author_name'); + // update + updateAuthorName(author_name); + }); + + $('#author_url').keyup(() => { + let item = $('#author_url'); + let author_url = item.val(); + + if (number == "69") { + addWarning(item, 'author_url', 'invalid Url'); + } else { + addSuccess(item, 'author_url'); + // update + updateAuthorUrl(author_url); + } + }); + + $('#author_icon').keyup(() => { + let item = $('#author_icon'); + let author_icon = item.val(); + + if (number == "69") { + addWarning(item, 'author_icon', 'not a valid url'); + } else { + addSuccess(item, 'author_icon'); + // update + updateAuthorIcon(author_icon); + } + }); + + $('#footer').keyup(() => { + let item = $('#footer'); + let footer = item.val(); + + addSuccess(item, 'footer'); + // update + updateFooter(footer); + }); +}); \ No newline at end of file diff --git a/dashboard/static/js/index.js b/dashboard/static/js/index.js new file mode 100644 index 00000000..86fc4bdd --- /dev/null +++ b/dashboard/static/js/index.js @@ -0,0 +1,54 @@ +const dropdownel = document.getElementById("dropdown"); +const droddownhead = document.getElementById("dropdownHead"); +const blur = document.querySelector(".blur"); + +function dropdown(e) { + if (dropdownel.style.visibility != "visible") { + dropdownel.classList.toggle("dropdown-hidden"); + droddownhead.classList.toggle("dropdown-actived"); + blur.classList.toggle("visible"); + } else { + dropdownel.classList.toggle("dropdown-hidden"); + blur.classList.toggle("visible"); + } +} + +window.onresize = function() { + dropdownel.classList.remove("dropdown-hidden"); + droddownhead.classList.remove("dropdown-actived"); + blur.classList.remove("visible"); +} + +document.addEventListener("click", function(e) { + if (!e.target.classList.contains("dropdownHead")) { + let allDropdowns = document.querySelectorAll(".dropdown"); + [].forEach.call(allDropdowns, function(curr) { + if (curr.style.visibility == "visible") { + curr.classList.toggle("dropdown-hidden"); + } + }); + } +}); + +blur.addEventListener('click', () => { + dropdownel.classList.remove("dropdown-hidden"); + droddownhead.classList.remove("dropdown-actived"); + blur.classList.remove("visible"); +}) + +const cross = document.querySelector(".cross"); +cross.addEventListener('click', () => { + dropdownel.classList.remove("dropdown-hidden"); + document.getElementById("dropdownHead").classList.remove("dropdown-actived"); + blur.classList.remove("visible"); +}) + +document.addEventListener('click', function(event) { + if (event.target.tagName !== "A" || !event.target.href || event.target.target == "_blank") return; + event.preventDefault(); + var link = event.target; + document.body.style.opacity = 0; + document.body.addEventListener("transitionend", function() { + location.href = link.href; + }); +}); diff --git a/dashboard/static/js/indexx.js b/dashboard/static/js/indexx.js new file mode 100644 index 00000000..a69076ba --- /dev/null +++ b/dashboard/static/js/indexx.js @@ -0,0 +1,663 @@ + +// Want to use or contribute to this? https://github.com/Glitchii/embedbuilder +// If you found an issue, please report it, make a P.R, or use the discussion page. Thanks + +var activeFields, colNum = 1, num = 0, + toRGB = (hex, reversed, integer) => { + if (reversed) return '#' + hex.match(/[\d]+/g).map(x => parseInt(x).toString(16).padStart(2, '0')).join(''); + if (integer) return parseInt(hex.match(/[\d]+/g).map(x => parseInt(x).toString(16).padStart(2, '0')).join(''), 16); + if (hex.includes(',')) return hex.match(/[\d]+/g); + hex = hex.replace('#', '').match(/.{1,2}/g) + return [parseInt(hex[0], 16), parseInt(hex[1], 16), parseInt(hex[2], 16), 1]; + }, json = { + content: "Hello! this is very POG!", + embed: { + title: "This is an Embed", + description: "You can use [links](https://discord.com) or emojis :smile: 😎\n```\nAnd also code blocks\n```", + color: 4321431, + timestamp: new Date().toISOString(), + url: "https://discord.com", + author: { + name: "Author name", + url: "https://discord.com", + icon_url: "https://unsplash.it/100" + }, + thumbnail: { + url: "https://unsplash.it/200" + }, + image: { + url: "https://unsplash.it/380/200" + }, + footer: { + text: "Footer text", + icon_url: "https://unsplash.it/100" + }, + fields: [ + { + name: "Add as much as Fields as you want :o:", + value: "Field value" + }, + { + name: "Field 2", + value: "You can use custom emojis <:Kekwlaugh:722088222766923847>. <:GangstaBlob:742256196295065661>", + inline: false + }, + { + name: "Inline field", + value: "Fields can be inline", + inline: true + }, + { + name: "Inline field", + value: "*Lorem ipsum*", + inline: true + }, + { + name: "Inline field", + value: "value", + inline: true + }, + { + name: "Another field", + value: "> Nope, didn't forget about code blocks", + inline: false + } + ] + } + }; + +window.onload = () => { + document.querySelectorAll('img.clickable') + .forEach(e => e.addEventListener('click', el => window.open(el.target.src))); + let editorHolder = document.querySelector('.editorHolder'), + guiParent = document.querySelector('.top'), + embedContent = document.querySelector('.messageContent'), + embedCont = document.querySelector('.messageContent + .container'), + gui = guiParent.querySelector('.gui:first-of-type'); + window.editor = CodeMirror(elt => editorHolder.parentNode.replaceChild(elt, editorHolder), { + value: JSON.stringify(json, null, 4), + extraKeys: { Tab: cm => cm.replaceSelection(" ", "end") }, + gutters: ["CodeMirror-foldgutter", "CodeMirror-lint-markers"], + scrollbarStyle: "overlay", + mode: "application/json", + theme: 'material-darker', + matchBrackets: true, + foldGutter: true, + lint: true, + }); + + editor.focus(); + let notif = document.querySelector('.notification'), + url = (url) => /^(https?:)?\/\//g.exec(url) ? url : '//' + url, + makeShort = (txt, length, mediaWidth) => { + if (mediaWidth && window.matchMedia(`(max-width:${mediaWidth}px)`).matches) + return txt.length > (length - 3) ? txt.substring(0, length - 3) + '...' : txt; + return txt; + }, error = (msg, time) => { + notif.innerHTML = msg, notif.style.display = 'block'; + time && setTimeout(() => notif.animate({ opacity: '0', bottom: '-50px', offset: 1 }, { easing: 'ease', duration: 500 }) + .onfinish = () => notif.style.removeProperty('display'), time); + return false; + }, allGood = e => { + let re = /"((icon_)?url")(: *)("(?!https?:\/\/).+?")/g.exec(editor.getValue()); + if (re) return error(`URL should start with https:// or http:// on this line ${makeShort(re[0], 30, 600)}`); + if (e.timestamp && new Date(e.timestamp).toString() === "Invalid Date") return error('Timestamp is invalid'); + return true; + }, markup = (txt, opts) => { + txt = txt + .replace(/\<:[^:]+:(\d+)\>/g, '') + .replace(/\<a:[^:]+:(\d+)\>/g, '') + .replace(/~~(.+?)~~/g, '$1') + .replace(/\*\*\*(.+?)\*\*\*/g, '$1') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/__(.+?)__/g, '$1') + .replace(/\*(.+?)\*/g, '$1') + .replace(/_(.+?)_/g, '$1') + if (opts.inlineBlock) txt = txt.replace(/\`([^\`]+?)\`|\`\`([^\`]+?)\`\`|\`\`\`((?:\n|.)+?)\`\`\`/g, (m, x, y, z) => x ? `${x}` : y ? `${y}` : z ? `${z}` : m); + else txt = txt.replace(/\`\`\`(\w{1,15})?\n((?:\n|.)+?)\`\`\`|\`\`(.+?)\`\`(?!\`)|\`([^\`]+?)\`/g, (m, w, x, y, z) => w && x ? `
${x}
` : x ? `
${x}
` : y || z ? `${y || z}` : m); + if (opts.inEmbed) txt = txt.replace(/\[([^\[\]]+)\]\((.+?)\)/g, `$1`); + if (opts.replaceEmojis) txt = txt.replace(/(?[^>]+)(? x && emojis[x] ? emojis[x] : match); + txt = txt + .replace(/(?<=\n|^)\s*>\s+([^\n]+)/g, '
$1
') + .replace(/\n/g, '
'); + return txt; + }, + embed = document.querySelector('.embedGrid'), + msgEmbed = document.querySelector('.msgEmbed'), + embedTitle = document.querySelector('.embedTitle'), + embedDescription = document.querySelector('.embedDescription'), + embedAuthor = document.querySelector('.embedAuthor'), + embedFooter = document.querySelector('.embedFooter'), + embedImage = document.querySelector('.embedImage'), + embedThumbnail = document.querySelector('.embedThumbnail'), + embedFields = embed.querySelector('.embedFields'), + encodeHTML = str => str.replace(/[\u00A0-\u9999<>\&]/g, i => '&#' + i.charCodeAt(0) + ';'), + tstamp = stringISO => { + let date = stringISO ? new Date(stringISO) : new Date(), + dateArray = date.toLocaleString('en-US', { hour: 'numeric', hour12: true, minute: 'numeric' }), + today = new Date(), + yesterday = new Date(new Date().setDate(today.getDate() - 1)); + return today.toDateString() === date.toDateString() ? `Today at ${dateArray}` : + yesterday.toDateString() === date.toDateString() ? `Yesterday at ${dateArray}` : + `${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}/${date.getFullYear()}`; + }, display = (el, data, displayType) => { + if (data) el.innerHTML = data; + el.style.display = displayType || "unset"; + }, hide = el => el.style.removeProperty('display'), + imgSrc = (elm, src, remove) => remove ? elm.style.removeProperty('content') : elm.style.content = `url(${src})`, + toObj = jsonString => JSON.parse(jsonString.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (x, y) => y ? "" : x)); + buildGui = (object, opts) => { + gui.innerHTML = ` +

Message content

+
+ +
+

Author

+
+
+
+ + +
+
+ +
+
+
+ + + +
+
+ + +
+

Title

+ +
+

Description

+
+ +
+

Fields

+
+

Thumbnail

+
+
+
+ +
+ +
+ + + +
+
+
+
+
+

Image

+
+
+
+ +
+ +
+ + + +
+
+
+
+
+ +
+
+
+ + +
+
+ +
+
+
+ + + +
+
`; + + let fieldsEditor = gui.querySelector('.fields ~ .edit'), addField = ` +
+

New Field

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
`; + if (object.embed?.fields) fieldsEditor.innerHTML = object.embed.fields.filter(f => f && typeof f === 'object').map(f => ` +
+
+
+
+ +
+
+ +
+
+
+ +
+
+ + + + + + Remove +
+
`).join('\n') + addField; + else fieldsEditor.innerHTML = addField; + + gui.querySelectorAll('.removeBtn').forEach(e => { + e.addEventListener('click', el => { + fields = gui.querySelector('.fields ~ .edit'); + let field = el.target.closest('.field'); + if (field) { + let i = Array.from(fields.children).indexOf(field), jsonField = object.embed.fields[i]; + if (jsonField) { + object.embed.fields.splice(i, 1); + field.remove(); + update(object); + } + } + }) + }) + + document.querySelectorAll('.gui > .item').forEach(e => { + e.addEventListener('click', el => { + let elm = (el.target.closest('.top>.gui>.item') || el.target); + if (elm.classList.contains('active')) window.getSelection().anchorNode !== elm && elm.classList.remove('active'); + else { + let inlineField = elm.closest('.inlineField'), + input = elm.nextElementSibling.querySelector('input[type="text"]'), + txt = elm.nextElementSibling.querySelector('textarea'); + elm.classList.add('active'); + if (inlineField) inlineField.querySelector('.ttle~input').focus(); + else if (input) { + input.focus(); + input.selectionStart = input.selectionEnd = input.value.length; + } else if (txt) txt.focus(); + elm.classList.contains('fields') && elm.scrollIntoView({ behavior: "smooth", block: "center" }); + } + }) + }) + + content = gui.querySelector('.editContent'); + title = gui.querySelector('.editTitle'); + authorName = gui.querySelector('.editAuthorName'); + authorLink = gui.querySelector('.editAuthorLink'); + desc = gui.querySelector('.editDescription'); + thumbLink = gui.querySelector('.editThumbnailLink'); + imgLink = gui.querySelector('.editImageLink'); + footerText = gui.querySelector('.editFooterText'); + footerLink = gui.querySelector('.editFooterLink'); + fields = gui.querySelector('.fields ~ .edit'); + + document.querySelector('.addField').addEventListener('click', () => { + !json.embed && (json.embed = {}); + let arr = json.embed.fields || []; + if (arr.length >= 25) return error('Cannot have more than 25 fields', 5000); + arr.push({ name: "Field name", value: "Field value", inline: false }); + json.embed.fields = arr; + update(json); + buildGui(json, { newField: true, activate: document.querySelectorAll('.gui > .item.active') }); + }) + + gui.querySelectorAll('textarea, input').forEach(e => e.addEventListener('input', el => { + let v = el.target.value, field = el.target.closest('.field'); + if (field) { + let jsonField = json.embed.fields[Array.from(fields.children).indexOf(field)]; + if (jsonField) { + if (el.target.type === 'text') jsonField.name = v; + else if (el.target.type === 'textarea') jsonField.value = v; + else jsonField.inline = el.target.checked; + } else { + let obj = {} + if (el.target.type === 'text') obj.name = v; + else if (el.target.type === 'textarea') obj.value = v; + else obj.inline = el.target.checked; + json.embed.fields.push(obj); + } + } else { + json.embed ??= {}; + switch (el.target) { + case content: json.content = v; break; + case title: json.embed.title = v; break; + case authorName: json.embed.author ??= {}, json.embed.author.name = v; break; + case authorLink: json.embed.author ??= {}, json.embed.author.icon_url = v, imgSrc(el.target.previousElementSibling, v); break; + case desc: json.embed.description = v; break; + case thumbLink: json.embed.thumbnail ??= {}, json.embed.thumbnail.url = v, imgSrc(el.target.closest('.editIcon').querySelector('.imgParent'), v); break; + case imgLink: json.embed.image ??= {}, json.embed.image.url = v, imgSrc(el.target.closest('.editIcon').querySelector('.imgParent'), v); break; + case footerText: json.embed.footer ??= {}, json.embed.footer.text = v; break; + case footerLink: json.embed.footer ??= {}, json.embed.footer.icon_url = v, imgSrc(el.target.previousElementSibling, v); break; + } + } + update(json); + })) + + if (opts?.activate) { + let elements = opts.activate; + Array.from(elements).map(el => el.className).map(clss => '.' + clss.split(' ').slice(0, 2).join('.')) + .forEach(clss => document.querySelectorAll(clss) + .forEach(e => e.classList.add('active'))) + } else['.item.author', '.item.description'].forEach(clss => document.querySelector(clss).classList.add('active')); + + if (opts?.newField) { + let last = fields.children[fields.childElementCount - 2], el = last.querySelector('.designerFieldName > input'); + el.setSelectionRange(el.value.length, el.value.length); el.focus(); + last.scrollIntoView({ behavior: "smooth", block: "center" }); + } + + let files = document.querySelectorAll('input[type="file"]'); + files.forEach(f => f.addEventListener('change', e => { + if (f.files) { + e.target.nextElementSibling.click(); + e.target.closest('.edit').querySelector('.browse').classList.add('loading'); + } + })) + + document.querySelectorAll('form').forEach(form => form.addEventListener('submit', e => { + e.preventDefault(); + let formData = new FormData(e.target); + formData.append('file', files.files); + formData.append('datetime', '10m'); + fetch('https://tempfile.site/api/files', { + method: 'POST', + body: formData, + }) + .then(res => res.json()) + .then(res => { + let browse = e.target.closest('.edit').querySelector('.browse'); + browse.classList.remove('loading'); + if (!res.ok) { + console.log(res.error); + browse.classList.add('error'); + return setTimeout(() => browse.classList.remove('error'), 5000) + } + imgSrc(e.target.previousElementSibling.querySelector('.editIcon > .imgParent') || e.target.closest('.editIcon').querySelector('.imgParent'), res.link); + let input = e.target.previousElementSibling.querySelector('.editIcon > input') || e.target.previousElementSibling; + input.value = res.link; + if (input === authorLink) json.embed.author.icon_url = res.link; + else if (input === thumbLink) json.embed.thumbnail.url = res.link; + else if (input === imgLink) json.embed.image.url = res.link; + else json.embed.footer.icon_url = res.link; + update(json); + console.info(`Image (${res.link}) will be deleted in 5 minutes. To delete it now got to ${res.link.replace('/files', '/del')} and enter this code: ${res.authkey}`); + }).catch(err => `Request to tempfile.site failed with error: ${err}`) + })) + } + + buildGui(json); + fields = gui.querySelector('.fields ~ .edit'); + update = data => { + try { + if (!data.content) embedContent.classList.add('empty'); + else { + embedContent.innerHTML = markup(encodeHTML(data.content), { replaceEmojis: true }); + embedContent.classList.remove('empty'); + } + if (data.embed && Object.keys(data.embed).length) { + let e = data.embed; + if (!allGood(e)) return; + if (e.title) display(embedTitle, markup(`${e.url ? '' + encodeHTML(e.title) + '' : encodeHTML(e.title)}`, { replaceEmojis: true, inlineBlock: true })); + else hide(embedTitle); + if (e.description) display(embedDescription, markup(encodeHTML(e.description), { inEmbed: true, replaceEmojis: true })); + else hide(embedDescription); + if (e.color) embed.closest('.embed').style.borderColor = encodeHTML(typeof e.color === 'number' ? '#' + e.color.toString(16).padStart(6, "0") : e.color); + else embed.closest('.embed').style.removeProperty('border-color'); + if (e.author && e.author.name) display(embedAuthor, ` + ${e.author.icon_url ? '' : ''} + ${e.author.url ? '' + encodeHTML(e.author.name) + '' : '' + encodeHTML(e.author.name) + ''}`, 'flex'); + else hide(embedAuthor); + if (e.thumbnail && e.thumbnail.url) embedThumbnail.src = encodeHTML(e.thumbnail.url), embedThumbnail.style.display = 'block'; + else hide(embedThumbnail); + if (e.image && e.image.url) embedImage.src = encodeHTML(e.image.url), embedImage.style.display = 'block'; + else hide(embedImage); + if (e.footer && e.footer.text) display(embedFooter, ` + ${e.footer.icon_url ? '' : ''} + ${encodeHTML(e.footer.text)} + ${e.timestamp ? '' + encodeHTML(tstamp(e.timestamp)) : ''}`, 'flex'); + else if (e.timestamp) display(embedFooter, `${encodeHTML(tstamp(e.timestamp))}`, 'flex'); + else hide(embedFooter); + if (e.fields) { + embedFields.innerHTML = ''; + e.fields.forEach(f => { + if (f.name && f.value) { + if (!f.inline) { + let el = embedFields.insertBefore(document.createElement('div'), null); + el.outerHTML = ` +
+
${markup(encodeHTML(f.name), { inEmbed: true, replaceEmojis: true, inlineBlock: true })}
+
${markup(encodeHTML(f.value), { inEmbed: true, replaceEmojis: true })}
+
`; + } else { + el = embedFields.insertBefore(document.createElement('div'), null); + el.outerHTML = ` +
+
${markup(encodeHTML(f.name), { inEmbed: true, replaceEmojis: true, inlineBlock: true })}
+
${markup(encodeHTML(f.value), { inEmbed: true, replaceEmojis: true })}
+
`; + colNum = (colNum === 9 ? 1 : colNum + 4); + num++; + } + } + }); + colNum = 1; + let len = e.fields.filter(f => f.inline).length; + if (len === 2 || (len > 3 && len % 2 !== 0)) { + let children = Array.from(embedFields.children), arr = children.filter(x => x === children[len] || x === children[len - 1]); + arr[0] && (arr[0].style.gridColumn = '1 / 7'); + arr[1] && (arr[1].style.gridColumn = '7 / 13'); + } + display(embedFields, undefined, 'grid'); + } else hide(embedFields); + embedCont.classList.remove('empty'); + document.querySelectorAll('.markup pre > code').forEach((block) => hljs.highlightBlock(block)); + notif.animate({ opacity: '0', bottom: '-50px', offset: 1 }, { easing: 'ease', duration: 500 }).onfinish = () => notif.style.removeProperty('display'); + twemoji.parse(msgEmbed); + } else embedCont.classList.add('empty'); + } catch (e) { + error(e); + } + } + + editor.on('change', editor => { + try { update(toObj(editor.getValue())); } + catch (e) { + if (editor.getValue()) return; + embedCont.classList.add('empty'); + embedContent.innerHTML = ''; + } + }); + + let picker = new CP(document.querySelector('.picker'), state = { parent: document.querySelector('.cTop') }); + picker.fire('change', toRGB('#41f097')); + + let colRight = document.querySelector('.colRight'), removePicker = () => colRight.classList.remove('picking'); + document.querySelector('.colBack').addEventListener('click', e => { + picker.self.remove(); removePicker(); + }) + picker.on('enter', () => colRight.classList.add('picking')) + picker.on('exit', removePicker); + + document.querySelectorAll('.colr').forEach(e => e.addEventListener('click', el => { + el = el.target.closest('.colr') || el.target; + embed.closest('.embed').style.borderColor = el.style.backgroundColor; + json.embed && (json.embed.color = toRGB(el.style.backgroundColor, false, true)); + picker.source.style.removeProperty('background'); + })) + + setTimeout(() => { + picker.on('change', function (r, g, b, a) { + embed.closest('.embed').style.borderColor = this.color(r, g, b); + json.embed && (json.embed.color = parseInt(this.color(r, g, b).slice(1), 16)); + picker.source.style.background = this.color(r, g, b); + }) + }, 1000) + + document.querySelector('.timeText').innerText = tstamp(); + document.querySelectorAll('.markup pre > code').forEach((block) => hljs.highlightBlock(block)); + !window.navigator.userAgent.match(/Firefox\/[\d\.]+$/g) && // Firefox pushes the text up a little + document.querySelector('.botText').style.removeProperty('top'); + + document.querySelector('.opt.gui').addEventListener('click', () => { + json = toObj(editor.getValue() || '{}'); + buildGui(json, { activate: activeFields }); + document.body.classList.add('gui'); + activeFields = null; + }) + + document.querySelector('.opt.json').addEventListener('click', () => { + editor.setValue(JSON.stringify(json, null, 4)); + editor.refresh(); + document.body.classList.remove('gui'); + editor.focus(); + activeFields = document.querySelectorAll('.gui > .item.active'); + }) + + document.querySelector('.clear').addEventListener('click', () => { + json = { }; + embed.style.removeProperty('border-color'); + picker.source.style.removeProperty('background'); + update(json); buildGui(json); editor.setValue(JSON.stringify(json, null, 4)); + document.querySelectorAll('.gui>.item').forEach(e => e.classList.add('active')); + content.focus(); + }) + + let colrs = document.querySelector('.colrs'); + document.querySelector('.pickerToggle').addEventListener('click', () => colrs.classList.toggle('display')); + update(json); +}; diff --git a/dashboard/static/js/leaveembed.js b/dashboard/static/js/leaveembed.js new file mode 100644 index 00000000..bc93457c --- /dev/null +++ b/dashboard/static/js/leaveembed.js @@ -0,0 +1,348 @@ +let number = 4; +let rgx = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; + +$(document).ready(() => { + let switches = { + title: false, + url: false, + icon: false }; + + + let fields = 0; + + let embed = { + title: 'Embed Title', + author: { + name: '', + url: '', + icon: '' }, + + description: '', + url: '', + thumb_url: '', + color: '', + fields: [{}], + + + footer: '' }; + + + function resetEmbed() { + $('.embed-innerr').html(''); + $('.embed-footer').remove(); + $('.embed-thumb').remove(); + } + + function updateEmbed(embed) { + resetEmbed(); + + if (embed.footer) { + $('.card.embed').append(``); + + + } + + if (embed.url) { + $('.embed-innerr').append(``); + + + } else { + $('.embed-innerr').append(`
${embed.title.match(/.{1,46}/g).join("
")}
`); + + + } + + if (embed.description) { + $('.embed-innerr').append(`
${embed.description.match(/.{1,46}/g).join("
").replace(/{user}/g, `{User}`).replace(/{user_tag}/g, `{user_tag}`).replace(/{guild}/g, `{guild}`).replace(/{memberCount}/g, `{memberCount}`)}
`); + + + } + + if (embed.color) { + $('.side-colored').css('background-color', embed.color); + + + } + + + + if (embed.author.name) { + + + $('.embed-title').before(``); + + + if (embed.author.icon) { + $('.embed-author-name').before(``); + + + } + + + } + + if (embed.thumb_url) { + // add thumbnail + + + $('.card.embed .card-block').append(``); + $('.embed-thumb').height($('.embed-thumb')[0].naturalHeight); + + + + + } + + + + + + + } + + // run once on startup + updateEmbed(embed); + + function generateInputFields(fields) { + // generate inputs for fields + $('.input-fields').html(''); + for (let i = 0; i < fields; i++) { + $('.input-fields').append(`
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
`); + $(`#field-${i}-name`).keyup(() => { + updateFieldName(i, $(`#field-${i}-name`).val()); + }); + + $(`#field-${i}-value`).keyup(() => { + updateFieldValue(i, $(`#field-${i}-value`).val()); + }); + + $(`#field-${i}-inline`).click(() => { + updateFieldInline(i, $(`#field-${i}-inline`).is(':checked')); + }); + + $(`#field-${i}-delete`).click(e => { + e.preventDefault(); + deleteField(i); + }); + } + $('.input-fields').append(``); + $('#add-field').click(e => { + e.preventDefault(); + addField(); + }); + } + + generateInputFields(fields); + + function updateFieldName(index, value) { + embed.fields[index].name = value; + updateEmbed(embed); + } + + function updateFieldValue(index, value) { + embed.fields[index].value = value; + updateEmbed(embed); + } + + function updateFieldInline(index, value) { + embed.fields[index].inline = value; + updateEmbed(embed); + } + + function deleteField(index) { + embed.fields.splice(index, 1); + updateEmbed(embed); + fields -= 1; + generateInputFields(fields); + } + + function addField() { + embed.fields.push({ inline: true }); + fields += 1; + generateInputFields(fields); + } + + function updateTitle(value) { + embed.title = value || ''; + updateEmbed(embed); + } + + function updateUrl(value) { + embed.url = value || ''; + updateEmbed(embed); + } + + function updateThumb(value) { + embed.thumb_url = value || false; + updateEmbed(embed); + } + + function updateDescription(value) { + embed.description = value || ''; + updateEmbed(embed); + } + + function updateColor(value) { + embed.color = value || false; + updateEmbed(embed); + } + + function updateAuthorName(value) { + embed.author.name = value || ''; + updateEmbed(embed); + } + + function updateAuthorUrl(value) { + embed.author.url = value || ''; + updateEmbed(embed); + } + + function updateAuthorIcon(value) { + embed.author.icon = value || ''; + updateEmbed(embed); + } + + function updateFooter(value) { + embed.footer = value || ''; + updateEmbed(embed); + } + + $('#form1').submit(e => { + e.preventDefault(); + }); + + // checking helpers + function addWarning(item, type, message) { + item.addClass('form-control-warning'); + item.removeClass('form-control-success'); + item.parent().addClass('has-warning'); + item.parent().removeClass('has-success'); + if ($(`#${type}-feedback`).length === 0) { + item.after(``); + } + } + + function addSuccess(item, type) { + item.removeClass('form-control-warning'); + item.addClass('form-control-success'); + item.parent().addClass('has-success'); + item.parent().removeClass('has-warning'); + $(`#${type}-feedback`).remove(); + } + + $('#title1').keyup(() => { + let item = $('#title1'); + let title = item.val(); + + // preform checks + if (title.length === 0) { + addWarning(item, 'title', 'title cannot be empty'); + } else { + addSuccess(item, 'title'); + // update + updateTitle(title); + } + + }); + + $('#url1').keyup(() => { + let item = $('#url1'); + let url = item.val(); + + if (number == "69") { + addWarning(item, 'url', 'invalid url'); + } else { + addSuccess(item, 'url'); + // update + updateUrl(url); + } + + + }); + + $('#icon1').keyup(() => { + let item = $('#icon1'); + let icon = item.val(); + + if (number == "69") { + addWarning(item, 'icon', 'invalid url'); + } else { + addSuccess(item, 'icon'); + // update + updateThumb(icon); + } + }); + + $('#description1').keyup(() => { + let item = $('#description1'); + let description = item.val(); + addSuccess(item, 'description'); + // update + updateDescription(description); + }); + + $('#color1').change(() => { + updateColor($('#color1').val()); + }); + + $('#author_name1').keyup(() => { + let item = $('#author_name1'); + let author_name = item.val(); + + addSuccess(item, 'author_name1'); + // update + updateAuthorName(author_name); + }); + + $('#author_url1').keyup(() => { + let item = $('#author_url1'); + let author_url = item.val(); + + if (number == "69") { + addWarning(item, 'author_url', 'invalid Url'); + } else { + addSuccess(item, 'author_url'); + // update + updateAuthorUrl(author_url); + } + }); + + $('#author_icon1').keyup(() => { + let item = $('#author_icon1'); + let author_icon = item.val(); + + if (number == "69") { + addWarning(item, 'author_icon', 'not a valid url'); + } else { + addSuccess(item, 'author_icon'); + // update + updateAuthorIcon(author_icon); + } + }); + + $('#footer1').keyup(() => { + let item = $('#footer1'); + let footer = item.val(); + + addSuccess(item, 'footer'); + // update + updateFooter(footer); + }); +}); \ No newline at end of file diff --git a/dashboard/static/js/report.js b/dashboard/static/js/report.js new file mode 100644 index 00000000..3d3b60ae --- /dev/null +++ b/dashboard/static/js/report.js @@ -0,0 +1,58 @@ +window.onload = () => { + + if (window.location.search.includes('full-screen=true')) document.body.classList.add('full-screen'); + const loader = window.top.document.querySelector('.loader'); + if (loader) loader.style.display = 'none'; + document.querySelector('form').addEventListener('submit', e => { + e.preventDefault(); + + let reported_name = document.getElementsByName('reported_name')[0], + reported_id = document.getElementsByName('reported_id')[0], + report = document.getElementsByName('report')[0], + proof = document.getElementsByName('proof')[0]; + + + + if (!report || !report.value) return report.focus(); + +const understand = document.getElementById("checkboxL"); + + + if (understand.checked == true){ +var v = grecaptcha.getResponse(); +if(v.length == 0){ + document.getElementById('captcha').innerHTML="Invalid Captcha Attempt."; + return false; +} + if(v.length != 0){; + + + + document.body.classList.add('done'); + fetch('/report', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + type: 'report', + name: username || 'name not given', + id: userID || 'not provided', + reported_user: reported_name.value, + reported_id: reported_id.value, + reason: report.value, + proof: proof.value, + }) + }) + .then(res => res.ok && document.body.classList.add('done')); + } + +} else { + + document.getElementById('iunderstand').innerHTML="Missing Fields"; + return false; + +} + }); + +} + + \ No newline at end of file diff --git a/dashboard/static/js/scroll.js b/dashboard/static/js/scroll.js new file mode 100644 index 00000000..e69de29b diff --git a/dashboard/static/libs/color-picker/LICENSE b/dashboard/static/libs/color-picker/LICENSE new file mode 100644 index 00000000..143f490b --- /dev/null +++ b/dashboard/static/libs/color-picker/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2020 Taufik Nurrohman + + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dashboard/static/libs/color-picker/color-picker.min.css b/dashboard/static/libs/color-picker/color-picker.min.css new file mode 100644 index 00000000..96c86823 --- /dev/null +++ b/dashboard/static/libs/color-picker/color-picker.min.css @@ -0,0 +1,129 @@ +.color-picker, +.color-picker *, +.color-picker ::after, +.color-picker ::before, +.color-picker::after, +.color-picker::before { + box-sizing: border-box; +} +.color-picker { + position: absolute; + top: 0; + left: 0; + z-index: 9999; + box-shadow: 1px 3px 6px rgba(0, 0, 0, 0.5); +} +.color-picker > div { + display: flex; + height: 10em; + border: 1px solid #000; + color: #000; +} +.color-picker > div * { + border-color: inherit; + color: inherit; +} +.color-picker i { + font: inherit; + font-size: 12px; +} +.color-picker\:a, +.color-picker\:h, +.color-picker\:sv { + background-size: 100% 100%; + position: relative; +} +.color-picker\:a, +.color-picker\:h { + width: 1.5em; + border-left: 1px solid; + cursor: ns-resize; + overflow: hidden; +} +.color-picker\:a div, +.color-picker\:h div, +.color-picker\:sv div { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} +.color-picker\:a i, +.color-picker\:h i { + display: block; + height: 0.5em; + position: absolute; + top: -0.25em; + right: 0; + left: 0; + z-index: 2; +} +.color-picker\:a i::before, +.color-picker\:h i::before { + display: block; + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 0.25em solid; + border-top-color: transparent; + border-bottom-color: transparent; +} +.color-picker\:sv { + width: 10em; + cursor: crosshair; + overflow: hidden; +} +.color-picker\:sv i { + display: block; + width: 0.75em; + height: 0.75em; + position: absolute; + top: -0.375em; + right: -0.375em; + z-index: 2; +} +.color-picker\:sv i::before { + display: block; + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 1px solid #fff; + border-radius: 100%; + box-shadow: 0 0 2px #000; +} +.color-picker\:a div { + z-index: 2; +} +.color-picker\:a div + div { + background-image: linear-gradient(45deg, #ddd 25%, transparent 25%, transparent 75%, #ddd 75%, #ddd 100%), linear-gradient(45deg, #ddd 25%, #fff 25%, #fff 75%, #ddd 75%, #ddd 100%); + background-size: 0.5em 0.5em; + background-position: 0 0, 0.25em 0.25em; + z-index: 1; +} +.color-picker\:h div { + background-image: linear-gradient(to top, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%); +} +.color-picker\:sv div + div { + background-image: linear-gradient(to right, #fff, rgba(255, 255, 255, 0)); +} +.color-picker\:sv div + div + div { + background-image: linear-gradient(to top, #000, rgba(0, 0, 0, 0)); +} +.color-picker\:a, +.color-picker\:h, +.color-picker\:sv { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; +} \ No newline at end of file diff --git a/dashboard/static/libs/color-picker/color-picker.min.js b/dashboard/static/libs/color-picker/color-picker.min.js new file mode 100644 index 00000000..2be92f75 --- /dev/null +++ b/dashboard/static/libs/color-picker/color-picker.min.js @@ -0,0 +1,323 @@ +/*! + * ============================================================== + * COLOR PICKER 2.1.6 + * ============================================================== + * Author: Taufik Nurrohman + * License: MIT + * -------------------------------------------------------------- + */ +((e, t, n) => { + let r = t.documentElement, + i = "HEX", + o = "top", + u = "right", + c = "left", + l = "px", + f = e.setTimeout, + s = ["touchstart", "mousedown"], + a = ["touchmove", "mousemove"], + d = ["orientationchange", "resize"], + h = ["touchend", "mouseup"]; + function p(e) { + let t, + n, + r, + i, + o, + u, + c, + l, + f = +e[0], + s = +e[1], + a = +e[2]; + switch (((u = a * (1 - s)), (c = a * (1 - (o = 6 * f - (i = Math.floor(6 * f))) * s)), (l = a * (1 - (1 - o) * s)), (i = i || 0), (c = c || 0), (l = l || 0), i % 6)) { + case 0: + (t = a), (n = l), (r = u); + break; + case 1: + (t = c), (n = a), (r = u); + break; + case 2: + (t = u), (n = a), (r = l); + break; + case 3: + (t = u), (n = c), (r = a); + break; + case 4: + (t = l), (n = u), (r = a); + break; + case 5: + (t = a), (n = u), (r = c); + } + return [L(255 * t), L(255 * n), L(255 * r), w(e[3]) ? +e[3] : 1]; + } + function g(e) { + let t, + n, + r = +e[0] / 255, + i = +e[1] / 255, + o = +e[2] / 255, + u = Math.max(r, i, o), + c = Math.min(r, i, o), + l = u, + f = u - c; + if (((n = 0 === u ? 0 : f / u), u === c)) t = 0; + else { + switch (u) { + case r: + t = (i - o) / f + (i < o ? 6 : 0); + break; + case i: + t = (o - r) / f + 2; + break; + case o: + t = (r - i) / f + 4; + } + t /= 6; + } + return [t, n, l, w(e[3]) ? +e[3] : 1]; + } + function v(e, t) { + let n = t.touches ? t.touches[0].clientX : t.clientX, + r = t.touches ? t.touches[0].clientY : t.clientY, + i = E(e); + return [n - i[0], r - i[1]]; + } + function b(e, t) { + if (e === t) return e; + for (; (e = e.parentElement) && e !== t; ); + return e; + } + function m(e) { + e && e.preventDefault(); + } + function C(e, t, n) { + for (let r = 0, i = t.length; r < i; ++r) e.removeEventListener(t[r], n, !1); + } + function k(e, t, n) { + for (let r = 0, i = t.length; r < i; ++r) e.addEventListener(t[r], n, !1); + } + function y(e) { + return "function" == typeof e; + } + function w(e) { + return void 0 !== e && null !== e; + } + function x(e) { + return "string" == typeof e; + } + function E(t) { + let n, i, o; + return t === e ? ((n = e.pageXOffset || r.scrollLeft), (i = e.pageYOffset || r.scrollTop)) : ((n = (o = t.getBoundingClientRect()).left), (i = o.top)), [n, i]; + } + function P(t) { + return t === e ? [e.innerWidth, e.innerHeight] : [t.offsetWidth, t.offsetHeight]; + } + function H(e, t, n) { + e.style[t] = n; + } + function M(e, t) { + return e < t[0] ? t[0] : e > t[1] ? t[1] : e; + } + function O(e, t) { + return parseInt(e, t || 10); + } + function X(e, n, r) { + return (e = t.createElement(e)), n && n.appendChild(e), r && (e.className = r), e; + } + function L(e) { + return Math.round(e); + } + function Y(e, t) { + return e.toString(t); + } + ((e) => { + (e[i] = (e) => { + if (x(e)) { + let t = (e = e.trim()).length; + if ((4 !== t && 7 !== t) || "#" !== e[0]) { + if ((5 === t || 9 === t) && "#" === e[0] && /^#([a-f\d]{3,4}){1,2}$/i.test(e)) + return 5 === t ? [O(e[1] + e[1], 16), O(e[2] + e[2], 16), O(e[3] + e[3], 16), O(e[4] + e[4], 16) / 255] : [O(e[1] + e[2], 16), O(e[3] + e[4], 16), O(e[5] + e[6], 16), O(e[7] + e[8], 16) / 255]; + } else if (/^#([a-f\d]{3}){1,2}$/i.test(e)) return 4 === t ? [O(e[1] + e[1], 16), O(e[2] + e[2], 16), O(e[3] + e[3], 16), 1] : [O(e[1] + e[2], 16), O(e[3] + e[4], 16), O(e[5] + e[6], 16), 1]; + return [0, 0, 0, 1]; + } + return "#" + ("000000" + Y(+e[2] | (+e[1] << 8) | (+e[0] << 16), 16)).slice(-6) + (w(e[3]) && e[3] < 1 ? Y(L(255 * e[3]) + 65536, 16).substr(-2) : ""); + }), + (e.instances = {}), + (e.state = { class: "color-picker", color: i, parent: null }), + (e.version = "2.1.6"); + })( + (e.CP = function (n, O) { + if (!n) return; + let L = this, + Y = e.CP, + I = {}, + N = Object.assign({}, Y.state, x(O) ? { color: O } : O || {}), + T = N.class, + W = X("div", 0, T); + if (n.CP) return L; + if (!(L instanceof Y)) return new Y(n, O); + (Y.instances[n.id || n.name || Object.keys(Y.instances).length] = L), (n.CP = 1), (L.visible = !1); + let $, + z, + B, + D, + R = t.body, + S = le(), + q = g(S), + A = X("div", W), + F = X("div", A, T + ":sv"), + G = X("div", A, T + ":h"), + J = X("div", A, T + ":a"), + K = X("div", F), + Q = (X("div", F), X("div", F), X("i", F)), + U = (X("div", G), X("i", G)), + V = X("div", J), + Z = (X("div", J), X("i", J)), + _ = 0, + ee = 0, + te = 0, + ne = 0, + re = 0, + ie = 0; + function oe(e) { + if (I.focus) ue("focus", S); + else { + let t = e.target; + n === b(t, n) ? !ce() && $(N.parent) : z(); + } + } + function ue(e, t) { + if (!w(I[e])) return L; + for (let n = 0, r = I[e].length; n < r; ++n) I[e][n].apply(L, t); + return L; + } + function ce() { + return W.parentNode; + } + function le(e) { + let t, + r = Y[y(Y[N.color]) ? N.color : i]; + return (t = n.dataset.color) ? (w(e) ? (n.dataset.color = r(t)) : r(t)) : (t = n.value) ? (w(e) ? (n.value = r(t)) : r(t)) : (t = n.textContent) ? (w(e) ? (n.textContent = r(t)) : r(t)) : w(e) ? void 0 : [0, 0, 0, 1]; + } + !(function i(y, x) { + (q = g((S = le()))), + y || ((x || N.parent || R).appendChild(W), (L.visible = !0)), + ($ = (e) => (i(0, e), ue("enter", S), L)), + (z = () => { + let n = ce(); + return n && (n.removeChild(W), (L.current = null), (L.visible = !1)), C(F, s, ge), C(G, s, ve), C(J, s, be), C(t, a, he), C(t, h, pe), C(e, d, D), ue("exit", S), L; + }), + (B = (t) => { + let i = P(e), + u = P(r), + f = i[0] - u[0], + s = i[1] - r.clientHeight, + a = E(e), + d = E(n), + h = P(W), + p = h[0], + g = h[1], + v = d[0] + a[0], + b = d[1] + a[1] + P(n)[1]; + if ("object" == typeof t) w(t[0]) && (v = t[0]), w(t[1]) && (b = t[1]); + else { + let e = a[0], + t = a[1], + n = a[0] + i[0] - p - f, + r = a[1] + i[1] - g - s; + (v = M(v, [e, n]) >> 0), (b = M(b, [t, r]) >> 0); + } + return H(W, c, v + l), H(W, o, b + l), ue("fit", S), L; + }), + (D = () => B()); + let j = P(F), + O = j[0], + X = j[1], + Y = P(Q), + T = Y[0], + A = Y[1], + fe = P(G)[1], + se = P(U)[1], + ae = P(J)[1], + de = P(Z)[1]; + function he(e) { + ne && + (function (e) { + let t = v(F, e), + n = M(t[0], [0, O]), + r = M(t[1], [0, X]); + (q[1] = 1 - (O - n) / O), (q[2] = (X - r) / X), me(); + })(e), + re && + (function (e) { + (q[0] = (fe - M(v(G, e)[1], [0, fe])) / fe), me(); + })(e), + ie && + (function (e) { + (q[3] = (ae - M(v(J, e)[1], [0, ae])) / ae), me(); + })(e), + (S = p(q)), + (ne || re || ie) && (ue(_ || ee || te ? "start" : "drag", S), ue("change", S)), + (_ = ee = te = 0); + } + function pe(e) { + S = p(q); + let t = e.target, + r = n === b(t, n), + i = W === b(t, W); + (L.current = null), r || i ? i && (ne || re || ie) && ue("stop", S) : I.blur ? ue("blur", S) : ce() && z(), (ne = re = ie = 0); + } + function ge(e) { + (L.current = F), (_ = ne = 1), he(e), m(e); + } + function ve(e) { + (L.current = G), (ee = re = 1), he(e), m(e); + } + function be(e) { + (L.current = J), (te = ie = 1), he(e), m(e); + } + function me() { + var e; + w((e = q)[1]) && H(Q, u, O - T / 2 - O * +e[1] + l), w(e[2]) && H(Q, o, X - A / 2 - X * +e[2] + l), w(e[0]) && H(U, o, fe - se / 2 - fe * +e[0] + l), w(e[3]) && H(Z, o, ae - de / 2 - ae * +e[3] + l); + let t = p(q), + n = p([q[0], 1, 1]); + H(K, "backgroundColor", "rgb(" + n[0] + "," + n[1] + "," + n[2] + ")"), H(V, "backgroundImage", "linear-gradient(rgb(" + t[0] + "," + t[1] + "," + t[2] + "),transparent)"); + } + y + ? (k(n, s, oe), + f(() => { + ue("change", S); + }, 1)) + : (k(F, s, ge), k(G, s, ve), k(J, s, be), k(t, a, he), k(t, h, pe), k(e, d, D), B()), + (L.get = () => le()), + (L.set = (e, t, n, r) => ((q = g([e, t, n, r])), me(), L)), + me(); + })(1), + (L.color = (e, t, n, r) => Y[y(Y[N.color]) ? N.color : i]([e, t, n, r])), + (L.current = null), + (L.enter = $), + (L.exit = z), + (L.fire = ue), + (L.fit = B), + (L.hooks = I), + (L.off = function (e, t) { + if (!w(e)) return (I = {}), L; + if (w(I[e])) + if (w(t)) { + for (let n = 0, r = I[e].length; n < r; ++n) t === I[e][n] && I[e].splice(n, 1); + 0 === j && delete I[e]; + } else delete I[e]; + return L; + }), + (L.on = function (e, t) { + return w(I[e]) || (I[e] = []), w(t) && I[e].push(t), L; + }), + (L.pop = () => (n.CP ? (delete n.CP, C(n, s, oe), z(), ue("pop", S)) : L)), + (L.self = W), + (L.source = n), + (L.state = N), + (L.value = (e, t, n, r) => (L.set(e, t, n, r), ue("change", [e, t, n, r]))); + }) + ); +})(window, document); \ No newline at end of file diff --git a/dashboard/static/logo.png b/dashboard/static/logo.png new file mode 100644 index 00000000..8f3b3ab3 Binary files /dev/null and b/dashboard/static/logo.png differ diff --git a/dashboard/static/media/gui.png b/dashboard/static/media/gui.png new file mode 100644 index 00000000..c524ac8c Binary files /dev/null and b/dashboard/static/media/gui.png differ diff --git a/dashboard/static/media/json.png b/dashboard/static/media/json.png new file mode 100644 index 00000000..52f60d2a Binary files /dev/null and b/dashboard/static/media/json.png differ diff --git a/dashboard/static/premium/customcommands.jpg b/dashboard/static/premium/customcommands.jpg new file mode 100644 index 00000000..e79d44f6 Binary files /dev/null and b/dashboard/static/premium/customcommands.jpg differ diff --git a/dashboard/static/premium/reports.JPG b/dashboard/static/premium/reports.JPG new file mode 100644 index 00000000..f4008983 Binary files /dev/null and b/dashboard/static/premium/reports.JPG differ diff --git a/dashboard/static/premium/suggestions.jpg b/dashboard/static/premium/suggestions.jpg new file mode 100644 index 00000000..1a66b8f5 Binary files /dev/null and b/dashboard/static/premium/suggestions.jpg differ diff --git a/dashboard/static/premium/tickets.JPG b/dashboard/static/premium/tickets.JPG new file mode 100644 index 00000000..adf69185 Binary files /dev/null and b/dashboard/static/premium/tickets.JPG differ diff --git a/dashboard/static/svg/dashboard.svg b/dashboard/static/svg/dashboard.svg new file mode 100644 index 00000000..82aaf3a9 --- /dev/null +++ b/dashboard/static/svg/dashboard.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/dashboard/static/svg/fire.svg b/dashboard/static/svg/fire.svg new file mode 100644 index 00000000..8209a26d --- /dev/null +++ b/dashboard/static/svg/fire.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/dashboard/static/svg/lines.svg b/dashboard/static/svg/lines.svg new file mode 100644 index 00000000..5a8e5fa9 --- /dev/null +++ b/dashboard/static/svg/lines.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dashboard/static/thumb.png b/dashboard/static/thumb.png new file mode 100644 index 00000000..44ab6ff7 Binary files /dev/null and b/dashboard/static/thumb.png differ diff --git a/dashboard/templates/404.ejs b/dashboard/templates/404.ejs new file mode 100644 index 00000000..f7fc2f27 --- /dev/null +++ b/dashboard/templates/404.ejs @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Pogy - 404 + + + + + + + + + + + + + + +
+
+ + +

404

+

NOT FOUND

+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/dashboard/templates/appeal.ejs b/dashboard/templates/appeal.ejs new file mode 100644 index 00000000..30f5c5d7 --- /dev/null +++ b/dashboard/templates/appeal.ejs @@ -0,0 +1,34 @@ +<%- include("partials/head", { bot, user, path, title: "Pogy - Dashboard" }) %> +
+ +

Select a server to Apply to

+ +
+<% user.guilds.forEach(guild => { %> + +<% if (!bot.guilds.cache.get(guild.id)) { + return + } +%> + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> +
+
+<% guild.name %> +

<%= guild.name %>

+
+ <% if (bot.guilds.cache.get(guild.id)) { %> + Apply + <% } %> +
+ <% }); %> +
+ + + +<%- include("partials/footer") %> diff --git a/dashboard/templates/appealMain.ejs b/dashboard/templates/appealMain.ejs new file mode 100644 index 00000000..6e499201 --- /dev/null +++ b/dashboard/templates/appealMain.ejs @@ -0,0 +1,132 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Apply"}) %> + + + + + + +
+
+ +
+ + + + <% if (alert) { %> +

<%= id %>

+ + + + + +<% } %> + + <% if (!app || !app.questions.length || app.questions.length === 0 || app.questions.length < 1) { %> +

The current guild does not have any application at the moment.

+ <% } else { %> + + <% if (!bot.channels.cache.has(app.appLogs)) { %> +

The app Log channel was deleted which is the reason you can't apply to the current form. Please make sure to let an admin know.

+ <% } else if(app.appToggle === false) { %> + +

The current guild's application Status is closed. Come back later.

+ + + <% } else { %> + <% for (let i = 0; app.questions.length > i; i++) {%> + +
+ Question #<%= i + 1 %> +

<%= app.questions[i]%>

+ + + +
+ + <% } %> +
+ +
+
+
+
+
+
+
+
+
+
+ + + +
+
+ <% } %> + <% } %> +
+
+ + + + + + + + <%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/color.ejs b/dashboard/templates/color.ejs new file mode 100644 index 00000000..19907a4a --- /dev/null +++ b/dashboard/templates/color.ejs @@ -0,0 +1,6 @@ + <% var url = urlSite; + let color = new URL(url).searchParams.get("color") + if(!color|| color === null) color = `#000000` + %> + +

soon

\ No newline at end of file diff --git a/dashboard/templates/contact.ejs b/dashboard/templates/contact.ejs new file mode 100644 index 00000000..b8d531ad --- /dev/null +++ b/dashboard/templates/contact.ejs @@ -0,0 +1,122 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Contact"}) %> + + + + + + <% if (user) { %> + +
+
+
+ +
+ Discord Name + + + +
+
+ Email (optional) + + +
+ +
+ Message + + +
+
+ +
+
+
+
+
+
+
+
+
+
+ + + +
+
+ +
+
+ <% } else { %> +
+
+
+ +
+ Discord Name + + +
+
+ Email (optional) + + +
+
+ Message + + +
+
+

You must be logged in to contact us.

+ +
+
+
+ +
+ +
+
+ +
+
+ <% } %> + + + + + + + <%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/dashboard.ejs b/dashboard/templates/dashboard.ejs new file mode 100644 index 00000000..a5b7f226 --- /dev/null +++ b/dashboard/templates/dashboard.ejs @@ -0,0 +1,94 @@ +<%- include("partials/head", { bot, user, path, title: "Pogy - Dashboard" }) %> +
+ +

SELECT A SERVER

+ +<% if (!userExists) { %> +
+

Hey <%= user.username%>!

+

Looks like you aren't in Pogy's Support Server. Join Here!

+
+ <% } %> + +
+<% user.guilds.forEach(guild => { + const permsOnGuild = new perms(guild.permissions); + if(!permsOnGuild.has("MANAGE_GUILD")) { + return + } +%> +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + <% if (bot.guilds.cache.get(guild.id)) { %> +
+
+<% guild.name %> +

<%= guild.name %>

+
+ Dashboard +
+ <% } %> + + <% }); %> + <% user.guilds.forEach(guild => { + const permsOnGuild = new perms(guild.permissions); + if(!permsOnGuild.has("MANAGE_GUILD")) { + return + } +%> +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + <% if (!bot.guilds.cache.get(guild.id)) { %> +
+
+<% guild.name %> +

<%= guild.name %>

+
+ Add Bot +
+ <% } %> + + <% }); %> +
+ + + +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/embeds.ejs b/dashboard/templates/embeds.ejs new file mode 100644 index 00000000..a6279e82 --- /dev/null +++ b/dashboard/templates/embeds.ejs @@ -0,0 +1,130 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Embed Builder", twitter, url, image }) %> + +

Embed - FAQ

+ +
+ + + + + + + + +
+ +
+ + Why is my Embed custom command not saving? + + + +

Your custom commands can fail to save for many reasons:

+
    +
  • 1- Your custom command already exists or is a existing bot command.
  • +
  • 2- The bot fails to recieve the JSON or guild, or the command name.
  • +
  • 3- You exceed the custom command limit in your guild.
  • +
+
+ +
+ + + Why is my webhook not sending? + + + +

Your webhook will fail if the given webhook is invalid, or there was an error in the JSON given.

+
+ +
+ + How do I send the embed to a channel of my choice? + + + +

First, simply fill out the embed that you want, then press on the send button which is located at the bottom right of the page. Once clicked, you will have the option of sending it to a channel of your choice, click on one of these channels to send your embed.

+
+
+
+<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/faq.ejs b/dashboard/templates/faq.ejs new file mode 100644 index 00000000..248cf572 --- /dev/null +++ b/dashboard/templates/faq.ejs @@ -0,0 +1,125 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - FAQ", twitter, url, image }) %> + +

Frequently Asked Questions

+ +
+ + + + + + + + +
+ +
+ + How do I change the bot Prefix? + + + +

You can change Pogy's default Prefix with p!setPrefix <new Prefix> or by heading to the dashboard's main settings page.

+
+ +
+ + + How do I invite Pogy to my Server? + + + +

Simply visit https://pogy.xyz in your browser, then authorize the application.

+
+ +
+ + How do I use the embed Builder? + + + +

First, simply fill out the embed that you want, then press on the send button which is located at the bottom right of the page. Once clicked, you will have the option of sending it to a channel of your choice, to save it as a custom command, or send it as a webhook.

+
+
+
+<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/features.ejs b/dashboard/templates/features.ejs new file mode 100644 index 00000000..40aa2e86 --- /dev/null +++ b/dashboard/templates/features.ejs @@ -0,0 +1,1186 @@ +<%- include("partials/head", { bot, user, path, title: "Pogy - Commands" }) %> + + + + + + + + <% var url = urlSite; + let prefix = new URL(url).searchParams.get("prefix") + if(!prefix || prefix === null) prefix = `p!` + if(prefix.length > 5) prefix = `p!` %> + + + + + + + +

Soon

+ + + + + + + + <%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/index.ejs b/dashboard/templates/index.ejs new file mode 100644 index 00000000..040a8a22 --- /dev/null +++ b/dashboard/templates/index.ejs @@ -0,0 +1,731 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Home", twitter, url, image }) %> + + + +
+ + +<% if (user) { %> + + + + +
+
+
+
+
+

POGY

+

The best Multipurpose
Discord Bot

+

Serving <%= bot.guilds.cache.reduce((a, g) => a + g.memberCount, 0) %> members in <%= bot.guilds.cache.size %> guilds servers.

+ +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+

Advanced Logging

+

With pogy you can fully customize logging. Pogy lets you set your own log settings from member logging to command and voice logging!

+
+
+
+
+
+

Design Embeds

+

Pogy Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

+
+
+ +
+
+
+

Create Applications

+

Manage your server applications with Pogy!

+
+
+
+
+
+

Reaction Roles

+

Create your own reaction roles directly from Pogy's Dashboard!

+
+
+
+
+ + + + + + + + +<% } else { %> + + + + + +
+ +
+
+
+
+
+

POGY

+

The best Multipurpose
Discord Bot

+

Serving <%= bot.guilds.cache.reduce((a, g) => a + g.memberCount, 0) %> members in <%= bot.guilds.cache.size %> servers.

+ +
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+

Advanced Logging

+

With pogy you can fully customize logging. Pogy lets you set your own log settings from member logging to command and voice logging!

+
+
+
+
+
+

Design Embeds

+

Pogy Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

+
+
+ +
+
+
+

Create Applications

+

Manage your server applications with Pogy!

+
+
+
+
+
+

Reaction Roles

+

Create your own reaction roles directly from Pogy's Dashboard!

+
+
+ +
+
+ + +
+ + + + + + + + +<% } %> +
+ +
+
+ + + + + + + +<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/maintenance.ejs b/dashboard/templates/maintenance.ejs new file mode 100644 index 00000000..ec48ebde --- /dev/null +++ b/dashboard/templates/maintenance.ejs @@ -0,0 +1,156 @@ + + + + +Maintenance + + + +
+
+
+
+
+
+
+

Under maintenance

+

Pogy is undergoing maintenance. Please check back Later!

+

Maintenance mode is enabled which means you won't able to access the dashboard

+ +
+
+ + + + + + + \ No newline at end of file diff --git a/dashboard/templates/new/mainaltdetector.ejs b/dashboard/templates/new/mainaltdetector.ejs new file mode 100644 index 00000000..15fe6418 --- /dev/null +++ b/dashboard/templates/new/mainaltdetector.ejs @@ -0,0 +1,2255 @@ + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'category').size > 0) { %> + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + +
+ +
+ <% if (alert) { %> + +<% } %> +

Main Settings

+
+
+

Log Channel

+ + +
+
+

Account age ( 1 - 100 ) [d / days]

+ + +
+
+

Action

+ +
+
+

Whitelist certain User IDs (seperate with a comma)

+ + + + + + +
+ + + + +
+ + + + +
+ +
+ +<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> + +<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> + + + + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/mainapp.ejs b/dashboard/templates/new/mainapp.ejs new file mode 100644 index 00000000..4dd57e68 --- /dev/null +++ b/dashboard/templates/new/mainapp.ejs @@ -0,0 +1,2280 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ + + + <% if (alert) { %> + +<% } %> +
+

Server Applications

+
+ +
+ +
+
+

Main Settings

+

Pick Your application Settings in the guild.

+ +
+
+

Application Log

+ +

Add role if accepted

+ + +

Remove Role if Declined

+ + +
+

Application Status

+<% if(app.appToggle === true) { %> + +<% } else { %> + +<% } %> +
+

DM user when accepted / declined

+<% if(app.dm === true) { %> + +<% } else { %> + +<% } %> +
+
+ +
+ + + +
+ +
+
+ + +
+ + + +
+
+

Available Questions

+

Displays all available questions.

To add a question use <%= settings.prefix %>addquestion [question]
To remove a question use <%= settings.prefix %>remquestion [number]

+
+
+<% if(app.questions.length) {%> + <% for (let i = 0; app.questions.length > i; i++) { %> + +
+

Question <%= i + 1 %>

+

<%= app.questions[i] %>

+
+ + <% } %> + <% } else { %> +

No questions found.

+ <% } %> + +
+
+
+ + + + +
+ + +
+
+ +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/mainautomod.ejs b/dashboard/templates/new/mainautomod.ejs new file mode 100644 index 00000000..441ed8f0 --- /dev/null +++ b/dashboard/templates/new/mainautomod.ejs @@ -0,0 +1,869 @@ + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + + +
+ +
+ +
+ +
+ + + + + + + +<%- include("../partials/footer") %> + \ No newline at end of file diff --git a/dashboard/templates/new/mainautorole.ejs b/dashboard/templates/new/mainautorole.ejs new file mode 100644 index 00000000..92d62e40 --- /dev/null +++ b/dashboard/templates/new/mainautorole.ejs @@ -0,0 +1,2528 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.roles.cache.filter(m => !m.managed && m.name !== "@everyone").size) { %> + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ + + + <% if (alert) { %> + +<% } %> +
+

Auto Role

+
+ +
+ +
+
+
+
+
Auto Role - Automatically give the role on join.
+ +
+
+ +
+
+ +

This feature will automatically add the specified role
every time a member joins your guild.

+
+

Role

+
+<% function hexToRgb(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; + } + %> + +
+ +
+ +
+
+ +
+ <% if(settings.autoroleToggle === true){ %> + + + <% } else { %> +
+
+ + <% } %> +
+ + + + + + +
+ + +
+
+
+
+
Sticky Role - give the role if had
+ +
+
+ +
+
+ +

This feature will automatically add the specified role
if the user had it when he left.

+
+

Role

+
+ +
+ +
+ +
+
+
+ <% if(sticky.stickyroleToggle == "true"){ %> + + + <% } else { %> +
+
+ + <% } %> +
+ + +
+
+
+ + + + + + + +
+
+ +<% } else { %> +

Make sure the guild has 1 Role, So please create a channel before accessing our dashboard

+<% } %> + +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/maincommands.ejs b/dashboard/templates/new/maincommands.ejs new file mode 100644 index 00000000..9737efd1 --- /dev/null +++ b/dashboard/templates/new/maincommands.ejs @@ -0,0 +1,869 @@ + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + + +
+ +
+ +
+ +
+ + + + + + + +<%- include("../partials/footer") %> + \ No newline at end of file diff --git a/dashboard/templates/new/mainembeds.ejs b/dashboard/templates/new/mainembeds.ejs new file mode 100644 index 00000000..d818bb1d --- /dev/null +++ b/dashboard/templates/new/mainembeds.ejs @@ -0,0 +1,283 @@ + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + + + + + + + Pogy - Embed Builder + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

GUI

+
+
+

JSON

+
+
+ + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + + + + + +
+
+

Embed Colour

+

Pick the embed colour

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  +

+ Pogy✓ BOT + +

+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
poggers.
+
+
+
There is an error
+
+ +
+
+
+
+
Select a channel
+ + <% guild.channels.cache.filter((ch) => ch.type === "text").forEach((ch) => { %> +
+ + <%= ch.name %> +
+ <% }); %> +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
Or Save as Custom Command
+
+ + +
+
Or Send to webhook
+ +
+ + +
+
+
+
+
+ + +Pogy - Embed +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> diff --git a/dashboard/templates/new/mainlevels.ejs b/dashboard/templates/new/mainlevels.ejs new file mode 100644 index 00000000..d6977eaa --- /dev/null +++ b/dashboard/templates/new/mainlevels.ejs @@ -0,0 +1,878 @@ + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + + +
+ +
+ +
+ +<% } else { %> +

Make sure the guild has 1 channel.

+<% } %> + + + +
+ + + + + + + +<%- include("../partials/footer") %> + \ No newline at end of file diff --git a/dashboard/templates/new/mainlogging.ejs b/dashboard/templates/new/mainlogging.ejs new file mode 100644 index 00000000..cb107b38 --- /dev/null +++ b/dashboard/templates/new/mainlogging.ejs @@ -0,0 +1,2730 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + +<% if(guild.roles.cache.filter(m => !m.managed && m.name !== "@everyone").size) { %> + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ <% if (alert) { %> + +<% } %> +
+

Server Logging

+
+ +
+

- TIP: keep the embed color to #000000 for the default logging colors. +

+
+

Moderation Logging

+

Log actions ran by moderation commands

+
    +
  • +
    +
    +<% if(log.moderation.ban == "true") {%> + +<% } else { %> + +<% } %> + + + +
  • +
  • + <% if(log.moderation.kick== "true") {%> + + + <% } else { %> + + <% } %> + + +
  • + + +
  • + <% if(log.moderation.role == "true") {%> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.moderation.purge == "true") {%> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.moderation.lock == "true") {%> + + <% } else { %> + + <% } %> + + +
  • + + +
  • + <% if(log.moderation.warns== "true") {%> + + <% } else { %> + + <% } %> + +
  • + + +
  • +<% if(log.moderation.mute== "true") {%> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.moderation.slowmode == "true") {%> + + <% } else { %> + + <% } %> + +
  • +
  • + + <% if(log.moderation.nicknames == "true") {%> + + <% } else { %> + + <% } %> + +
  • +
+
+
+

Log Channel

+ +

Ignore Channel

+ +

Ignore Role

+ +
+ + +
+ +
+
+ +
+ + +
+
+
 
+ +
+ Enable +
+<% if(log.moderation.toggle == "true"){%> + +<% } else { %> + +<% } %> +
+ +
+
+ +
+ +
+ +
+
+
+ + +
+
+

Server Events

+ +

Log actions ran by changes by the guild.

+
+
+
    +
  • + <% if(log.server_events.channel_created == "true") { %> + + <% } else { %> + + + <% } %> + +
  • + + +
  • + <% if(log.server_events.channel_update== "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.server_events.channel_delete == "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.server_events.role_create == "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.server_events.role_update == "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.server_events.guild_update == "true") { %> + + <% } else { %> + + <% } %> + +
  • + +
  • + <% if(log.server_events.emoji_update == "true") { %> + + <% } else { %> + + <% } %> + + +
  • + + +
    +
    +

    Voice Events

    +
  • + <% if(log.server_events.voice.join == "true") { %> + + <% } else { %> + + <% } %> + +
  • +
  • + <% if(log.server_events.voice.move == "true") { %> + + <% } else { %> + + <% } %> + +
  • +
  • + <% if(log.server_events.voice.leave == "true") { %> + + <% } else { %> + + <% } %> + +
  • +
    +
    +

    Member movement

    + + +
  • + <% if(log.server_events.member_join == "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + <% if(log.server_events.member_leave == "true") { %> + + <% } else { %> + + <% } %> + +
  • +
+ +
+
+ + + +
+ + +
+ +
+ +
+ + +
+ +
+
+
 
+ +
+ Enable +
+ <% if(log.server_events.toggle == "true") { %> + + <% } else { %> + + <% } %> +
+
+ +
+ +
+
+ +
+
+
+ +
+
+

Member Events

+

Log member actions

+
    +
  • + <% if(log.member_events.role_update == "true") { %> + + <% } else { %> + + <% } %> + +
  • + +
  • + <% if(log.member_events.name_change == "true") { %> + + <% } else { %> + + <% } %> + + +
  • + + +
+ +
+ + +
+ +
+
+ +
+ +
+
+
 
+ +
+ Enable +
+ <% if(log.member_events.toggle == "true") { %> + + <% } else { %> + + <% } %> +
+
+
+ +
+
+ +
+
+
+ +
+ + + + + +

Hello

+
+
+

Message Events

+
    + +<% if(log.message_events.deleted == "true") { %> +
  • + + + <% } else { %> + + <% } %> + +
  • + + + +
  • + +<% if(log.message_events.edited== "true") { %> + + + <% } else { %> + + <% } %> + +
  • + + + +
  • + +<% if(log.message_events.purged == "true") { %> + + <% } else { %> + + <% } %> + +
  • + + +
  • + +<% if(log.message_events.ignore == "true") { %> + + + <% } else { %> + + <% } %> + + +
  • + +
+ +
+ + +
+ +
+
+ +
+ +
+
+
 
+ +
+ Enable +
+ <% if(log.message_events.toggle == "true") { %> + + <% } else { %> + + <% } %> +
+
+
+ +
+
+ +
+
+ +
+ +
+ + + + + + + +
+
+ +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + +<% } else { %> +

Make sure the guild has 1 Role, So please create a normal Role before accessing our dashboard

+<% } %> + +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + \ No newline at end of file diff --git a/dashboard/templates/new/mainmembers.ejs b/dashboard/templates/new/mainmembers.ejs new file mode 100644 index 00000000..24a4eb6e --- /dev/null +++ b/dashboard/templates/new/mainmembers.ejs @@ -0,0 +1,1088 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + + + +
+
+ + + +
+

Member List [1 - <%= members.length %>]

+ +
+ + + + +
+
+ + + + + + + + + + +
Display Name:User Tag:Joined:Roles:
+
+ + +
+
+
+ + + + + + + + + + + + + +<%- include("../partials/footer") %> + + + \ No newline at end of file diff --git a/dashboard/templates/new/mainmoderation.ejs b/dashboard/templates/new/mainmoderation.ejs new file mode 100644 index 00000000..a864d457 --- /dev/null +++ b/dashboard/templates/new/mainmoderation.ejs @@ -0,0 +1,2790 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> +<% if(guild.roles.cache.filter(m => !m.managed && m.name !== "@everyone").size) { %> + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ + + + <% if (alert) { %> + +<% } %> +
+

Moderation Settings

+
+ +
+ +
+
+
+
+
Main Settings - Customise Main Mod Settings
+ +
+
+ +
+
+
+<% if(mod.delete_after_executed === "true"){ %> + +<% } else { %> + +<% } %> + +
+<% if(mod.delete_reply === "true"){ %> + +<% } else { %> + +<% } %> + +
+<% if(mod.include_reason === "true"){ %> + + <% } else { %> + +<% } %> + +
+ <% if(mod.remove_roles === "true"){ %> + + <% } else { %> + +<% } %> + +
+
+

Mute Role

+ +
+

Ban - DM settings

+<% if(mod.ban_action === "1") { %> + +<% } else if(mod.ban_action === "2") { %> + +<% } else if(mod.ban_action === "3") { %> + +<% } else if(mod.ban_action === "4") { %> + +<% } else { %> + +<% } %> + + + + +
+

Kick - DM settings

+<% if(mod.kick_action === "1") { %> + +<% } else if(mod.kick_action === "2") { %> + +<% } else if(mod.kick_action === "3") { %> + +<% } else if(mod.kick_action === "4") { %> + +<% } else { %> + +<% } %> + + +
+

Warn - DM settings

+<% if(mod.warn_action === "1") { %> + +<% } else if(mod.warn_action === "2") { %> + +<% } else if(mod.warn_action === "3") { %> + +<% } else if(mod.warn_action === "4") { %> + +<% } else { %> + +<% } %> + + +
+

Mute - DM settings

+<% if(mod.mute_action === "1") { %> + +<% } else if(mod.mute_action === "2") { %> + +<% } else if(mod.mute_action === "3") { %> + +<% } else if(mod.mute_action === "4") { %> + +<% } else { %> + +<% } %> + + + + + +
+ +
+ + + +
+ +
+ + + +
+
+ + +
+ + + +
+
+
+
+
Auto Punish - Punish Users through warns
+ +
+
+

Warn Amount (Max. 50)

+
+ +
+
+

Punishment

+ +<% if(mod.auto_punish.punishment === "1") { %> + +<% } else if(mod.auto_punish.punishment === "2") { %> + +<% } else if(mod.auto_punish.punishment === "3") { %> + +<% } else { %> + +<% } %> + +
+

DM settings

+<% if(mod.auto_punish.dm === "1") { %> + +<% } else if(mod.auto_punish.dm === "2") { %> + +<% } else if(mod.auto_punish.dm === "3") { %> + +<% } else { %> + +<% } %> + + + +
+ +
+ + + +
+ +
+<% if(mod.auto_punish.toggle === "true") { %> +
+
+ + + +
+
+<% } else { %> + +<% } %> + + +
+
+ + +
+ + +
+ +
+
+
+
+
+
Ban Message - DM The user once banned
+
+
+
+ +
+
+ +
+ + + +
+ + +
+<% if(mod.ban_message.toggle === "true") { %> +
+
+ + + +
+
+<% } else { %> + +<% } %> + + +
+
+ + +
+
+
+
+ +
+ +
+ + + + + + +
+ + +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + +<% } else { %> +

Make sure the guild has 1 Role, So please create a role before accessing our dashboard

+<% } %> + + + + + + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/mainpage.ejs b/dashboard/templates/new/mainpage.ejs new file mode 100644 index 00000000..669b3fca --- /dev/null +++ b/dashboard/templates/new/mainpage.ejs @@ -0,0 +1,2518 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ + + + <% if (alert) { %> + +<% } %> +
+

Bot Settings

+
+ +
+ +
+
+
+
+
Main Settings - Customise Pogy's Main Settings
+ +
+
+ +
+
+ +

Nickname

+

Change the bot's nickname in the current guild.

+ +
+
+ +
+
+ +

Prefix

+

Change the bot's prefix that triggers the bot.

+
+
+ +
+
+ +

Language

+

Change the Bot's Language.

+ + + + +
+ +
+ + + +
+ +
+ + + +
+
+ + +
+ + + +
+
+ +
+
+ +
+

<%= guild.memberCount %>

+

Server members

+
+ +
+
+
+

<%= guild.channels.cache.size %>

+

Channels

+
+
+
+
+

<%= guild.roles.cache.size - 1%>

+

Roles

+
+
+
+
+ <% if(settings.isPremium === "true") { %> +

Is Premium

+ <% } else { %> +

Not Premium

+ <% } %> +

Premium

+
+
+
+
+
+
Server Growth -Based on server members join dates
+ +
+ +
+
+ +
+

<%= join1 %>

+

Joins Today

+
+ +
+
+
+

<%= leave1 %>

+

Leaves Today

+
+
+
+
+

<%= join2 %>

+

Joins last 7 Days

+
+
+
+
+

<%= leave2 %>

+

Leaves last 7 Days

+
+
+
+
+
+
+
+ + + + + + + +
+
+ +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/mainreactionroles.ejs b/dashboard/templates/new/mainreactionroles.ejs new file mode 100644 index 00000000..00bd63a4 --- /dev/null +++ b/dashboard/templates/new/mainreactionroles.ejs @@ -0,0 +1,2464 @@ + + + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.roles.cache.filter(m => !m.managed && m.name !== "@everyone").size) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + + + +
+
+ + + + + + + +
+
+ + + + <% if (alert) { %> + +<% } %> +
+

🚀 Reaction Roles

+
+ +
+ +
+
+

Main Settings

+

Pick Your reaction Role Settings in the guild.

+ +
+
+

Reaction role Log

+ + +
+ + +
+ +
+
+ +
+ + +
+
+
 
+ +
+ RR Dms<% if(settings.isPremium == "false"){ %><% } %> +
+<% if(settings.reactionDM === true) { %> + +<% } else { %> + +<% } %> + +
+ +
+
+ +
+ +
+
+
+ +
+ + +

Reset Reaction Roles

+

Resets the reaction role database for this guild.

+
+
+

Please note that this will disable every reaction role in <%= guild.name %>, as this action is irreversible.

+ + +
+ +
+
+ + +
+
+

Send Reaction Role

+ + +
+
+

Channel

+ +
+

Message ID

+
+ +
+
+

Emoji

+ + + +
+

Role

+ +
+

Type

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + +
+
+
+ + + + +
+ +
+
+ +
+
+
+ +
+
+
+
Are You sure? This action cannot be undone
+
+ + +
+
+
+ + +
+ + +
+
+ +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> +<% } else { %> +

Make sure the guild has 1 Role, So please create a normal Role before accessing our dashboard

+<% } %> +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + + + + \ No newline at end of file diff --git a/dashboard/templates/new/mainreports.ejs b/dashboard/templates/new/mainreports.ejs new file mode 100644 index 00000000..386f0089 --- /dev/null +++ b/dashboard/templates/new/mainreports.ejs @@ -0,0 +1,2333 @@ + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + +
+ +
+ <% if (alert) { %> + +<% } %> +

Report Channel

+
+
Sets the Report Channel for the current Guild
+
+

Select Channel

+ +
+ +
+ + + + +
+ +
+

Additional Settings

+
+

Additional Customizations for the guild.

+
+ +

Report Color

+

Disable Issue Reports

+<% if(settings.report.disableIssue == "true") {%> + +<% } else { %> + +<% } %> + +

Disable User Reports

+ +<% if(settings.report.disableUser == "true") {%> + +<% } else { %> + +<% } %> +

<% if(settings.isPremium == "false"){ %>Enable report Upvotes

+<% } else { %> +

Enable report Upvotes

+<% } %> +<% if(settings.report.upvote == "true") {%> + +<% } else { %> + +<% } %> + + + + +
+ + +
+ + + + +
+ +
+ +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + + + + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + diff --git a/dashboard/templates/new/mainsuggestions.ejs b/dashboard/templates/new/mainsuggestions.ejs new file mode 100644 index 00000000..ae70c37d --- /dev/null +++ b/dashboard/templates/new/mainsuggestions.ejs @@ -0,0 +1,2444 @@ + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + +
+ +
+ <% if (alert) { %> + +<% } %> +

Suggestion Channel

+
+
Sets the suggestion Channel for the current Guild
+
+

Select Channel

+ +
+ +
+ + + + +
+ +
+

Additional Settings

+
+

Additional Customizations for the guild.

+
+ +

Log Channel

+
+ +
+

Allow Staff to decline / approve

+<% if(settings.suggestion.decline == "true") {%> + +<% } else { %> + +<% } %> + +

Delete Message after Suggestion

+ +<% if(settings.suggestion.deleteSuggestion == "true") {%> + +<% } else { %> + +<% } %> + + + + +
+ +

HELLOO :) you found a secret message, poggers

+<% if(settings.isPremium == "false"){ %> +

This is a Premium Feature

+ +
+
+

Customize Your Embed

+
+

  Embed Color

+
+

Embed Description

+ +0 characters remaining +
+
+

Embed Footer

+ +
+

Embed Timestamp

+<% if(settings.suggestion.timestamp == "true") {%> + +<% } else { %> + +<% } %> +

Choose your reaction

+<% if(settings.suggestion.reaction == "1") {%> +
+ + +
+
+ + +
+
+ + +
+<% } else if(settings.suggestion.reaction == "2") {%> +
+ + +
+
+ + +
+
+ + +
+<% } else if(settings.suggestion.reaction == "3") { %> +
+ + +
+
+ + +
+
+ + +
+<% } else { %> +
+ + +
+
+ + +
+
+ + +
+<% } %> + +
+ + +<% } else if(settings.isPremium == "true"){ %> +
+

Customize Your Embed

+
+

  Embed Color

+
+

Embed Description

+ +0 characters remaining +
+
+

Embed Footer

+ +
+

Embed Timestamp

+<% if(settings.suggestion.timestamp == "true") {%> + +<% } else { %> + +<% } %> +

Choose your reaction

+<% if(settings.suggestion.reaction == "1") {%> +
+ + +
+
+ + +
+
+ + +
+<% } else if(settings.suggestion.reaction == "2") {%> +
+ + +
+
+ + +
+
+ + +
+<% } else if(settings.suggestion.reaction == "3") { %> +
+ + +
+
+ + +
+
+ + +
+<% } else { %> +
+ + +
+
+ + +
+
+ + +
+<% } %> +
+ + +<% } %> +
+ + + + +
+ +
+<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + + + + + + + + +<%- include("../partials/footer") %> + + + + + + + diff --git a/dashboard/templates/new/maintickets.ejs b/dashboard/templates/new/maintickets.ejs new file mode 100644 index 00000000..ec6c927d --- /dev/null +++ b/dashboard/templates/new/maintickets.ejs @@ -0,0 +1,2446 @@ + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + +<% if(guild.roles.cache.filter(m => !m.managed && m.name !== "@everyone").size) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'category').size > 0) { %> + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> +
+
+
+ + + + +
+ <% if (alert) { %> + +<% } %> +

Main Settings

+
+

Welcome Message (Check Variables Here)

+ + + +
+

+ Embed Color

+

Ticket Logs

+ + +
+

Support Role

+ +
+

Ticket Category

+ +
+

Ticket Limit (1 - 5)

+ + +
+ +
+
+ +

<% if(ticket.ticketPing == "true") { %> + + + <% } else { %> + + <% } %>Ping @everyone

+ <% if(ticket.ticketType == "message") { %> + +

<% if(ticket.requireReason == "true") { %> + + + + <% } else { %> + + <% } %>Require Reason <%= settings.prefix %>ticket (reason)

+ <% } %> + +

<% if(ticket.ticketClose == "true") { %> + + + <% } else { %> + + <% } %>Allow Users to Close ticket  <% if(settings.isPremium == "false"){ %><% } %>

+
+
+
+ + + + + + +
+
+ + +<% if(ticket.ticketType == "reaction" && ticket.ticketCustom == "false") { %> +

Reaction Panel

+
+

  Embed Color

+

Reaction Title

+
+ +
+
+

Reaction description(Max 1024)

+ + +
+ +
+
+

<% if(ticket.ticketTimestamp == "true") { %> + + + <% } else { %> + + <% } %>  Reaction TimeStamp

+

+ <% if(!!ticket.ticketFooter === true) { %> + + + + + + <% } else { %> + + <% } %>  Reaction Footer <% if(settings.isPremium == "false"){ %><% } %>

+ + +
+
+
+

Reaction Channel

+ + +

Ticket Reaction  <% if(settings.isPremium == "false"){ %><% } %>

+ +
+
+ <% } else if(ticket.ticketType == "reaction" && ticket.ticketCustom == "true") { %> + +

Custom Message Reaction (new)

+
+
+

This Feature allows users to open a ticket by
reacting to a message of your choice.

+
+

Ticket Channel

+ + +
+
+

Message ID

+
+ +
+ +

Ticket Reaction  <% if(settings.isPremium == "false"){ %><% } %>

+ + + + +
+
+ + + +<% } else {%> + +

                                                                                 

+ + +<% } %> + + + + + + + +
+
+ + + +
+ + +
+<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> + +<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> +<% } else { %> +

Make sure the guild has 1 role.

+<% } %> + +
+
+
+ + +
+ + + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dashboard/templates/new/mainwelcome.ejs b/dashboard/templates/new/mainwelcome.ejs new file mode 100644 index 00000000..c9322ae8 --- /dev/null +++ b/dashboard/templates/new/mainwelcome.ejs @@ -0,0 +1,2548 @@ + + + + + + + + + + + + + + +<%- include("../partials/dashMenu", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> + + + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + + + + + + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + +
+
+ + +
+ +
+ <% if (alert) { %> + +<% } %> +

Welcome Channel

+


{user} - Mentions the person joining/leaving +
{guild} - The server's name +
{user_tag} - The person's User Tag +
{memberCount} - The total number of members

check more here

+
+

Welcome Channel

+ + + + +
+
+
+

Leave Channel

+


{user} - Mentions the person joining/leaving +
{guild} - The server's name +
{user_tag} - The person's User Tag +
{memberCount} - The total number of members

check more here

+
+

Leave Channel

+
+ +
+ +
+
+

Welcome Message

+
+
+ + +0 characters remaining +
+
+
+

Embed Message

+<% if(welcome.welcomeEmbed == "true") {%> + +<% } else {%> + +<% } %> +

DM the user  

+<% if(welcome.welcomeDM == "true") {%> + +<% } else {%> + +<% } %> +
+
+ +<% if(welcome.welcomeToggle == "true"){ %> + + + <% } else { %> + + <% } %> + +
+ + + + + + + + + + + +
+ +

Leave Message

+
+
+ + +0 characters remaining +
+
+
+

Embed Message

+<% if(leave.leaveEmbed == "true") {%> + +<% } else {%> + +<% } %> +

DM the user  

+<% if(leave.leaveDM == "true") {%> + +<% } else {%> + +<% } %> +
+
+ +<% if(leave.leaveToggle == "true"){ %> + + + <% } else { %> + + <% } %> + +
+ + + + + + + + + + +
+
+
+ + +
+ + +<% } else { %> +

Make sure the guild has 1 channel, So please create a channel before accessing our dashboard

+<% } %> + + + +
+ + + + + + + +<%- include("../partials/footer") %> + + + + + + + + + + diff --git a/dashboard/templates/partials/analytics.ejs b/dashboard/templates/partials/analytics.ejs new file mode 100644 index 00000000..942f3d54 --- /dev/null +++ b/dashboard/templates/partials/analytics.ejs @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/dashboard/templates/partials/dashMenu.ejs b/dashboard/templates/partials/dashMenu.ejs new file mode 100644 index 00000000..e469f082 --- /dev/null +++ b/dashboard/templates/partials/dashMenu.ejs @@ -0,0 +1,22 @@ + + + + + + +<%= title %> + +<% if (analitics) { %> +<%- include('./analytics.ejs') %> +<% } %> +<%- include("./seo", { bot, user, path, description, title, twitter, url, image:`${https}${hostname}/logo.png`}) %> + + + + +<%- include("./menuNav", { bot, user, path, url, image, name, tag }) %> +
+<%- title === "Dashboard" ? "" : "" %> \ No newline at end of file diff --git a/dashboard/templates/partials/dashfooter.ejs b/dashboard/templates/partials/dashfooter.ejs new file mode 100644 index 00000000..9f731590 --- /dev/null +++ b/dashboard/templates/partials/dashfooter.ejs @@ -0,0 +1,2 @@ +

© Pogy 2020 - 2021

\ No newline at end of file diff --git a/dashboard/templates/partials/embedhead.ejs b/dashboard/templates/partials/embedhead.ejs new file mode 100644 index 00000000..787592c5 --- /dev/null +++ b/dashboard/templates/partials/embedhead.ejs @@ -0,0 +1,22 @@ + + + + + + +<%= title %> + +<% if (analitics) { %> +<%- include('./analytics.ejs') %> +<% } %> +<%- include("./seo", { bot, user, path, description, title, twitter, url, image:`${https}${hostname}/logo.png`}) %> + + + + +<%- include("./nav2", { bot, user, path, url, image, name, tag }) %> +
+<%- title === "Dashboard" ? "" : "" %> \ No newline at end of file diff --git a/dashboard/templates/partials/footer.ejs b/dashboard/templates/partials/footer.ejs new file mode 100644 index 00000000..6bd3f16d --- /dev/null +++ b/dashboard/templates/partials/footer.ejs @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dashboard/templates/partials/head.ejs b/dashboard/templates/partials/head.ejs new file mode 100644 index 00000000..10f6df60 --- /dev/null +++ b/dashboard/templates/partials/head.ejs @@ -0,0 +1,25 @@ + + + + + + +<%= title %> + +<% if (analitics) { %> +<%- include('./analytics.ejs') %> +<% } %> +<%- include("./seo", { bot, user, path, description, title, twitter, url, image:`${https}${hostname}/logo.png`}) %> + + + + +<%- include("./nav", { bot, user, path, url, image, name, tag }) %> +
+<%- title === "Dashboard" ? "" : "" %> \ No newline at end of file diff --git a/dashboard/templates/partials/mainfooter.ejs b/dashboard/templates/partials/mainfooter.ejs new file mode 100644 index 00000000..5c085ee4 --- /dev/null +++ b/dashboard/templates/partials/mainfooter.ejs @@ -0,0 +1,400 @@ + + + + + + +
+ + +
+ + +
+ +
+ + +

Ready to Boost Your discord Server?
+ Pogy is the best discord bot to grow your discord server.

+
+ +
+ + + + diff --git a/dashboard/templates/partials/menuNav.ejs b/dashboard/templates/partials/menuNav.ejs new file mode 100644 index 00000000..4d138e46 --- /dev/null +++ b/dashboard/templates/partials/menuNav.ejs @@ -0,0 +1,196 @@ + + + \ No newline at end of file diff --git a/dashboard/templates/partials/nav.ejs b/dashboard/templates/partials/nav.ejs new file mode 100644 index 00000000..709a6fe8 --- /dev/null +++ b/dashboard/templates/partials/nav.ejs @@ -0,0 +1,199 @@ + + + \ No newline at end of file diff --git a/dashboard/templates/partials/seo.ejs b/dashboard/templates/partials/seo.ejs new file mode 100644 index 00000000..472323f9 --- /dev/null +++ b/dashboard/templates/partials/seo.ejs @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + +<% if (image) { %> + +<% } %> + +<% if (image) { %> + +<% } else { %> + +<% } %> + + + + + +<% if (verification != null) { %> + +<% } %> + +<% if(arc) { %> + +<% } %> \ No newline at end of file diff --git a/dashboard/templates/paste.ejs b/dashboard/templates/paste.ejs new file mode 100644 index 00000000..d18f4603 --- /dev/null +++ b/dashboard/templates/paste.ejs @@ -0,0 +1,521 @@ + + + + +<% if(type === "ticket") { %> +Pogy - Ticket Transcript + + + +
+
+<% +const closedby = bot.users.cache.get(db.by) +%> + +

Created at: <%=created %>
Expires   at: <%= expires %>
Closed by: <%= closedby.tag || 'Unknown' %>

+ +
+
+<% for (let i = 0; db.paste.length > i; i++) { %> +<% +const pogg = bot.users.cache.get(db.paste2[i]); +let pog; + if (pogg && pogg.avatar) { + pog = "https://cdn.discordapp.com/avatars/" + pogg.id + "/" + pogg.avatar + ".png?size=128"; +} else { + pog = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404.png?v=1602412158188"; +} + + + %> +<% if(pogg && pogg.tag && db.paste[i]) { %> +
+ +   <%= pogg.tag + ': ' + db.paste[i]%> +
+ +
+<% } %> + +<% } %> +
+

ticket Ends here

+
+
+
+ + + + <% } else if(type === "noFind") { %> + Pogy - Expired +
+
+ + +

It might have expired.

+ +
+
+ + + <% } else if(type === "form") { %> +Pogy - Application + + + +
+
+ <% +const closedby = bot.users.cache.get(db.by) +%> + +

Created at: <%= created %>
Expires   at: <%= expires %>
Submitted by: <%=closedby.tag || 'Unknown' %>
Status: <%= db.status || 'Not judged' %>

+ +
+
+<% for (let i = 0; db.paste.length > i; i++) { %> +
+

<%=db.paste[i]%>

+
Answer: <%=db.paste2[i]%>
+
+ +
+<% } %> + + +
+

Application Ends here

+
+
+
+ + + + <% } else if(type === "noFindForm") { %> + Pogy - Expired +
+
+ + +

It might have expired.

+ +
+
+ + <% } %> + + + \ No newline at end of file diff --git a/dashboard/templates/policy.ejs b/dashboard/templates/policy.ejs new file mode 100644 index 00000000..057e6a30 --- /dev/null +++ b/dashboard/templates/policy.ejs @@ -0,0 +1,34 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Team", twitter, url, image }) %> + + +
+
+
+
+
+
+
+
+

Pogy's Privacy Policy

+
+
+
+
+
+
+

Storage and Usage (users)
+We store user-id, username, and user-discriminator.
+
+Storage and Usage (guilds)
+Pogy stores public information; Configuration saves & Custom prefixes, guild name + guild ID
+
+Pogy's Security
+We implement a variety of security measures when a user places an order, enters, submits, or accesses their
information to maintain your personal information's safety. But remember that our storage is not 100% secured, and we
cannot guarantee its 100% safe.
+
+Want us to remove your data?
+Personal Data is stored for as long as required by the purpose they have been
collected for. However, if you want us to delete your data, you can request data deletion at
any time by contacting us! +

+
+ +<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/premium.ejs b/dashboard/templates/premium.ejs new file mode 100644 index 00000000..731fd65b --- /dev/null +++ b/dashboard/templates/premium.ejs @@ -0,0 +1,969 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Premium", twitter, url, image }) %> + + + + + + + +
+ + + + + +
+ + + +

PREMIUM

+

Take your server to a next level

+ + +
+ + + + +
+ +
+ +
+ + + +

1 Premium Server

+ + +

2.99$/month

+ + +
+
+ +
+
+ + Popular + +
+ + + +

3 Premium Servers

+

+ +

7.99$/month

+
+
+ +
+
+
+ + + +

5 Premium Servers

+

+ +

11.99$/month

+
+
+ +
+
+ + +

Features

+
+
+
+
+

Custom Commands

+

With Pogy Premium you can have UNLIMITED custom Commands! These Commands can be made directly from Pogy's Embed builder.

+
+
+
+
+
+

Server Reports

+

Fully Customizable Server Reports with Report Upvotes!

+
+
+ +
+
+
+

Customizable Suggestions

+

You even have the ability to customize the suggestion Embed on your own including the color, description, footer and even reaction!

+
+
+
+
+
+

Server Tickets

+

Last but not least, you can add up to 10 different reactions on your customized ticket Embed!

+
+
+
+ +
+

Still not convinced?

+
    +
  • • The ability to Approve and Decline Applications
  • +
  • • Set up Unlimited Auto Responses
  • +
  • • Set up unlimited Custom Commands
  • +
  • • Created Timed Polls
  • +
  • • White list over 50 accounts with the alt detector module
  • +
+
+
+ + + + + +
+ +
+
+ + + +<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/redeem.ejs b/dashboard/templates/redeem.ejs new file mode 100644 index 00000000..9687eef2 --- /dev/null +++ b/dashboard/templates/redeem.ejs @@ -0,0 +1,55 @@ +<%- include("partials/head", { bot, user, path, title: "Pogy - Redeem" }) %> +
+ +

SELECT A SERVER

+ + +
+<% user.guilds.forEach(guild => { + const permsOnGuild = new perms(guild.permissions); + if(!permsOnGuild.has("MANAGE_GUILD")) { + return + } +%> + <% if (!bot.guilds.cache.get(guild.id)) { + return + } %> +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> +
+
+<% guild.name %> +

<%= guild.name %>

+
+ <% if (bot.guilds.cache.get(guild.id)) { %> + Redeem + <% } %> +
+ <% }); %> +
+ + + +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/redeemguild.ejs b/dashboard/templates/redeemguild.ejs new file mode 100644 index 00000000..d9b825dd --- /dev/null +++ b/dashboard/templates/redeemguild.ejs @@ -0,0 +1,691 @@ + +<%- include("partials/head", { bot, user, path, title: "Pogy - Redeem" }) %> + + + + <% if(!alert && settings.isPremium === "true") { %> +
+
+ + Already Premium +

<%= guild.name %> Is already a premium guild.

+ +
+
+ <% } else if(alert) { %> +
+
+ + Congrats! +

<%= guild.name %> Is now a premium guild!

+ +
+
+ + + + + <% } else { %> +
+
+
+ + Guild: <%= guild.name %> +
+ + +
    +
  1. + + Summary +
  2. +
  3. + + Redeem +
  4. + +
+ + +
+ + + +
+

Order Summary

+ + + + + + + + + + + + + +
1 Year Premium (1 Server)29.99$
Free Coupon-29.99$
Total0$
+
+ + + +

+ + +

+ + + + + +
+
+
+ <% } %> + + + + + +<%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/report.ejs b/dashboard/templates/report.ejs new file mode 100644 index 00000000..d2b05357 --- /dev/null +++ b/dashboard/templates/report.ejs @@ -0,0 +1,142 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - report"}) %> + + + + + + <% if (user) { %> + +
+
+
+ +
+ Discord Name + + + +
+
+ Discord ID + + + + +
+ +
+ Report Reason + + + + + +
+
+ Proof: + + +
+
+
+
+ + +
+ +
+
+
+
+ + + + + +
+
+ <% } else { %> +
+
+
+ +
+ Discord Name + + + +
+
+ Discord ID + + + + +
+ +
+ Report Reason + + + + + +
+
+ Proof: + + +
+
+
+

You must be logged in to report a user.

+ +
+
+
+ +
+ +
+ + +
+
+ <% } %> + + + + + + + <%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/server.ejs b/dashboard/templates/server.ejs new file mode 100644 index 00000000..7f807567 --- /dev/null +++ b/dashboard/templates/server.ejs @@ -0,0 +1,1791 @@ + + + + + + + + + + + + + + +<%- include("partials/head", { bot, user, path, description, title: `Pogy - Dashboard`, twitter, url})%> +
+ + Dashboard - <% guild.name %> + +<% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; +} else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; +} +%> + + + +
+ +<% guild.name %> +
+ +

<%= guild.name %>

+

<%= guild.memberCount%> Members

+ + + + +
+
+ +
+ + +<% if(guild.roles.cache.size > 0) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'text').size > 0) { %> + +<% if(guild.channels.cache.filter(m => m.type === 'category').size > 0) { %> + +
+
+
+<% if (alert) { %> + + +
+
+
+<% } %> + + +<% if(settings.isPremium == "false"){ %> + + +
+ +

+ +The following Server isn't a premium guild, we are giving free premium to guilds who pass the requirements.    + +

+ +
+ + +<% } %> + + +
+
+ + + +

📝Basic Configuration

+

Prefix

+
+ +
+

Language

+ +

Dashboard Logs

+ +
+
+ + + +
+
+

🌀 Guild Channels

+
+ +
+

Suggestion Channel

+ + + +
+ +

Report Channel

+ + + +
+

Mod Logs

+ + +
+
+
+ + +
+
+ + +
+
+

🤖 Bot Settings

+

Bot Nickname

+
+ +
+

Bot Footer (soon) <% if(settings.isPremium == "false"){ %><% } %>

+
+ +
+
+

Anti Invite +

+

Anti Link +

+
+ + + + +
+
+
+
+
+
+
+
+

👋 Welcome messages

+ +
+ +
+

Welcome Message (Check Variables Here)

+ + + +
+ +
+

Welcome Channel

+ +
+ +
+
+

Welcome Embed

+ +

+
+
+
+ + + +
+
+

🎫 Tickets

+
+

Main Settings

+ + + +

Welcome Message (Check Variables Here)

+ + + +
+

+ Embed Color

+

Ticket Logs

+ + +
+

Support Role

+ +
+

Ticket Category

+ +
+

Ticket Limit (1 - 5)

+ +
+
+ +

<% if(ticket.ticketPing == "true") { %> + + <% } else { %> + + <% } %>Ping @everyone

+ <% if(ticket.ticketType == "message") { %> + +

<% if(ticket.requireReason == "true") { %> + + <% } else { %> + + <% } %>Require Reason <%= settings.prefix %>ticket (reason)

+ <% } %> + +

<% if(ticket.ticketClose == "true") { %> + + <% } else { %> + + <% } %>Allow Users to Close ticket  <% if(settings.isPremium == "false"){ %><% } %>

+ +
+
+ +
+
+

😢 Leave messages

+ +
+ +
+

Leave Message (Check Variables Here)

+ + +
+ +
+

Leave Channel

+ +
+ +
+
+

Leave Embed

+ +

+
+
+
+ + + +
+
+
+
+ +
+
+<% if(ticket.ticketType == "reaction" && ticket.ticketCustom == "false") { %> +

Reaction Panel

+

  Embed Color

+

Reaction Title

+
+ +
+

Reaction description(Max 1024)

+ + +
+ + +

<% if(ticket.ticketTimestamp == "true") { %> + + <% } else { %> + + <% } %>  Reaction TimeStamp

+

+ <% if(!!ticket.ticketFooter === true) { %> + + <% } else { %> + + <% } %>  Reaction Footer <% if(settings.isPremium == "false"){ %><% } %>

+ + +
+

Reaction Channel

+ + +

Ticket Reaction  <% if(settings.isPremium == "false"){ %><% } %>

+ +
+
+ <% } else if(ticket.ticketType == "reaction" && ticket.ticketCustom == "true") { %> + +

Custom Message Reaction (new)

+
+
+

This Feature allows users to open a ticket by
reacting to a message of your choice.

+
+

Ticket Channel

+ + +
+
+

Message ID

+
+ +
+ +

Ticket Reaction  <% if(settings.isPremium == "false"){ %><% } %>

+ + + + +
+
+ + + +<% } %> + + + +
+
+

🎖️ AutoRole

+ +
+ +
+

Role

+

Invalid Roles / bot Roles will not Work

+ +
+
+ + + + +
+
+
+
+

🚀 Reaction Roles

+
+
+

Reaction Role Logs

+ + +
+
+ +
+

Reaction Role DMs  <% if(settings.isPremium == "false"){ %><% } %> +

+ +
+ + +
+
+ + + + + + + +
+ + + +
+ + + + + +
+
+
+
+
+

+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+

+
+
+

+
+
+
+
+

+
+
+
+
+

hello

+
+ +<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> + +<% } else { %> +

Make sure the guild has 1 category and 1 channel.

+<% } %> +<% } else { %> +

Make sure the guild has 1 role.

+<% } %> +
+
+
+
+

+
+
+
+
+ + + + + + + + + +<%- include("partials/footer") %> diff --git a/dashboard/templates/stats.ejs b/dashboard/templates/stats.ejs new file mode 100644 index 00000000..94c24860 --- /dev/null +++ b/dashboard/templates/stats.ejs @@ -0,0 +1,77 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Stats", twitter, url, image }) %> + + +<%- include("partials/footer") %> +
+ \ No newline at end of file diff --git a/dashboard/templates/team.ejs b/dashboard/templates/team.ejs new file mode 100644 index 00000000..9f4c6e67 --- /dev/null +++ b/dashboard/templates/team.ejs @@ -0,0 +1,247 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - Team", twitter, url, image }) %> + + +
+
+
+
+
+
+
+
+
+

Meet the Team!

+
+
+
+
+
+ + +
+
+
+
+ +
+ Peter +
Peter_#4444
+
Developer
+
+ + + + +
+
+ +
+ wlegit +
W-Legit#6969
+
Developer
+
+ + + +
+
+ +
+ Sui +
Sui#6444
+
Staff
+
+ + +
+
+ +
+ Streaks +
Streaks#0001
+
Staff
+
+ + + + +
+
+ + +
+ indo +
indominus#3215
+
Staff
+
+ +
+
+ + +
+ Chaz +
$ chaz#2177
+
Staff
+
+ + +
+
+
+ Scoopy +
Scoopy#3647
+
Support
+
+ + + +
+
+
+ Ace +
Λcє#0001
+
Contributor
+
+ +
+
+ +
+ slayer +
Slayer#3102
+
Contributor
+
+ + +
+
+ + +
+
+
+
+ +<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> \ No newline at end of file diff --git a/dashboard/templates/thanks.ejs b/dashboard/templates/thanks.ejs new file mode 100644 index 00000000..54d49772 --- /dev/null +++ b/dashboard/templates/thanks.ejs @@ -0,0 +1,400 @@ + +Pogy - Thanks + + + +
+
+ + Thank you! +

Thank you for inviting Pogy. It Means a lot to Us!
Need help? Join our Support Server

+
+ +
+
+ + + + \ No newline at end of file diff --git a/dashboard/templates/url.ejs b/dashboard/templates/url.ejs new file mode 100644 index 00000000..873eafe7 --- /dev/null +++ b/dashboard/templates/url.ejs @@ -0,0 +1,126 @@ +<%- include("partials/head", { bot, user, path, description, title: "Pogy - ShortUrl", twitter, url, image }) %> + +

Pogy - URL

+ +
+ + + + + + + + +
+ +
+ + What is our Url Policy + + + +

1- You are strictly not allowed to use the following module for ip logging, as you are forbidden of using malicous Links.
2- We are allowed to delete your url's anytime due to specific reasons.
3- Please note that we are able to see every URL created

Breaking the first policy will result to a bot blacklist.

+
+ +
+ + How do I report a user Breaking the policy Above? + + + +

To report You can easily access our report page at (https://pogy.xyz/report) and report the user. Please make sure to add as much as proof as you have with the URL ID.

+
+ +
+ + Can Pogy's Team see my IP adress when link is clicked? + + + +

No. we do not store anyone's IP adress when a link is clicked. We only store the amount of clicks each URL.

+
+ + +
+
+<%- include("partials/mainfooter") %> +<%- include("partials/footer") %> + + \ No newline at end of file diff --git a/dashboard/templates/variables.ejs b/dashboard/templates/variables.ejs new file mode 100644 index 00000000..7bc2c6a7 --- /dev/null +++ b/dashboard/templates/variables.ejs @@ -0,0 +1,420 @@ + +Pogy - Variables + + + +
+
+ + Pogy's Variables! +
    +
  • {user} - Mentions the User (ex. @Peter_)
  • +
  • {user_tag} - The user's Tag (ex. Peter_#4444)
  • +
  • {user_name} - The user's username (ex. Peter_)
  • +
  • {user_ID} - The user's ID (ex. 710465231779790849)
  • +
  • {guild} + {guild_name} - The guild's name (Ex. Pogy's Server
  • +
  • {guild_ID} - Guild's ID (Ex. 758566519440408597)
  • +
  • {memberCount} + {size} - Guild's member Count (ex. 12)
  • +
  • {member_createdAtAgo} - User's account created ago (ex. 2 days ago)
  • +
  • {member_createdAt} - User's account Created At (Ex. 12 April 2021, 1:38pm)
  • +
    +

    Extra: Welcome & Leaves

    +
    You can use {userAvatar} in the image or thumbnail box to display the user's avatar on join
    +
    +

    Extra: Ban message + Ticket

    +
    You can use {reason} To display the user's reason of the ticket or the moderator's reason of the ban
    +
    +

    Extra: Suggestions (premium)

    +
    You can use {suggestion} To display the user's suggestion - Available only in description. Hence, you can use the above main tags in the footer.
    +
    +

    Last Updated by Peter_#4444 on April 11th, 2021 +

      + +
+
+ + + + \ No newline at end of file diff --git a/dashboard/templates/window.ejs b/dashboard/templates/window.ejs new file mode 100644 index 00000000..b1b133c0 --- /dev/null +++ b/dashboard/templates/window.ejs @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/ReactionMenu.js b/data/ReactionMenu.js new file mode 100644 index 00000000..d1555b03 --- /dev/null +++ b/data/ReactionMenu.js @@ -0,0 +1,226 @@ +const { MessageEmbed } = require('discord.js'); +const ms = require("ms"); +/** + * Peter's Reaction Menu class + */ +module.exports = class ReactionMenu { + + /** + * Create new ReactionMenu + * @param {Client} client + * @param {TextChannel} channel + * @param {GuildMember} member + * @param {MessageEmbed} embed + * @param {Array} arr + * @param {int} interval + * @param {Object} reactions + * @param {int} timeout + */ + constructor(client, channel, member, embed, arr = null, interval = 10, reactions = { + '⏪': this.first.bind(this), + '◀️': this.previous.bind(this), + '🗑️': this.stop.bind(this), + '▶️': this.next.bind(this), + '⏩': this.last.bind(this) + + }, timeout = 180000) { + + /** + * The Peter Client + * @type {Client} + */ + this.client = client; + + /** + * The text channel + * @type {TextChannel} + */ + this.channel = channel; + + /** + * The member ID snowflake + * @type {string} + */ + this.memberId = member.id; + + /** + * The embed passed to the Reaction Menu + * @type {MessageEmbed} + */ + this.embed = embed; + + /** + * JSON from the embed + * @type {Object} + */ + this.json = this.embed.toJSON(); + + /** + * The array to be iterated over + * @type {Array} + */ + this.arr = arr; + + /** + * The size of each array window + * @type {int} + */ + this.interval = interval; + + /** + * The current array window start + * @type {int} + */ + this.current = 0; + + /** + * The max length of the array + * @type {int} + */ + this.max = (this.arr) ? arr.length : null; + + /** + * The reactions for menu + * @type {Object} + */ + this.reactions = reactions; + + /** + * The emojis used as keys + * @type {Array} + */ + this.emojis = Object.keys(this.reactions); + + /** + * The collector timeout + * @type {int} + */ + this.timeout = timeout; + + const first = new MessageEmbed(this.json); + const description = (this.arr) ? this.arr.slice(this.current, this.interval) : null; + if (description) first + .setTitle(this.embed.title + ' ' + getRange(this.arr, this.current, this.interval)) + .setDescription(description); + + this.channel.send(first).then(message => { + + /** + * The menu message + * @type {Message} + */ + this.message = message; + + this.addReactions(); + this.createCollector(); + }); + } + + /** + * Adds reactions to the message + */ + async addReactions() { + for (const emoji of this.emojis) { + await this.message.react(emoji).catch((e) => {}); + await delay(1000); + } + } + + /** + * Creates a reaction collector + */ + createCollector() { + + // Create collector + const collector = this.message.createReactionCollector((reaction, user) => { + return (this.emojis.includes(reaction.emoji.name) || this.emojis.includes(reaction.emoji.id)) && + user.id == this.memberId; + }, { time: this.timeout }); + + // On collect + collector.on('collect', async reaction => { + let newPage = this.reactions[reaction.emoji.name] || this.reactions[reaction.emoji.id]; + if (typeof newPage === 'function') newPage = newPage(); + if (newPage) await this.message.edit(newPage); + await reaction.users.remove(this.memberId); + }); + + // On end + collector.on('end', () => { + + setTimeout(() => { + this.message.delete().catch(() => {}); + }, 2000); + + }); + + this.collector = collector; + } + + /** + * Skips to the first array interval + */ + first() { + if (this.current === 0) return; + this.current = 0; + return new MessageEmbed(this.json) + .setTitle(this.embed.title + ' ' + getRange(this.arr, this.current, this.interval)) + .setDescription(this.arr.slice(this.current, this.current + this.interval)); + } + + /** + * Goes back an array interval + */ + previous() { + if (this.current === 0) return; + this.current -= this.interval; + if (this.current < 0) this.current = 0; + return new MessageEmbed(this.json) + .setTitle(this.embed.title + ' ' + getRange(this.arr, this.current, this.interval)) + .setDescription(this.arr.slice(this.current, this.current + this.interval)); + } + + /** + * Goes to the next array interval + */ + next() { + const cap = this.max - (this.max % this.interval); + if (this.current === cap || this.current + this.interval === this.max) return; + this.current += this.interval; + if (this.current >= this.max) this.current = cap; + const max = (this.current + this.interval >= this.max) ? this.max : this.current + this.interval; + return new MessageEmbed(this.json) + .setTitle(this.embed.title + ' ' + getRange(this.arr, this.current, this.interval)) + .setDescription(this.arr.slice(this.current, max)); + } + + /** + * Goes to the last array interval + */ + last() { + const cap = this.max - (this.max % this.interval); + if (this.current === cap || this.current + this.interval === this.max) return; + this.current = cap; + if (this.current === this.max) this.current -= this.interval; + return new MessageEmbed(this.json) + .setTitle(this.embed.title + ' ' + getRange(this.arr, this.current, this.interval)) + .setDescription(this.arr.slice(this.current, this.max)); + } + + /** + * Stops the collector + */ + stop() { + this.collector.stop(); + } +}; + +function getRange(arr, current, interval) { + const max = (arr.length > current + interval) ? current + interval : arr.length; + current = current + 1; + const range = (arr.length == 1 || arr.length == current || interval == 1) ? `[${current}]` : `[${current} - ${max}]`; + return range; +} +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/data/colors.js b/data/colors.js new file mode 100644 index 00000000..214c24e7 --- /dev/null +++ b/data/colors.js @@ -0,0 +1,8 @@ +module.exports = { + green: "#2BFF59", + orange: "#FFD132", + blue: "#a7d6fd", + red: "#FF360B", + pink:"#C597B8", + yellow:"#FFFF00" +} \ No newline at end of file diff --git a/data/config.js b/data/config.js new file mode 100644 index 00000000..94d00fb8 --- /dev/null +++ b/data/config.js @@ -0,0 +1,4 @@ +module.exports = { + prefix: "!", + owners: ["402490971041824768"], +} \ No newline at end of file diff --git a/data/economy/items.js b/data/economy/items.js new file mode 100644 index 00000000..fbf0b70a --- /dev/null +++ b/data/economy/items.js @@ -0,0 +1,96 @@ +module.exports = [ + //"cow","chicken","sheep","duck","bear","chipmunk","cat","dog","koala","lion","tiger","panda","crab","cockapoo","clownfish","donkey","owl","dolphin","shark","eel","fish","seal","gecko","goose","pig","horse","hamster","iguana","kangaroo","ocelot","octopus" +{ + item: "cow", +}, +{ + item: "chicken", +}, +{ + item: "sheep", +}, +{ + item: "duck", +}, +{ + item: "bear", +}, +{ + item: "chipmunk", +}, +{ + item: "cat", +}, +{ + item: "dog", +}, +{ + item: "koala", +}, +{ + item: "lion", +}, +{ + item: "tiger", +}, +{ + item: "panda", +}, +{ + item: "crab", +}, +{ + item: "cockapoo", +}, +{ + item: "clownfish", +}, +{ + item: "donkey", +}, +{ + item: "owl" +}, +{ + item: "dolphin" +}, +{ + item: "shark" +}, +{ + item: "eel" +}, +{ + item: "fish" +}, +{ + item: "seal" +}, +{ + item: "gecko" +}, +{ + item: "goose" +}, +{ + item: "pig" +}, +{ + item: "horse" +}, +{ + item: "hamster" +}, +{ + item: "iguana" +}, +{ + item: "kangaroo" +}, +{ + item: "ocelot" +}, +{ + item: "octopus" +} +] \ No newline at end of file diff --git a/data/economy/shopItems.js b/data/economy/shopItems.js new file mode 100644 index 00000000..a4adff4c --- /dev/null +++ b/data/economy/shopItems.js @@ -0,0 +1,142 @@ +module.exports = [ +{ + item: "Default Shotgun", + price: 0, + sell: 0, + buyable: false, + description: "*This is the default shotgun, everyone has this item*\n", + emoji: "<:default_shotgun:821668319949619250>", + id: "defaultshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 20, + canHunt: ["cow", ""] + }, +{ + item: "Sky Shotgun", + price: 1000, + sell: 0, + buyable: true, + description: "*This is the sky shotgun, with the beautiful color of the sky.*\n\n", + emoji: "<:sky_shotgun:821670856307638282>", + id: "skyshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 50, + canHunt: [] + }, +{ + item: "Golden Shotgun", + price: 5000, + sell: 0, + buyable: true, + description: "*The golden gun, one of the better guns in the town. This is for the people who can only hit.*\n\n", + emoji: "<:golden_shotgun:821670928164454410>", + id: "goldenshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 80, + canHunt: [] + }, +{ + item: "Bloody Shotgun", + price: 20000, + sell: 0, + buyable: true, + description: "*This shotgun is made with the blood and sweat of the animals you hunted, you must be a proud owner with this gun.*\n\n", + emoji: "<:bloody_shotgun:821670876843999242>", + id: "bloodyshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 150, + canHunt: [] + }, +{ + item: "Woody Shotgun", + price: 50000, + sell: 0, + buyable: true, + description: "*The woody shotgun is made with the strongest wood in the world.*\n\n", + emoji: "<:woody_shotgun:821673459427049492>", + id: "woodyshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 230, + canHunt: [] + }, +{ + item: "Banana Shotgun", + price: 100000, + sell: 0, + buyable: true, + description: "*You might think this gun is useless and weak. But you should never underestimate the power of bananas.*\n\n", + emoji: "<:banana_shotgun:821721000021458955>", + id: "bananashotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 300, + canHunt: [] + }, +{ + item: "Pinky Shotgun", + price: 200000, + sell: 0, + buyable: true, + description: "*This shotgun might be pink, but it's power is immersive. The pink is so bright that it can blind animals.*\n\n", + emoji: "<:pinky_shotgun:821714603175968809>", + id: "pinkyshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 375, + canHunt: [] + }, +{ + item: "Camouflage Shotgun", + price: 350000, + sell: 0, + buyable: true, + description: "*This shotgun will help you with hiding, with this gun you can finally be hiding in those bushes.*\n\n", + emoji: "<:camouflage_shotgun:821671770033356801>", + id: "camouflageshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 450, + canHunt: [] + }, +{ + item: "Meaty Shotgun", + price: 750000, + sell: 0, + buyable: true, + description: "*No, it is not made out of meat but, it is with the strongest metal surrounded by the dead animals meat.*\n\n", + emoji: "<:meaty_shotgun:821671373662847026> ", + id: "meatyshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 590, + canHunt: [] + }, +{ + item: "Dragon Shotgun", + price: 1000000, + sell: 0, + buyable: true, + description: "*This shotgun is made with the flesh of one of the strongest dragon, if you have it you must've seen alot of stuff.*\n\n", + emoji: "<:dragon_shotgun:821721359435825172>", + id: "dragonshotgun", + type: "Gun", + sellable: false, + category: ["gun", "shotgun"], + damage: 750, + canHunt: [] + }, +] \ No newline at end of file diff --git a/data/emoji.js b/data/emoji.js new file mode 100644 index 00000000..53189243 --- /dev/null +++ b/data/emoji.js @@ -0,0 +1,7 @@ +module.exports = { + x: "<:wrong:822379358453891123>", + fail: "<:wrong:822379358453891123> ", + check: "<:check:822377045236514816> ", + success: "<:check:822377045236514816> ", + cash: "$" +} \ No newline at end of file diff --git a/data/language/english.json b/data/language/english.json new file mode 100644 index 00000000..41f470db --- /dev/null +++ b/data/language/english.json @@ -0,0 +1,614 @@ +{ + "setLangInvalidPermission":"You need the ADMINISTRATOR permission to run this command", + "setLangMissingArgument":"You did not specify a language", + "setLangInvalidOption":"Please specify between: {languages}", + "setLangChange":"Successfully changed the language to {language}", + + "setPrefixInvalidPermission":"You need the ADMINISTRATOR permission to run this command", + "setPrefixMissingArgument":"You did not specify the new prefix", + "setPrefixLongLength":"The prefix length can't be more than 5", + "setPrefixChange": "Prefix has been changed to {prefix}", + + + "helpInvalidCommand":"Invalid Command", + "helpInvalidListCommand":"Do `{prefix}help` for the list of the commands.", + "helpCommand":"Command", + "helpDescription":"Description", + "helpAlias":"Aliases", + "helpUsage":"Usage", + "helpCategory":"Category", + "helpInviteBot":"Invite the bot", + "helpSupportServer":"Support Server", + + + "workJobTitle": "Available Jobs", + "workJobPage":"Page", + "workJobArtist":"{emoji} | **Artist** - {prefix}work job artist", + "workJobChef": "{emoji} | **Chef** - {prefix}work job Chef", + "workJobFirefighter": "{emoji} | **FireFighter** - {prefix}work job firefighter", + "workJobDoctor": "{emoji} | **Doctor** - {prefix}work job doctor", + "workJobTeacher": "{emoji} | **Teacher** - {prefix}work job teacher", + "workJobLifeguard": "{emoji} | **Lifeguard** - {prefix}work job lifeguard", + "workJobDetective": "{emoji} | **Detective** - {prefix}work job detective", + "workJobFarmer": "{emoji} | **Farmer** - {prefix}work job farmer", + "workJobButcher":"{emoji} | **Butcher** - {prefix}work job butcher", + "workJobLawyer":"{emoji} | **Lawyer** - {prefix}work job lawyer", + "workInvalidArg0": "You did not specify between {array}", + "workJobInvalidArg0": "Invalid job choice, check {prefix}work info for more information", + "workHasJob":"You already have a job, use {prefix}work quit t quit your job", + "workHasNoJob":"You do not have a job to quit", + "workJobNotEnoughSucceed":"You did not unlock the job {userJob} yet", + "workJobSuccessQuit":"You have successfully quit your job", + "workJobNoHave":"You do not have a job to work, check {prefix}work info for more information", + "workJobGot":"You are now working as {newWork}", + "workJobTime":"You already worked recently\nTry again in: {timeMinute}m {timeSecond}s", + "workFail": "You have failed your job and did not get any money", + "workSucceed":"You have worked and have made {moneyAmount}{emoji}", + + + + "searchPlaces": ["pocket", "closet" , "couch" , "purse" , "bed", "house", "street", "toilet", "car" , "cloth" , "phone" , "games" , "pants" , "shirt", "museum" , "cinema", "mall", "air", "shop", "supermarket", "home"], + "searchTime":"You already searched recently\nTry again in: {timeMinute}m {timeSecond}s", + "searchToChoose":"Please choose where you would like to search beween: `{place1}`, `{place2}`, `{place3}`", + "searchSucceed":"You have searched in {place} and found {money}{emoji}", + "searchInvalidChoice":"This is not a valid place to search in", + + + "balanceTitle":"{user}'s balance", + "balanceCheck":"Cash: {money}{emoji}\nBank: {bank}/{bankspace}\nTotal: {total}", + + + "depositMissingArg0":"You did not specify how much money you would like to deposit", + "depositSuccessfull":"I have successfully deposited {money} to your bank", + "depositMaxBank":"Your bank is full", + "depositNoMoney":"You do not have any money to deposit in your bank", + "depositNegative":"You cannot deposit negative money", + "depositIsNan":"The amount you're depositing must be a number", + "depositNotEnoughMoney":"You do not have this much money to deposit", + "depositBankNoFit":"Your bank cannot fit this much money", + "depositSuccessNumber":"Successfully deposited {amount}{emoji} to your bank", + + + "withdrawMissingArg0":"You did not specify how much money you would like to withdraw", + "withdrawNoMoney":"You do not have any money in your bank to withdraw", + "withdrawSuccessful":"Successfully withdrew {bankMoney}{emoji} from your bank", + "withdrawNegative":"You cannot withdraw negative money", + "withdrawIsNan":"The amount you're withdrawing must be a number", + "withdrawMoreThanHave":"You cannot withdraw more money than what you have", + "withdrawSuccessNumber":"Successfully withdrew {amount}{emoji} from your bank", + + "warnMissingUser":"You forgot to specify a user!", + "warnMissingPermission":"You do not have the Manage Roles permission to use this command", + "warnHigherRole":"You cannot warn a user with a role higher than yours", + "warnSuccessful":"{emoji} | {user} has been warned", + "warnLogTitle":"New Warning!", + "warnLogDescription":"**Staff**: {author}\n**Member**: {user}\n**Reason**: {reason}", + + "birdError":"An error has occured in the bird command, if this keeps happening please contact the owner!", + + + "catError":"An error has occured in the cat command, if this keeps happening please contact the owner!", + + + "changeError":"An error has occured in the change my mind command, if this keeps happening please contact the owner!", + "changeErrorValid":"Please Provide me with a text", + "changeErrorCharacter":"Please Provide a text of 85 characters or less", + + "clydeError":"An error has occured in the clyde command, if this keeps happening please contact the owner!", + "clydeErrorCharacter":"Please Provide a text of 60 characters or less", + + "generating":"Generating...", + + "magikError":"An error has occured in the magik command, if this keeps happening please contact the owner!", + + "mcErrorCharacter":"Please Provide a text of 25 characters or less", + + "phubErrorCharacter":"Please Provide a text of 50 characters or less", + + "cmdHandlerNoPerms":"You need the {permission} to use this command", + + "warningsNoError":"does not have any warnings", + "warnName":"Warn List", + "warnModerator":"Moderator", + "warnReason":"Reason", + "warnID":"Warn ID", + "warnDateIssued":"Date Issued", + "warnList":"Warn List", + "warnAction":"Moderator Action", + "warnExpire":"Expires in 3 minutes", + +"slapError":"Please Provide me with a Valid User", + + "trumpError":"An error has occured in the trump command, if this keeps happening please contact the owner!", + + "urlshortnerMissingArg":"The link specified is not valid", + "urlshortnerSuccessful":"Successfully created the link, click here: https://url.pogy.xyz/{shortUrl}", + + "banError":"You need the Ban Members permission to use this command", + "banUserValid":"Please provide a Valid User mention / ID", + "banYourselfError":"You Can't ban yourself", + "banHigherRole":"The provided user has an equal or higher role than you.", + "banBannable":"I am not able to ban this user since he is not bannable", + "noReasonProvided":"No Reason Provided", + "banBan":"was successfully banned.", + + "kickMissingPermission":"You need the Kick Members permission to use this command", + "kickYourself":"You Can't kick yourself", + "kickKickable":"I am not able to ban this user since he is not kickable", + "kickKick":"was successfully kicked.", + + + "muteMissingPerms":"You do not have permissions to use that command", + "muteMissingPermsBot":"I do not have permissions to use that command", + "muteTime":"That is not a valid amount of time to mute member.", + "muteRolePosition":"I can't mute this member as their roles are higher to mine.", +"muteRolePositionBot":"I can't mute this member because the `Muted` role is higher than mine.", +"muteMuted":"This member is already muted.", +"muteMember":"Member", +"muteLength":"Length", + +"rmPermission":"You don't have permission to `unwarn members`.", +"rmPosition":" You can't unwarn this member as there role is higher than yours.", +"rmNoWarning":"This member doesn't have any warnings.", +"rmWarnInvalid":"This is an invalid warning id.", + +"managemessages":"Hey.. This feature is only available for members with **Manage Messages**", +"notaccessible":"This channel is not accessible for me", +"whatdoIsay":"Write that again, but provide me with a text!", +"sendmessages":"I do not have permission to send messages!", +"userSendMessages":"You do not have permission to send message into the provided channel", +"coiniflippedacoinfor":"I Flipped a Coin For", +"coinitwas":"it was", +"emojify":"Write that again, but with a text!", +"dontmention":"You don't have to mention someone", +"emojifyError":"Couldn't send message make sure your text is not really big", + +"f1":"has paid their respects.", +"f2":"has paid their respects to", +"f3":"Press F to pay your respects.", +"hack1":"Woaaah slow down, who are we hacking?", +"hackbot":"You can't really hack a bot", +"hack2":"pog", +"hack3":"sexy", +"hack4":"boy", +"hack5":"mean", +"hack6":"nerd", +"hack7":"Wanna go out?", +"hack8":"She's really hot", +"hack9":"This is so POG", +"hack10":"Its so big", +"hack11":"We are about to hack", +"hack12":"it all begins now...", +"hack13":"Finding discord login... (2fa bypassed)", +"hack14":"Finding most common word...", +"hack15":"Selling data to the Government...", +"hack16":"Reporting account to discord for breaking ToS...", +"hack17":"Finished hacking", +"hack18":"The hack was completed..", + +"softbanNoPerm":"You need the Ban Members permission to use this command", +"softbanNoUser":"You did not specify a valid user", +"softbanSelfUser":"You cannot softban yourself", +"softbanEqualRole":"The provided user either has an equal or higher role than you", +"softbanNotBannable":"This user is not bannable", +"softbanNoReason":"No Reason Provided", +"softbanResponsible":"Responsible user", +"softbanSuccess":"I have successfully softbanned", + +"unbanNoPerm":"You need the Ban Members permission to use this command", +"unbanInvalidID":"This is not a valid user ID", +"unbanNoReason":"No Reason Provided", +"unbanResponsible":"Responsible user", +"unbanSuccess":"Successfully unbanned", + +"kill1":"Wow, that was great..But who do I kill?", +"kill2":"Bruh, you seem depressed.. How can I help?", +"kill3":"sat on", +"kill4":", as the other sadly *suffocated*", +"kill5":"dies from dancing too hard", +"kill6":"died from a heart attack", +"kill7":"died from not eating much ass", +"kill8":"killed him right away,", +"kill9":"seems really nice.. why him", +"kill10":"went to fight", +"kill11":", but got **knocked** out on first round", +"kill12":"tripped and sadly died", +"kill13":"was begging for forgiveness, but", +"kill14":"killed him right away", +"kill15":"died from aids", +"kill16":"couldn't handle", +"kill17":"'s stupidity, so he shot him", +"kill18":"died while climbing the wall of China", +"kill19":"died while *robbing* a bank", +"kill20":"died while studying history", +"kill21":"sat on", +"kill22":"killing him", +"kill23":"slapped", +"kill24":"is just too weak to handle this", +"kill25":"Pogy sat on", +"kill26":", the other sadly *suffocated*", +"kill27":"Pogy slapped", +"kill28":"with a microwave", +"kill29":"starved to death", +"kill30":"seems really innocent", +"kill31":"Sorry", +"kill32":"seems to nice, I can't", +"kill33":"got hit by a car", + +"unmuteRolePosition":"The mute role's position is higher than mine", +"unmuteUserRoleHigher":"The users role is higher than mine so I am unable to unmute him", +"unmuteNotMuted":"This member is not muted", +"unmuteNoMutedRole":"There is no Muted role, but as soon as you mute someone one will be automatically created", +"unmuteNoUser":"You forgot to specify a user", + +"rate1":"I'd give you a", +"rate2":"Your item seems HUGE! I couldn't really rate..", +"rate3":"..Uh, should I rate myself? Well, I'd give myself a 10/10!", +"rate4":"I'd give", +"rate5":"a", + +"shopMissingArg0":"You did not specify between {choose}", +"shopCompany":"Companies", +"shopItem":"Items", +"shopCompanyPage1":"**McDonald** - Have your own fast food restaurant, price: 5,000{money} - {prefix}buy McDonald\n**Target** - Have your own target, price: 15,000{money} - {prefix}buy Target\n**Walmart** - Have your own walmart, price: 30,000{money} - {prefix}buy Walmart\n**FedEx** - Have your own mailing company, price: 65,000{money} - {prefix}buy FedEx\n**StarBucks** - Have your own starbucks, price: 115,000{money} - {prefix}buy StarBucks", +"shopCompanyPage2":"**Boeing** - You can buy this if you always wanted a plane, price: 200,000{money} - {prefix}buy Boeing\n**BuzzFeed** - Have your own buzzfeed and spread the news around, price: 500,000{money} - {prefix}buy BuzzFeed\n**FaceBook** - Have your own social media platform, price: 1,750,000{money} - {prefix}buy FaceBook\n**CocaCola** - Have your own a huge drinking company, price: 3,250,000{money} - {prefix}buy CocaCola\n**Spotify** - Have one of the biggest music companies, price: 5,000,000{money} - {prefix}buy Spotify", +"shopCompanyPage2 duplicated":"**SpaceX** - You will have a big space company, price: 18,950,000{money} - {prefix}buy SpaceX\n**NASA** - Have you always wanted to own NASA? Here is your chance!, price: 35,000,000{money} - {prefix}buy NASA\n**FaceBook** - Have your own social media platform, price: 1,750,000{money} - {prefix}buy FaceBook\n**Google** - Have one of the biggest gaming company, price: {money} - {prefix}buy CocaCola\n**Spotify** - Have one of the biggest music companies, price: 5,000,000{money} - {prefix}buy Spotify", +"shopCompanyPage3":"**SpaceX** - You will have a big space company, price: 15,000,000{money} - {prefix}buy SpaceX\n**NASA** - Have you always wanted to own NASA? Here is your chance!, price: 35,000,000{money} - {prefix}buy NASA\n**Nintendo** - Own one of the biggest gaming companies, price: 80,000,000{money} - {prefix}buy Nintendo\n**Google** - Have one of the biggest search engine company, price: 200,000,000{money} - {prefix}buy Google\n**Tesla** - Have one of the biggest car companies, price: 500,000,000{money} - {prefix}buy Tesla", +"shopItemPage1":"**Padlock** - This padlock will stop all pesky robbers from trying to rob you, price: 1,000{money} - {prefix}buy padlock\n**Laptop** - With this laptop you will be able to upload memes and search for donations from people online, price: 3,000{money} - {prefix}buy laptop\n**Fishing rod** - This item lets you fish for fish, you can also be lucky and find other stuff while fishing, price: 5,000{money} - {prefix}buy fishingrod\n**Rifle** - This is a powerful rifle, you can use it to hunt animals and even find special species, price: 10,000{money} - {prefix}buy rifle", + +"reverseError":"..What should I reverse, try again with some text", +"rickroll":"You must join a voice channel first!", +"simpmachine":"Simp machine", +"simpmachinee":"Gay machine", +"simpIs":"is", +"simpyouare":"You are", +"youtube":"Hey, specify a video name and I'll search", +"youtubeUnable":"Unable to find, try something else..", +"zalgolize":"..What should I Zagolize, try again with some text", + +"buyInvalidItem":"This is not a valid item, please check {prefix}shop for more informations", +"buyAlreadyHaveCompany":"You already have this company, why do you eed another one", +"buyNotEnoughMoney":"You do not have enough to purchase this item", +"buySuccessful":"You have successfully purchased {baughtAmount} {boughtItem} for {baughtPrice}", + +"shortUrlError":"Provide me with a valid link", +"urlCreated":"Your Link has been created!", +"shorturlCooldown":"Slow down, you can only create 1 link each 5 minutes", +"youtubeCooldown":"Slow down, you can only search 1 video a minute ", + +"afk1":"Please make sure not to include mentions.", +"afk2":"you may not use the everyone ping", +"afk3":"W-why the.. thats a quiet big reason", +"afk4":"You can go afk every 20 seconds!", +"afk5":"You have been set to afk\n**Reason :**", +"afk6":"is currently afk:", +"afk7":"It seems like you've came back! I removed your afk\n\n**afk reason:** ", + +"antiinvites1":"You have to type `enable` or `disable` in order to enable/disable the module.", +"antiinvites3":"Succesfully disabled the anti invite module", +"antiinvites4":"Succesfully enabled the anti invite module", +"antilinks3":"Succesfully disabled the anti link module", +"antilinks4":"Succesfully enabled the anti link module", +"moduleEnabled":"The Module is already Enabled", +"moduleDisabled":"The Module is already disabled", +"serversettings1":"Server Settings", +"serversettings2":"Welcome", +"serversettings3":"Leave", +"serversettings4":"Anti Invite", +"serversettings5":"Anti Links", +"serversettings6":"Mod Log", +"serversettings7":"Server Prefix", +"disabled":"Disabled", +"enabled":"Enabled", +"farewell1":"Please provide me with a Valid Channel", +"farewell2":"The farewell messages has been disabled", +"farewell3":"I couldn't find that channel. Please mention a channel within this server.", +"farewell4":"The farewell messages has been enabled", +"greet1":"The welcome feature has been disabled", +"greet2":"The welcome feature has been enabled", +"serverlog1":"The server-logs module has been disabled", +"serverlog2":"The server-logs module has been set to", +"shorturlBlock1":"Please do not use that link, you have been **blocked** from the following command for **2 hours.**", +"shorturlBlock2":"You are **blocked** from the following command", +"properusage":"Proper Usage:", +"example":"Example:", +"cc1":"Your command name is above 30 characters!", +"cc2":"Your command content is above 2000 characters long!", +"cc3":"Added Command:", +"cc4":"The following command is already an existing command!", +"deletecmd1":"**Deleted** Command:", +"deletecmd2":"couldn't find the following command!", +"cc5":"The current guild has no Custom Commands!", +"cc6":"Custom Commands", +"bigError":"Could not send message, make sure your text is not really big.", +"flippingCoin":"Flipping Coin!...", +"callingError":"Please make sure your text is below 100 characters long!", +"capchaError":"Please make sure your text is below 60 characters long!", +"floorError":"Please make sure your text is below 40 characters long!", + +"noNews":"There are no news at the moment!", +"datePublished":"Date Published:", +"pinging":"Pinging...", +"timeTaken":"Time taken:", +"discordAPI":"Discord API:", +"nameS":"Name:", +"owner":"Owner", +"serverInfo1":"All | Members | Bots", +"verificationLevel":"Verification Level", +"channels":"Channels", +"roleCount":"Role Count", +"creationDate":"Creation Date", +"region":"Region", +"pogyOwners":"Pogy's Owners", +"pogyDevelopers":"Developers", +"pogyContributor":"Contributors", +"pogyInfo":"Pogy's Information", +"pogyGeneral":"General Information", +"pogyTeam":"Team Members", +"pogyStats":"Statistics", +"pogyVersion":"Version", +"pogyCommands":"Commands", +"userh":"User:", +"joinedDiscord":"Joined Discord At:", +"joinedServer":"Joined Server on:", +"roles":"Roles:", +"noRoles":"That user has no roles", +"noBadge":"That user has no bot badge", +"botBadges":"Bot Badges:", +"badgeslmao":"Badges:", +"users":"Users", + +"pfpAvatar":"{user}'s avatar", +"report1":"Hey, what would you like to report?", +"report2":"Please provide us with more information about the bug!", +"report3":"Hey, the owner recieved the bug, make sure to let him know, kindly join the", +"discrim1":"Please provide me with a valid user discriminator", +"none":"None", +"discrim3":"Found", +"discrim2":"Discriminator search", +"discrim4":"users with discriminator", +"invite":"Invite me [here]", +"isitup2":"Please provide me with a valid website!", +"isitup3":"The provided website is down!", +"suggest1":"What would you like to suggest!", +"suggest2":"Please provide us with more information for your suggestion", +"suggest3":"Hey, the owner recieved the suggestion, make sure to let him know, kindly join the", +"support":"Join the Support Server [here]", +"uptime1":"Pogy has been up for", +"vote":"Hey! You can vote for Pogy here:**\n\n**Top.gg:** [here](https://top.gg/bot/767705905235099658)\n**Bots for Discord:** [here](https://botsfordiscord.com/bot/767705905235099658)", +"define1":"Hey, please provide me with a word!", +"define2":"Couldn't find that word!", +"namse":"Word", +"define3":"Definition", +"define4":"Example", +"define5":"Powered by Urban Dictionary", +"isitup0":"This website is up!", + + +"useNoArgs0":"You did not specify an item to use", +"useNotUseableItem": "THis item is not useable", +"useInvalidItem":"This is not a valid item, valid items: {list}", +"useNoHaveItem":"You do not have a {item}", +"useNoHaveThatMuch":"You do not have {amount} {item} to use", +"useAlreadyHasPadlock":"You already have an active padlock", +"useSuccess":"You have successfully used {item}", + +"remind1":"Your Reminder is still running!", +"remind2":"Please type `start` To begin the `Reminder` setup!", +"remind3":"What do you want me to remind you? `(Max Length: 1024)`", +"remind4":"Please provide me with a Time Duration `(Max: 1d)`", +"remind5":"Finally, Would you like to set the reminder? Type `yes` to continue, and `cancel` to cancel it!", +"remind6":"Reminder Set!", +"remind7":"I have set a reminder!\n\n**Reminder:** `${reminder}`\n**Time:** `${reminderTime}`\n\nNote that by setting reminders you **agree** of being dmed", +"remind8":"A Reminder", +"remind9":"I was told to remind you , so here is your reminder!", +"remind10":"Guild Name:", +"remind11":"Time:", +"remind12":"Reminder:", +"remind13":" Couldn't dm you since your dms are closed!", +"remind14":"Wrong answer Reply, Operation Cancelled", +"remind15":"No answer after 30 seconds, operation canceled.", + +"huntNoHaveRifle":"You do not have a rifle to be able to hunt", + +"embedd1":"You already have an open Embed!", +"embedd2":"Please type `start` to start the embed builder!", +"embedd3":"Enter a **title** `limit: 256 characters` **[type cancel to cancel the process]**", +"embedd4":"Enter a **description** `limit: 2048 characters` **[type cancel to cancel the process]**", +"embedd5":"Enter a **color hex** `format: #000000`.\nType `Default` to use the bot's default color!\n\n**[type cancel to cancel the process]**", +"embedd6":"Enter a `thumbnail URL` for your embed **(OPTIONAL)**. Type `none` to skip this step.\n**[type cancel to cancel the process]**", +"embedd7":"Enter a image URL for your embed **(OPTIONAL)**. Type `none` to skip this step. \n*Only valid image URLs will work*\n\n**[type cancel to cancel the process]**", +"embedd8":"Enter a footer for your embed **(OPTIONAL)**. Type `none` to skip this step. \n**[type cancel to cancel the process]**", +"embedd9":"Would you like to have a timestamp in the embed? \n**[type cancel to cancel the process]**", +"embedd10":"Would you like to save the embed as a `Custom Command?` \n**[type cancel to cancel the process]**", +"embedd11":"What would you like to name your custom command? `[Max: 30 characters / 1 word]`\n **[type cancel to cancel the process]**", +"embedd12":"That command is already an existing bot command!", +"embedd13":"I have created your custom command!\nUsage:", +"embedd14":"This is already a command!", +"embed15":"Embed Builder Cancelled", +"embedd16":"30 seconds passed, and you did not answer, Embed Builder Cancelled", +"embedd17":"Finally, please **mention** the channel you would like to send the embed to! \n**[type cancel to cancel the process]**", + +"huntSuccessCaught":"You have successfully caught {amount} {animal}", +"huntTime":"You already hunted recently\nTry again in: {timeMinute}m {timeSecond}s", + +"postmemeNoHaveLaptop":"You do not have a laptop to post memes", +"postmemePrompt":"__**Where would you like to post this meme**__\n`n` | Normie Meme\n`e` | Edgy Meme\n`r` | Reposted Meme\n`d` | Dank Meme", + +"tiktok1":"Please provide me with a user profile!", +"tiktok2":"User Info", +"tiktok3":"Username", +"tiktok4":"Nickname", +"tiktok5":"Bio", +"tiktok6":"Followers", +"tiktok7":"Following", +"tiktok8":"Hearts", +"tiktok9":"Requested by", +"tiktok10":"Could not find username:", + +"poll1":"__**Proper Usage**__\n`1-` {prefix}poll {title} [option 1] [option 2] [option 3] **(Max 20)**\n`2-` {prefix}poll \"time\" {title} [option 1] [option 2] [option 3] **(Max 20)** **(s/m/h/d/w)**\n\n__**Examples:**__\n`1-` {prefix}poll {Is Pogy the best Bot?} [yes] [no] [maybe]\n`2-` {prefix}poll \"1d\" {Is Pogy the best Bot?} [yes] [no] [maybe]", +"poll2":"You can't have more than 20 options in a poll", +"poll3":"Ends at:", +"poll4":"It was a tie!", +"poll5":"The Poll was a Tie!", +"votes":"Votes", +"votess":"Vote", +"poll6":"Tied on", +"poll7":"The winner of the poll was option", +"with":"with", +"votesss":"vote(s)", +"poll8":"(Poll was Deleted)", + +"list":"List", +"members1":"No members with the {cap} Role exist!", +"members2":"__**Proper Usage**__\n{prefix}members \n\n__**Examples**__\n`1-` {prefix}members @members\n`2-` {prefix}members Members\n`3-` {prefix}members all", +"emoji1":"Emoji List", +"emoji2":"No emojis found in this server", + +"suggesting1":"This feature hasn't been set up yet in this guild", +"suggesting2":"It seems like the suggestion channel got either deleted or is invalid.", +"suggesting3":"New Suggestion", +"suggesting4":"Suggested by", +"suggesting5":"I do not have permission to talk in the suggestion channel, please check my permissions.", +"suggesting6":"I have sent your suggestion to", +"suggesting7":"__**Proper Usage**__\n`1-` {prefix}suggestion enable #channel\n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve \n`4-` {prefix}suggestion decline \n\n__**Examples**__\n`1-` {prefix}suggestion enable #suggestions\n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve 7347284293428 Added it!\n`4-` {prefix}suggestion decline 7347284293428 Owner Declines", +"suggesting8":"The Suggestion Module is already disabled.", +"suggesting9":"I have disabled The suggestion Module.", +"suggesting10":"is already a suggestion Channel!", +"suggesting11":"I have set the Suggestion Channel to", +"suggesting12":"Please Provide me with a message ID", +"suggesting13":"I couldn't find the following Message!", +"suggesting14":"Suggestion Approved", +"suggesting15":"The Following Suggestion has already been judged and been approved.", +"suggesting16":"The Following Suggestion has already been judged and Declined.", +"suggesting17":"Your Reason Must be Below 600 Characters Long!", +"suggesting18":"The following Suggestion was Approved", +"suggesting19":"Approved By:", +"suggesting20":"I have Approved the Suggestion in", +"suggesting21":"Suggestion Declined", +"suggesting22":"The following Suggestion was Declined", +"suggesting23":"Declined By:", +"suggesting24":"I have Declined the Suggestion in", +"reason":"Reason:", + +"reportt1":"__**Proper Usage**__\n`1-` {prefix}report enable #channel\n`2-` {prefix}report disable\n`3-` {prefix}report user @user \n`4-` {prefix}report issue \n\n__**Examples**__\n`1-` {prefix}report enable #server-reports\n`2-` {prefix}report disable\n`3-` {prefix}report user @peter Disrespecting Mods\n`4-` {prefix}report issue ticket isn't working", +"report4":"Reporting Is already Disabled", +"report5":"I have Disabled the Report Module!", +"report6":"Is already a Report Channel", +"report7":"I have set The report Channel to", +"report8":"You can't Report yourself", +"report9":"You can't Report a Bot", +"report10":"The Report Module is Disabled in the current Guild.", +"report11":"I couldn't find the Report Channel", +"report12":"Why would you like to report?", +"report13":"Your report reason is too short", +"report14":"Your Report description is too Long!", +"report15":"Your Report has been recieved!", +"report16":"Server Reports", +"report17":"A New Report has been recieved!", +"report18":"User", +"report19":"User ID", +"report20":"User Tag", +"report21":"Reported User", +"report22":"Reported User ID", +"report23":"Reported User Tag", +"report24":"Report Channel", +"report25":"Time", +"report26":"Report Case", +"report27":"Report Reason", +"report28":"I'm sorry but I couldn't send your report due to missing permissions, please let the owner know!", +"report29":"Case", +"missingUser":"Missing User Permissions", +"missingUser1":"Command Name: **report**\nRequired Permission: **Manage Messages**", +"tempvc1":"__**Proper Usage**__\n`1-` {prefix}tempvc enable\n`2-` {prefix}tempvc disable\n\n__**Examples:**__\n`1-` {prefix}tempvc enable\n`2-` {prefix}tempvc disable", +"tempvc2":"Command Name: **Temp Voice Chat**\nRequired Permission: **Manage Channels**", +"tempvc3":"Temp Vc is already disabled!", +"tempvc4":"I have Disabled Temp Voice chat", +"tempvc5":"Loading...", +"tempvc6":"Setting Up", +"tempvc7":"Category Created", +"tempvc8":"Category Found!", +"tempvc9":"Created Voice Channel", +"tempvc10":"Voice Channel Found", +"tempvc11":"**Please run {prefix}tempvc on again**", +"tempvc12":"Set Up Done!", +"tempvc13":"Category:", +"tempvc14":"Voice Channel:", +"tempvc15":"Setup done, you can go ahead and edit the channels!\n\nTo disable, you may use", +"tempvc16":"Set-Up failed, please re-run the command, if this keeps happening make sure the voice channel & category called **join to create** are deleted", + +"ticketsetupNoPerms":"You need the `Administrator` permission to use this command", +"ticketsetupSetupTitle":"Ticket Setup", +"ticketsetupToChooseFrom":"__**Please Pick:**__\n\n`reaction`\nTicketing with Reactions\n\n`Message`\nTicketing with a command", +"ticketsetupTimeEnded":"The time has ended, prompt ended", +"ticketsetupInvalidChoice":"Invalid Choice\n\n__**Available Choices:**__ {toChooseFrom}", +"ticketsetupReaction":"Reaction", +"ticketsetupMessage":"Message", +"ticketsetupReactionChannelID":"Please Provide me with the **channel** you would like people to react in!\n****\n\n**Type Cancel to Cancel**", +"ticketsetupReactionInvalidChannel":"Prompt Cancelled, the channel provided is either invalid or I do not have permissions to see that channel!", +"ticketsetupReactionCustomChoice":"__**Please Pick**__\n\n`bot`\nPeople will react to the bot's default reaction Embed\n\n`Custom`\nPeople will react to a provided message of your choice (message ID)", +"ticketsetupReactionCustomMessageID":"Please Provide me with a **message ID** from the channel you provided earlier.\n\n**Type Cancel to Cancel**", +"ticketsetupReactionCustomInvalidMessageID":"Could not reach the following Message ID, prompt cancelled!", +"ticketsetupReactionCustomCategory":"Please provide me with a category where all tickets will be stored\n**[category ID / Name]**\n\n**Type Cancel to cancel**", +"ticketsetupReactionCustomInvalidCategory":"The category provided is invalid, prompt cancelled!", +"ticketsetupReactionCustomNotCategory": "The channel provided is not a category!", +"ticketsetupReactionCustomSuccess":"Successfully created the ticket system!\n\n**Option:**{option}", +"ticketsetupReactionCustomRole":"Please provide me with a support Role that will have access to all tickets\n\n**Type Cancel to cancel**", +"ticketsetupReactionCustomInvalidRole":"Invalid Role Provided, prompt Cancelled!", +"ticketsetupReactionCustomModLogs":"Lastly, please provide me with a ticket log where all logs will log there!\n\n**Type Cancel to cancel**", +"ticketsetupReactionMaxTicket":"Finally, please specify how many tickets a member can create", +"ticketsetupReactMaxTicketNaN":"The max ticket amount must be a number", + +"ticketTicketWord":"Server Tickets", +"ticketHowToCreate":"Please react with 🎫 to open a ticket!", +"ticketPromptseggs":"Succesfully Cancelled Prompt", +"ticketAlreadyOpen":"You already have an open ticket builder!", + +"claimNotValidChannel":"The ticket you are trying to claim is not a valid ticket", +"claimNotHaveRole":"You do not have the {roleName} role to use this command", +"claimSuccess":"{userName} have claimed the ticket, he will now assist you.", + +"unclaimNotValidChannel":"The ticket you are trying to unclaim is not a valid ticket", +"unclaimNotHaveRole":"You do not have the {roleName} role to use this command", +"unclaimSuccess":"{userName} have unclaimed the ticket, he will no longer assist you.", +"unclaimDontHavePerms":"I do not have permission to change permissions in this channel, please check my permissions", + +"ticketNewTicketTitle":"New Ticket", +"ticketNewTicketWelcome":"Welcome to your ticket {userTag}", +"ticketNewTicketWaitForAssistant":"Thank you for creating a ticket, the support team will be with you shortly\n\nIn the mean time, please explain your issue below", +"ticketOpenedBy":"Ticket opened by", +"ticketEmbedTitleInfo":"Information", +"ticketEmbedValueInfo":"**User:** {user}\n**Ticket Channel: **{chanName}\n**Ticket:** #{serverCase}\n**Date:** {ticketDate}", +"ticketYouHaveOpen":"You already have an open ticket", + +"addNotValidChannel":"This is no a valid ticket channel", +"addNotSpecifyUser":"You did not specify a user", + +"setdaysInvalidArg":"Please specify a valid day, it also must be a number", +"setdaysSuccess":"Successfully changed the alternative axcounts age restriction", + +"abypassNotPremium10":"You cannot have more than 10 IDs since this guild is not premium", +"abypassSuccess":"I have successfully added {userID} to the users who can bypass the system", +"abypassNotValidUser":"This is not a valid userID to bypass", + +"adisallowNotInArray":"This user is not bypassing the alt detector", +"adisallowSucess":"This user has been successfully removed", + +"aactionNotValidChoice":"You need to specify between: {allChoices}", +"aactionSuccess":"I have successfully changed the action to {action}", + +"amodlogNotValidChannel":"The channel you provided is not a valid channel", +"amodlogSuccess":"I have successfully set {modLog} as the modlog channel", + +"atoggleSuccess":"The alt detector is now {toggle}", + +"addquestionMoreThanLength":"You cannot add more than {amountLength} questions", +"addquestionSuccess":"I have succesfully added all the questions", +"addquestionMissingArg":"You need to specify question(s)\n\nTip: Use the | symbol to seperate each question", + +"remquestion":"Please specify the valid ID of the questions", +"remquestionSuccess":"I have successfully removed this question", + +"questionNoQuest":"This server does not have any questions", +"questionTitle":"Questions in this server" +} \ No newline at end of file diff --git a/data/language/french.json b/data/language/french.json new file mode 100644 index 00000000..0d60fa95 --- /dev/null +++ b/data/language/french.json @@ -0,0 +1,607 @@ +{ + "setLangInvalidPermission":"Vous avez besoin de l'autorisation ADMINISTRATEUR pour exécuter cette commande", + "setLangMissingArgument":"Vous n'avez pas spécifié une langue", + "setLangInvalidOption":"Veuillez spécifier entre: {languages}", + "setLangChange":"Langue modifiée en {language}", + + "setPrefixInvalidPermission":"Vous avez besoin de l'autorisation ADMINISTRATEUR pour exécuter cette commande", + "setPrefixMissingArgument":"Vous n'avez pas spécifié le nouveau préfixe", + "setPrefixLongLength":"La longueur du préfixe ne peut pas être supérieure à 5", + "setPrefixChange": "Le préfixe a été remplacé par {prefix}", + + "helpInvalidCommand":"Commande non valide", + "helpInvalidListCommand":"Faites `{prefix}help` pour la liste des commandes.", + "helpCommand":"Command", + "helpDescription":"Description", + "helpAlias":"Alias", + "helpUsage":"Usage", + "helpCategory":"Catégorie", + "helpInviteBot":"Invitez le bot", + "helpSupportServer":"Serveur d'assistance", + "serverInfo1":"All | Members | Bots", + "workJobTitle": "Emplois disponibles", + "workJobPage":"Page", + "workJobArtist":"{emoji} | **Artiste** - {prefix}work job artist", + "workJobChef": "{emoji} | **Chef** - {prefix}work job Chef", + "workJobFirefighter": "{emoji} | **Pompier** - {prefix}work job firefighter", + "workJobDoctor": "{emoji} | **Docteur** - {prefix}work job doctor", + "workJobTeacher": "{emoji} | **Professeur** - {prefix}work job teacher", + "workJobLifeguard": "{emoji} | **Sauveteur** - {prefix}work job lifeguard", + "workJobDetective": "{emoji} | **Détective** - {prefix}work job detective", + "workJobFarmer": "{emoji} | **Fermier** - {prefix}work job farmer", + "workJobButcher":"{emoji} | **Boucher** - {prefix}work job butcher", + "workJobLawyer":"{emoji} | **Avocat** - {prefix}work job lawyer", + "workInvalidArg0": "Vous n'avez pas spécifié entre {array}", + "workJobInvalidArg0": "Choix de travail non valide, vérifiez les informations de travail de {prefix}work info pour plus d'informations", + "workHasJob": "Vous avez déjà un emploi, utilisez {prefix}work quit pour quitter votre emploi", + "workHasNoJob": "Vous n'avez pas de travail à quitter", + "workJobNotEnoughSucceed": "Vous n'avez pas encore déverrouillé le travail {userJob}", + "workJobSuccessQuit": "Vous avez quitté votre emploi avec succès", + "workJobNoHave": "Vous n'avez pas de travail à travailler, vérifiez les informations de travail de {prefix}work info pour plus d'informations", + "workJobGot": "Vous travaillez maintenant en tant que {newWork}", + "workJobTime": "Vous avez déjà travaillé récemment \nRéessayez dans: {timeMinute}m {timeSecond}s", + "workFail": "Vous avez échoué dans votre travail et vous n'avez pas reçu d'argent", + "workSucceed": "Vous avez travaillé et vous avez gagné {moneyAmount}{emoji}", + + "searchPlaces": ["poche", "placard", "canapé", "sac-à-main", "lit", "maison", "rue", "toilette", "voiture", "chiffon", "téléphone", "jeux","pantalon","chemise","musée"," cinéma","centre commercial","air","magasin","supermarché","maison"], + "searchTime": "Vous avez déjà effectué une recherche récemment \nEssayez à nouveau dans: {timeMinute}m {timeSecond}s", + "searchToChoose": "Veuillez choisir où vous souhaitez effectuer la recherche entre:`{place1}`,`{place2}`,`{place3}`", + "searchSucceed": "Vous avez recherché dans {place} et trouvé {money}{emoji}", + "searchInvalidChoice": "Ce n'est pas un endroit valide pour rechercher", + + "balanceTitle": "Solde de {user}", + "balanceCheck": "Cash: {money}{emoji}\nBanque: {bank}/{bankspace}\nTotal: {total}", + + "depositMissingArg0": "Vous n'avez pas précisé le montant que vous souhaitez déposer", + "depositSuccessfull": "J'ai déposé avec succès {money} à votre banque", + "depositMaxBank": "Votre banque est pleine", + "depositNoMoney": "Vous n'avez pas d'argent à déposer dans votre banque", + "depositNegative": "Vous ne pouvez pas déposer d'argent négatif", + "depositIsNan": "Le montant que vous déposez doit être un nombre", + "depositNotEnoughMoney": "Vous n'avez pas autant d'argent à déposer", + "depositBankNoFit": "Votre banque ne peut pas accueillir autant d'argent", + "DepositSuccessNumber": "Le dépôt de {amount}{emoji} a bien été effectué dans votre banque", + + "withdrawMissingArg0": "Vous n'avez pas précisé le montant que vous souhaitez déposer", + "withdrawNoMoney": "Vous n'avez pas d'argent dans votre banque à retirer", + "withdrawSuccessful": "Retrait réussi de {bankMoney}{emoji} de votre banque", + "withdrawNegative": "Vous ne pouvez pas retirer d'argent négatif", + "withdrawIsNan": "Le montant que vous retirez doit être un nombre", + "withdrawMoreThanHave": "Vous ne pouvez pas retirer plus d'argent que ce que vous avez", + "withdrawSuccessNumber": "Retrait réussi de {amount}{emoji} de votre banque", + + "warnMissingUser": "Vous avez oublié de spécifier un utilisateur!", + "warnMissingPermission": "Vous ne disposez pas de l'autorisation Gérer les rôles pour utiliser cette commande", + "warnHigherRole": "Vous ne pouvez pas avertir un utilisateur avec un rôle supérieur au vôtre", + "warnSuccessful": "{emoji} | **{user}** a été averti", + "warnLogTitle": "Nouvel avertissement!", + "warnLogDescription": "**Personnel**: {auteur} \n**Membre**: {user} \n**Raison**: {reason}", + + + "birdError": "Une erreur s'est produite dans la commande bird, si cela continue de se produire, veuillez contacter le propriétaire!", + + + "catError":"Une erreur s'est produite dans la commande cat, si cela continue de se produire, veuillez contacter le propriétaire!", + + + "changeError":"Une erreur s'est produite dans la commande change my mind, si cela continue de se produire, veuillez contacter le propriétaire!", + "changeErrorValid":"Veuillez me fournir un texte", + "changeErrorCharacter":"Veuillez fournir un texte de 85 caractères ou moins", + + + "clydeError":"Une erreur s'est produite dans la commande clyde, si cela continue de se produire, veuillez contacter le propriétaire!", + "clydeErrorCharacter":"Veuillez fournir un texte de 60 caractères ou moins", + + "generating":"Produire...", + + "magikError":"Une erreur est survenue dans la commande magik, si cela continue de se produire, veuillez contacter le propriétaire!", + +"mcErrorCharacter": "Veuillez fournir un texte de 25 caractères ou moins", + +"phubErrorCharacter": "Veuillez fournir un texte de 50 caractères ou moins", + +"cmdHandlerNoPerms": "Vous avez besoin de {permission} pour utiliser cette commande", + + "warningsNoError":"n'a aucun avertissement", + "warnName": "Liste des avertissements", + "warnModerator": "Modérateur", + "warnReason": "Raison", + "warnID": "Avertir l'ID", + "warnDateIssued": "Date d'émission", + "warnList":"Liste d'avertissement", + "warnAction": "Action du modérateur", + "warnExpire": "Expire dans 3 minutes", + + "slapError":"Veuillez me fournir un utilisateur valide", + + "trumpError":"Une erreur s'est produite dans la commande trump tweet, si cela continue de se produire, veuillez contacter le propriétaire!", + + "urlshortnerMissingArg": "Le lien spécifié n'est pas valide", + "urlshortnerSuccessful": "Le lien a bien été créé, cliquez ici: https://url.pogy.xyz/{shortUrl}", + + "banError":"Vous avez besoin de l'autorisation Interdire les membres pour utiliser cette commande", + "banUserValid":"Veuillez fournir une mention / un identifiant d'utilisateur valide", + "banYourselfError":"Vous ne pouvez pas vous interdire", + "banHigherRole":"L'utilisateur fourni a un rôle égal ou supérieur à vous.", + "banBannable":"Je ne peux pas bannir cet utilisateur car il n'est pas bannable", + "noReasonProvided":"Aucune raison fournie", + "banBan":"a été banni.", + + "kickMissingPermission":"Vous avez besoin de l'autorisation Kick Members pour utiliser cette commande", + "kickYourself":"Tu ne peux pas te donner un coup de pied", + "kickKickable":"Je ne peux pas interdire cet utilisateur car il n'est pas kickable", + "kickKick":"a été expulsé.", + "muteMissingPerms":"Vous ne disposez pas des autorisations nécessaires pour utiliser cette commande", + "muteMissingPermsBot":"Je n'ai pas l'autorisation d'utiliser cette commande", + "muteTime":"Ce n'est pas une durée valide pour couper le membre.", + "muteRolePosition":"Je ne peux pas couper ce membre car leurs rôles sont plus élevés que les miens.", + "muteRolePositionBot":"Je ne peux pas couper le son de ce membre parce que le rôle `Muted` est plus élevé que le mien.", +"muteMuted":"Ce membre est déjà désactivé.", +"muteMember":"Membre", +"muteLength":"Longueur", + +"rmPermission":"Vous n'êtes pas autorisé à retirer des membres.", +"rmPosition":"Vous ne pouvez pas retirer ce membre car son rôle est supérieur au vôtre.", +"rmNoWarning":"This member doesn't have any warnings.", +"rmWarnInvalid":"Il s'agit d'un identifiant d'avertissement non valide.", + +"managemessages":"Hé ... Cette fonctionnalité n'est disponible que pour les membres avec **Manage Messages**", +"notaccessible":"Cette chaîne ne m'est pas accessible", +"whatdoIsay":"Ecrivez-le encore, mais donnez-moi un texte!", +"sendmessages":"Je n'ai pas la permission d'envoyer des messages!", +"userSendMessages":"Vous n'êtes pas autorisé à envoyer un message dans le canal fourni", + +"coiniflippedacoinfor":"J'ai retourné une pièce pour", +"coinitwas":"c'était", +"emojify":"Ecrivez-le encore, mais avec un texte!", +"dontmention":"Tu n'as pas besoin de mentionner quelqu'un", +"emojifyError":"Impossible d'envoyer le message, assurez-vous que votre texte n'est pas vraiment volumineux", + + +"f1":"a payé leurs respects.", +"f2":"a rendu hommage à", +"f3":"Appuyez sur F pour rendre hommage.", + +"hack1":"Woaaah ralentit, qui piratons-nous?", +"hackbot":"Vous ne pouvez pas vraiment pirater un bot", +"hack2":"pog", +"hack3":"sexy", +"hack4":"garçon", +"hack5":"signifier", +"hack6":"intello", +"hack7":"Veux sortir?", +"hack8":"Elle est chaude", +"hack9":"C'est tellement POG", +"hack10":"C'est tellement gros", +"hack11":"Nous sommes sur le point de pirater", +"hack12":"tout commence maintenant ...", +"hack13":"Recherche de connexion Discord ... (2fa contourné)", +"hack14":"Recherche du mot le plus courant ...", +"hack15":"Vente de données au gouvernement ...", +"hack16":"Signaler un compte à discord pour avoir rompu les conditions de service ...", +"hack17":"Piratage terminé", +"hack18":"Le hack était terminé.", + +"softbanNoPerm": "Vous avez besoin de l'autorisation d'interdire les membres pour utiliser cette commande", +"softbanNoUser": "Vous n'avez pas spécifié un utilisateur valide", +"softbanSelfUser": "Vous ne pouvez pas vous softban vous-même", +"softbanEqualRole": "L'utilisateur fourni a un rôle égal ou supérieur à vous", +"softbanNotBannable": "Cet utilisateur n'est pas bannable", +"softbanNoReason": "Aucune raison fournie", +"softbanResponsible": "Utilisateur responsable", +"softbanSuccess": "J'ai réussi le softbanned", + +"unbanNoPerm": "Vous avez besoin de l'autorisation d'interdire les membres pour utiliser cette commande", +"unbanInvalidID": "Ceci n'est pas un ID utilisateur valide", +"unbanNoReason": "Aucune raison fournie", +"unbanResponsible": "Utilisateur responsable", +"unbanSuccess": "Désinscription réussie", + +"kill1":"Wow, c'était super ... Mais qui dois-je tuer?", +"kill2":"Bruh, tu sembles déprimé. Comment puis-je aider?", +"kill3":"assis sur", +"kill4":", comme l'autre tristement *étouffé*", +"kill5":"meurt d'avoir dansé trop fort", +"kill6":"décédé d'une crise cardiaque", +"kill7":"mort de ne pas avoir mangé beaucoup de cul", +"kill8":"l'a tué tout de suite,", +"kill9":"semble vraiment sympa ... pourquoi lui", +"kill10":"est allé se battre", +"kill11":", mais a été **assommé** au premier tour", +"kill12":"trébuché et tristement mort", +"kill13":"implorait pardon, mais", +"kill14":"l'a tué tout de suite", +"kill15":"mort du sida", +"kill16":"ne pouvait pas gérer", +"kill17":"'s stupidité, alors il lui a tiré dessus", +"kill18":"est mort en escaladant le mur de Chine", +"kill19":"est mort en *volant* une banque", +"kill20":"décédé en étudiant l'histoire", +"kill21":"assis sur", +"kill22":"le tuer", +"kill23":"giflé", +"kill24":"est trop faible pour gérer cela", +"kill25":"Pogy s'assit sur", +"kill26":", l'autre tristement *étouffé*", +"kill27":"Pogy giflé", +"kill28":"avec un micro-onde", +"kill29":"mort de faim", +"kill30":"semble vraiment innocent", +"kill31":"Désolé", +"kill32":"semble trop gentil, je ne peux pas", +"kill33":"a été heurté par une voiture", + +"unmuteRolePosition": "La position du rôle muet est plus élevée que la mienne", +"unmuteUserRoleHigher": "Le rôle des utilisateurs est supérieur au mien, je ne peux donc pas le réactiver", +"unmuteNotMuted": "Ce membre n'est pas désactivé", +"unmuteNoMutedRole": "Il n'y a pas de rôle Muted, mais dès que vous couperez le son de quelqu'un, un sera automatiquement créé", +"unmuteNoUser": "Vous avez oublié de spécifier un utilisateur", + +"rate1":"Je te donnerais un", +"rate2":"Votre article semble ÉNORME! Je ne pouvais pas vraiment évaluer ...", +"rate3":".. Euh, devrais-je me noter? Eh bien, je me donnerais un 10/10!", +"rate4":"Je donnerais", +"rate5":"une", + +"shopMissingArg0": "Vous n'avez pas spécifié entre {choose}", +"shopCompany": "Entreprises", +"shopItem": "Articles", +"shopCompanyPage1": "**McDonald** - Avoir votre propre restaurant de restauration rapide, prix: 5 000{money} - {prefix}buy McDonald\n**Target** - avoir votre propre objectif, prix: 15 000{money} - {prefix}buy target\n**Walmart** - Avoir votre propre Walmart, prix: 30 000{money} - {prefix}buy Walmart\n**FedEx** - Avoir votre propre entreprise de messagerie, price: 65 000{money} - {prefix}buy FedEx\n**StarBucks** - Avoir votre propre starbucks, price: 115 000{money} - {prefix}buy StarBucks", +"shopCompanyPage2": "**Boeing** - Vous pouvez l'acheter si vous avez toujours voulu un avion, prix: 200 000{money} - {prefix}buy Boeing\n**BuzzFeed** - Ayez votre propre buzzfeed et diffusez les nouvelles environ, prix: 500 000{money} - {prefix}buy BuzzFeed\n**FaceBook** - Avoir votre propre plateforme de médias sociaux, prix: 1 750 000{money} - {prefix}buy FaceBook\n**CocaCola** - Avoir le vôtre, une énorme entreprise de boissons, prix: 3 250 000{money} - {prefix}buy CocaCola\n**Spotify** - Avoir l'une des plus grandes compagnies de musique, prix: 5 000 000{money} - {prefix}buy Spotify", +"shopCompanyPage3": "** SpaceX ** - Vous aurez une grande société spatiale, prix: 15 000 000{money} - {prefix}buy SpaceX\n**NASA** - Avez-vous toujours voulu posséder la NASA? Voici votre chance !, prix: 35 000 000{money} - {prefix}buy NASA\n**Nintendo** - Posséder l'une des plus grandes sociétés de jeux vidéo, prix: 80 000 000{money} - {prefix}buy Nintendo\n**Google** - Avoir l'une des plus grandes sociétés de moteurs de recherche, prix: 200 000 000{money} - {prefix}money Google\n**Tesla** - Avoir l'une des plus grandes entreprises automobiles, prix: 500 000 000{money} - {prefix}buy Tesla", +"shopItemPage1":"**Cadenas** - Ce cadenas empêchera tous les voleurs embêtants d'essayer de vous voler, prix: 1 000{money} - {prefix}buy Padlock\n**Ordinateur portable** - Avec cet ordinateur portable, vous allez pouvoir télécharger des mèmes et rechercher des dons de personnes en ligne, prix: 3 000{money} - {prefix}buy laptop\n**Canne à pêche** - Cet article vous permet de pêcher du poisson, vous pouvez également avoir de la chance et en trouver d'autres trucs pendant la pêche, prix: 5 000{money} - {prefix}buy fishingrod\n **Fusil** - C'est un fusil puissant, vous pouvez l'utiliser pour chasser des animaux et même trouver des espèces spéciales, prix: 10 000{money} - {prefix}buy rifle", + +"reverseError":".. Que dois-je inverser, réessayer avec du texte", +"rickroll":"Vous devez d'abord rejoindre un canal vocal!", +"simpmachine":"Machine Simp", +"simpmachinee":"Machine Gay", +"simpIs":"est", +"simpyouare":"Tu es", +"youtube":"Hé, spécifiez un nom de vidéo et je chercherai", +"youtubeUnable":"Impossible de trouver, essayez autre chose.", +"zalgolize":".. Que dois-je zagoliser, réessayer avec du texte", + +"buyInvalidItem": "Ce n'est pas un article valide, veuillez consulter {prefix}shop pour plus d'informations", +"buyAlreadyHaveCompany": "Vous possédez déjà cette société, pourquoi en avez-vous une autre", +"buyNotEnoughMoney": "Vous n'avez pas assez pour acheter cet article", +"buySuccessful": "Vous avez acheté avec succès {baughtAmount} {baughtItem} pour {baughtPrice}", + + +"shortUrlError":"Fournissez-moi un lien valide", +"urlCreated":"Votre lien a été créé!", +"shorturlCooldown":"Ralentissez, vous ne pouvez créer qu'un lien toutes les 5 minutes", +"youtubeCooldown":"Ralentissez, vous ne pouvez rechercher qu'une vidéo par minute ", + +"afk1":"Veuillez vous assurer de ne pas inclure de mentions.", +"afk2":"vous ne pouvez pas utiliser le everyone ping", +"afk3":"C'est une grande raison tranquille", +"afk4":"Ralentissez, vous pouvez aller afk toutes les 20 secondes!", +"afk5":"Vous avez été défini sur afk \n**Raison:**", +"afk6":"est actuellement afk:", +"afk7":"Il semble que tu sois revenu! J'ai supprimé votre afk\n\n**raison afk:**", + +"antiinvites1":"Vous devez taper «enable» ou «disable» pour activer / désactiver le module.", +"antiinvites3":"Avec succès désactivé le module anti-invitation", +"antiinvites4":"Avec succès activé le module anti-invitation", +"antilinks3":"Désactivé avec succès le module anti-lien", +"antilinks4":"Activation réussie du module anti-lien", +"moduleEnabled":"Le module est déjà activé", +"moduleDisabled":"Le module est déjà désactivé", +"serversettings1":"Paramètres du serveur", +"serversettings2":"Bienvenu", +"serversettings3":"Laisser", +"serversettings4":"Anti invitation", +"serversettings5":"Anti Liens", +"serversettings6":"Journal des mods", +"serversettings7":"Préfixe de serveur", +"disabled":"Désactivé", +"enabled":"Activé", +"farewell1":"Veuillez me fournir une chaîne valide", +"farewell2":"Les messages d'adieu ont été désactivés", +"farewell3":"Je n'ai pas trouvé cette chaîne. Veuillez mentionner un canal dans ce serveur.", +"farewell4":"Les messages d'adieu ont été activés", +"greet1":"La fonction de bienvenue a été désactivée", +"greet2":"La fonction de bienvenue a été activée", +"serverlog1":"Le module server-logs a été désactivé", +"serverlog2":"Le module server-logs a été défini sur", +"shorturlBlock1":"Veuillez ne pas utiliser ce lien, vous avez été **bloqué** depuis la commande suivante pendant **2 heures.**", +"shorturlBlock2":"Vous êtes **bloqué** par la commande suivante", +"properusage":"Utilisation correcte:", +"example":"Exemple:", +"cc1":"Le nom de votre commande contient plus de 30 caractères!", +"cc2":"Le contenu de votre commande dépasse 2000 caractères!", +"cc3":"Commande ajoutée:", +"cc4":"La commande suivante est déjà une commande existante!", +"deletecmd1":"**Commande supprimée**:", +"deletecmd2":"n'a pas pu trouver la commande suivante!", +"cc5":"La guilde actuelle n'a pas de commandes personnalisées!", +"cc6":"Commandes personnalisées", +"bigError":"Impossible d'envoyer le message, assurez-vous que votre texte n'est pas vraiment volumineux.", +"flippingCoin":"Pièce retournée!...", +"callingError":"Veuillez vous assurer que votre texte contient moins de 100 caractères!", +"capchaError":"Veuillez vous assurer que votre texte comporte moins de 60 caractères!", +"floorError":"Veuillez vous assurer que votre texte comporte moins de 40 caractères!", + +"noNews":"Il n'y a pas de nouvelles pour le moment!", +"datePublished":"Date publiée:", +"pinging":"cliqueter...", +"timeTaken":"Temps pris:", +"discordAPI":"L'API Discord:", +"nameS":"Nom:", +"owner":"Propriétaire", +"verificationLevel":"Niveau de vérification", +"channels":"Chaînes", +"roleCount":"Nombre de rôles", +"creationDate":"Date de création", +"region":"Région", +"pogyOwners":"Propriétaires de Pogy", +"pogyDevelopers":"Développeurs", +"pogyContributor":"Contributeurs", +"pogyInfo":"Informations de Pogy", +"pogyGeneral":"Informations générales", +"pogyTeam":"Membres de l'équipe", +"pogyStats":"Statistiques", +"pogyVersion":"Version", +"pogyCommands":"Commandes", +"userh":"Utilisateur:", +"joinedDiscord":"Ja rejoint Discord à:", +"joinedServer":"Serveur rejoint sur:", +"roles":"Rôles:", +"noRoles":"Cet utilisateur n'a aucun rôle", +"noBadge":"Cet utilisateur n'a pas de badge de robot", +"botBadges":"Badges de bot:", +"badgeslmao":"Badges:", +"users":"Utilisateurs", + + +"pfpAvatar":"L'avatar de {user}", +"report1":"Hé, que souhaitez-vous signaler?", +"report2":"Veuillez nous fournir plus d'informations sur le bogue!", +"report3":"Hé, le propriétaire a reçu le bogue, assurez-vous de le lui faire savoir, veuillez rejoindre le", +"discrim1":"Veuillez me fournir un discriminateur d'utilisateur valide", +"none":"Aucun", +"discrim3":"J'ai Trouvé", +"discrim2":"Recherche de discriminateurs", +"discrim4":"utilisateurs avec discriminateur", +"invite":"Invitez-moi [ici]", +"isitup2":"Veuillez me fournir un site Web valide!", +"isitup3":"Le site Web fourni est en panne!", +"suggest1":"Que souhaitez-vous suggérer!", +"suggest2":"Veuillez nous fournir plus d'informations pour votre suggestion", +"suggest3":"Hé, le propriétaire a reçu la suggestion, assurez-vous de le lui faire savoir, veuillez rejoindre le", +"support":"Rejoignez le serveur de support [ici]", +"uptime1":"Pogy est debout pour", +"vote":"Hé!, Vous pouvez voter pour Pogy ici:**\n\n**Top.gg:** [ici](https://top.gg/bot/767705905235099658)\n**Bots for Discord:** [ici](https://botsfordiscord.com/bot/767705905235099658)", +"define1":"Hé, donnez-moi un mot!", +"define2":"Je n'ai pas trouvé ce mot!", +"namse":"Mot", +"define3":"Définition", +"define4":"Exemple", +"define5":"Propulsé par Urban Dictionary", +"isitup0":"Ce site est en place et active!", + +"useNoArgs0": "Vous n'avez pas spécifié d'élément à utiliser", +"useNotUseableItem": "Cet élément n'est pas utilisable", +"useInvalidItem": "Ceci n'est pas un élément valide, éléments valides: {list}", +"useNoHaveItem": "Vous n'avez pas de {item}", +"useNoHaveThatMuch": "Vous n'avez pas {amount} {item} à utiliser", +"useAlreadyHasPadlock": "Vous avez déjà un cadenas actif", +"useSuccess": "Vous avez utilisé avec succès {item}", + +"remind1":"Votre rappel est toujours en cours d'exécution!", +"remind2":"Veuillez taper `start` Pour commencer la configuration de `Reminder` !", +"remind3":"Que veux-tu que je te rappelle? `(Longueur max: 1024)`", +"remind4":"Veuillez me fournir une durée de temps `(Max: 1 jour)`", +"remind5":"Enfin, souhaitez-vous définir le rappel? Tapez `yes` pour continuer et `cancel` pour l'annuler!", +"remind6":"Ensemble de rappel!", +"remind7":"J'ai défini un rappel! \n\n **Rappel:** `${reminder}`\n **Heure:** `${reminderTime}`\n\nNotez qu'en définissant des rappels, vous **acceptez** être envoyé", +"remind8":"Un rappel", +"remind9":"On m'a dit de vous le rappeler, alors voici votre rappel!", +"remind10":"Nom de guilde:", +"remind11":"Temps:", +"remind12":"Rappel:", +"remind13":" Impossible de vous envoyer un message car vos dms sont fermés!", +"remind14":"Mauvaise réponse Réponse, opération annulée", +"remind15":"Pas de réponse après 30 secondes, opération annulée.", + +"huntNoHaveRifle": "Vous n'avez pas de fusil pour chasser", + +"embedd1":"Vous avez déjà un Embed ouvert!", +"embedd2":"Veuillez taper `start` pour démarrer le générateur d'intégration!", +"embedd3":"Entrez un **titre** `limite: 256 caractères` **[tapez cancel pour annuler le processus]**", +"embedd4":"Entrez une **description** `limite: 2048 caractères` **[tapez cancel pour annuler le processus]**", +"embedd5":"Entrez un **couleur hexadécimal** `format: #000000`. \nTapez `Default` pour utiliser la couleur par défaut du bot! \n\n **[tapez cancel pour annuler le processus]**", +"embedd6":"Entrez une `URL miniature` pour votre intégration **(FACULTATIF)**. Tapez `none` pour ignorer cette étape. \n **[tapez cancel pour annuler le processus]**", +"embedd7":"Saisissez une `URL d'image` pour votre intégration **(FACULTATIF)**. Tapez `none` pour ignorer cette étape. \n *Seules les URL d'image valides fonctionneront* \n\n **[tapez cancel pour annuler le processus]**", +"embedd8":"Entrez un pied de page pour votre intégration **(FACULTATIF)**. Tapez `none` pour ignorer cette étape. \n **[tapez cancel pour annuler le processus]**", +"embedd9":"Souhaitez-vous avoir un horodatage dans l'intégration? \n **[tapez cancel pour annuler le processus]**", +"embedd10":"Souhaitez-vous enregistrer l'intégration en tant que `Commande personnalisée?` \n **[tapez cancel pour annuler le processus]**", +"embedd11":"Comment souhaitez-vous nommer votre commande personnalisée? `[Max: 30 caractères / 1 mot]`\n **[tapez cancel pour annuler le processus] **", +"embedd12":"Cette commande est déjà une commande de bot existante!", +"embedd13":"J'ai créé votre commande personnalisée! \n Utilisation:", +"embedd14":"C'est déjà une commande!", +"embed15":"Embed Builder annulé", +"embedd16":"30 secondes se sont écoulées et vous n'avez pas répondu, Embed Builder annulé", +"embedd17":"Enfin, veuillez **mentionner** la chaîne à laquelle vous souhaitez envoyer l'intégration! \n **[tapez annuler pour annuler le processus]**", + +"huntSuccessCaught": "Vous avez réussi à capturer {amount} {animal}", +"huntTime": "Vous avez déjà travaillé récemment\nEssayez à nouveau dans: {timeMinute}m {timeSecond}s", + +"postmemeNoHaveLaptop": "Vous n'avez pas d'ordinateur portable pour poster des mèmes", +"postmemePrompt": "__**Où souhaitez-vous publier ce mème **__\n`n` | Normie Meme\n`e` | Edgy Meme\n`r` | Reposted Meme\n`d` | Dank Meme", + +"tiktok1":"Veuillez me fournir un profil d'utilisateur!", +"tiktok2":"informations utilisateur", +"tiktok3":"Nom d'utilisateur", +"tiktok4":"Surnom", +"tiktok5":"Bio", +"tiktok6":"Suiveurs", +"tiktok7":"Suivant", +"tiktok8":"Cœurs", +"tiktok9":"Demandé par", +"tiktok10":"Impossible de trouver le nom d'utilisateur", +"poll1":"__**Utilisation correcte**__\n`1-` {prefix}poll {Titre} [option 1] [option 2] [option 3] **(Max 20)** \n`2-` {prefix}poll \"temps\" {Titre} [option 1] [option 2] [option 3] **(Max 20)** **(s/m/h/d/w)** \n\n__**Exemples:**__ \n`1-` {prefix}poll {Est-ce que Pogy est le meilleur Bot?} [Yes] [no] [peut-être] \n`2-` {prefix}poll \"1d\"{Est-ce que Pogy est le meilleur Bot?} [Oui] [non] [peut-être]", +"poll2": "Vous ne pouvez pas avoir plus de 20 options dans un sondage", +"poll3":"Fini à:", +"poll4":"C'était une cravate!", +"poll5":"Le sondage était une cravate!", +"votes":"Votes", +"votess":"vote", +"poll6":"égalité sur", +"poll7":"Le gagnant du sondage était l'option", +"with":"avec", +"votesss":"vote(s)", +"poll8":"(Le sondage a été supprimé)", + +"list":"liste", +"members1":"Aucun membre avec le rôle {cap} n'existe!", +"members2":"__**Utilisation correcte**__\n {prefix}members \n\n__**Exemples**__\n`1-` {prefix}members @Membres\n`2-` {prefix}members Membres \n`3-` {prefix}members all", +"emoji1":"Liste des emojis", +"emoji2":"Aucun émojis trouvé sur ce serveur", + +"suggesting1":"Cette fonctionnalité n'a pas encore été configurée dans cette guilde", +"suggesting2":"Il semble que le canal de suggestion a été supprimé ou n'est pas valide.", +"suggesting3":"Nouvelle suggestion", +"suggesting4":"Suggéré par", +"suggesting5":"Je n'ai pas l'autorisation de parler dans le canal de suggestion, veuillez vérifier mes autorisations.", +"suggesting6":"J'ai envoyé votre suggestion à", +"suggesting7":"__**Utilisation correcte**__\n`1-` {prefix}suggestion enable #channel\n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve \n`4-` {prefix}suggestion decline \n\n __**Exemples**__\n`1-` {prefix}suggestion enable #suggestions \n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve 7347284293428 Ajouté\n`4-` {prefix}suggestion decline 7347284293428 Le propriétaire refuse", +"suggesting8":"Le module de suggestion est déjà désactivé.", +"suggesting9":"J'ai désactivé le module de suggestion.", +"suggesting10":"est déjà un canal de suggestion!", +"suggesting11":"J'ai défini le canal de suggestion à", +"suggesting12":"Veuillez me fournir un identifiant de message", +"suggesting13":"Je n'ai pas trouvé le message suivant!", +"suggesting14":"Suggestion approuvée", +"suggesting15":"La suggestion suivante a déjà été jugée et approuvée.", +"suggesting16":"La suggestion suivante a déjà été jugée et refusée.", +"suggesting17":"Votre raison doit être inférieure à 600 caractères!", +"suggesting18":"La suggestion suivante a été approuvée", +"suggesting19":"Approved By:", +"suggesting20":"J'ai approuvé la suggestion dans", +"suggesting21":"Suggestion refusée", +"suggesting22":"La suggestion suivante a été refusée", +"suggesting23":"Declined By:", +"suggesting24":"J'ai refusé la suggestion en", +"reason":"Raison:", + +"reportt1":"__**Utilisation correcte**__\n`1-` {prefix}report enable #channel\n`2-` {prefix}report disable\n`3-` {prefix}report user @utilisateur \n`4-` {prefix}report issue \n\n __**Exemples**__\n`1-` {prefix}report enable #rapportsdeserveur\n`2-` {prefix}report disable\n `3-` {prefix}report user @peter Mods irrespectueux\n`4-` {prefix}report issue de ticket ne fonctionne pas", +"report4":"La création de rapports est déjà désactivée", +"report5":"J'ai désactivé le module de rapport!", +"report6":"Est déjà un canal de rapport", +"report7":"J'ai défini le canal de rapport sur", +"report8":"Vous ne pouvez pas vous signaler", +"report9":"Vous ne pouvez pas signaler un bot", +"report10":"Le module de rapport est désactivé dans la guilde actuelle.", +"report11":"Je n'ai pas trouvé le canal de rapport", +"report12":"Pourquoi aimeriez-vous signaler?", +"report13":"La raison de votre rapport est trop courte", +"report14":"La description de votre rapport est trop longue!", +"report15":"Votre rapport a été reçu!", +"report16":"Rapports du serveur", +"report17":"Un nouveau rapport a été reçu!", +"report18":"Utilisateur", +"report19":"Identifiant", +"report20":"Balise", +"report21":"Utilisateur signalé", +"report22":"Utilisateur signalé Identifiant", +"report23":"Utilisateur signalé balise", +"report24":"Signaler un canal", +"report25":"Temps", +"report26":"Signaler un cas", +"report27":"Raison du rapport", +"report28":"Je suis désolé mais je n'ai pas pu envoyer votre rapport en raison d'autorisations manquantes, veuillez en informer le propriétaire!", +"report29":"Cas", +"missingUser":"Autorisations utilisateur manquantes", +"missingUser1":"Nom de la commande: **report**\nAutorisation requise: **Gérer les messages**", +"tempvc1":"__**Utilisation correcte**__\n`1-` {prefix}tempvc enable \n`2-` {prefix}tempvc disable\n\n__**Exemples:**__\n`1-` {prefix} tempvc enable\n`2-` {prefix}tempvc disable", +"tempvc2":"Nom de la commande: **Temp Voice Chat** \nAutorisation requise: **Gérer les chaînes**", +"tempvc3":"Temp Vc est déjà désactivé!", +"tempvc4":"J'ai désactivé le chat vocal temporaire", +"tempvc5":"Chargement...", +"tempvc6":"Mise en place", +"tempvc7":"Catégorie créée", +"tempvc8":"Catégorie trouvée!", +"tempvc9":"Canal vocal créé", +"tempvc10":"Canal vocal trouvé", +"tempvc11":"**Veuillez exécuter à nouveau {prefix}tempvc on**", +"tempvc12":"Set Up Done!", +"tempvc13":"Catégorie:", +"tempvc14":"Canal vocal:", +"tempvc15":"Configuration terminée, vous pouvez continuer et modifier les chaînes!\n\nPour désactiver, vous pouvez utiliser", +"tempvc16":"La configuration a échoué, veuillez réexécuter la commande, si cela continue à se produire, assurez-vous que le canal vocal et la catégorie appelés **rejoindre pour créer** sont supprimés", + +"ticketNoPerms": "Vous avez besoin de l'autorisation `Administrateur` pour utiliser cette commande", +"ticketSetupTitle": "Configuration du ticket", +"ticketsetupToChooseFrom": "Pour la première étape, ce que vous devrez faire est de choisir entre `reaction` ou `message`\nLes différences\nRéaction: vous lui donnerez un message et le bot y ajoutera une réaction, et lorsqu'un utilisateur réagit, il crée le ticket\nMessage: vous obligerez les membres à exécuter une commande pour créer un ticket.", +"ticketsetupTimeEnded": "L'heure est terminée, l'invite s'est terminée", +"ticketsetupInvalidChoice": "Ce choix n'est pas valide, vous devez avoir choisi entre {toChooseFrom}", +"ticketsetupReaction": "Réaction", +"ticketsetupMessage": "Message", +"ticketsetupReactionChannelID": "Très bien, donc à la première étape, veuillez spécifier un canal. Il peut s'agir d'un identifiant ou du nom du canal ou en le mentionnant", +"ticketsetupReactionInvalidChannel": "La chaîne que vous m'avez donnée n'est pas valide ou je n'ai pas l'autorisation de la voir", +"ticketsetupReactionCustomChoice": "Veuillez spécifier soit `bot` soit `custom`\nLes différences\nBot: Le bot enverra un message avec la réaction pour créer un ticket\nCustom: Il utilisera un messageID que vous choisissez avec une intégration personnalisée ou message", +"ticketsetupReactionCustomMessageID": "Maintenant, veuillez spécifier un messageID du canal que vous avez mentionné plus tôt", +"ticketsetupReactionCustomInvalidMessageID": "Ce messageID n'est pas dans le canal mentionné précédemment ou n'est pas valide", +"ticketsetupReactionCustomCategory": "Maintenant, veuillez spécifier une catégorie dans laquelle tous les billets seront créés, cela peut être un categoryID ou un nom de catégorie", +"ticketsetupReactionCustomInvalidCategory":"Vous n'avez pas spécifié de catégorie valide pour laquelle les tickets seront créés dans", + +"ticketsetupReactionCustomNotCategory":"Le canal fourni n'est pas une catégorie", + +"ticketsetupReactionCustomSuccess":"Création du système de tickets avec succès, avec l'option: {option}", +"ticketsetupReactionCustomRole": "Maintenant, veuillez spécifier un rôle. Le rôle sera le support pour les tickets, ils auront accès à tous les tickets", +"ticketsetupReactionCustomInvalidRole": "Le rôle que vous m'avez attribué n'est pas valide", +"ticketsetupReactionCustomModLogs": "Enfin, veuillez spécifier un canal de journal de mod sur lequel vous voulez que tous les journaux soient publiés", +"ticketTicketWord": "Billets", +"ticketHowToCreate": "Si vous souhaitez créer un ticket merci de réagir avec 🎫", +"ticketPromptseggs":"Invite annulée avec succès", +"ticketAlreadyOpen":"Vous avez déjà un constructeur de tickets ouvert!", +"ticketsetupReactionMaxTicket": "Enfin, veuillez préciser le nombre de billets qu'un membre peut créer", +"ticketsetupReactMaxTicketNaN": "Le montant maximum du ticket doit être un nombre", + +"claimNotValidChannel": "Le ticket que vous essayez de réclamer n'est pas un ticket valide", +"claimNotHaveRole": "Vous ne disposez pas du rôle {roleName} pour utiliser cette commande", +"claimSuccess": "{userName} a réclamé le ticket, il va maintenant vous aider.", + +"unclaimNotValidChannel": "Le ticket que vous essayez de retirer n'est pas un ticket valide", +"unclaimNotHaveRole": "Vous ne disposez pas du rôle {roleName} pour utiliser cette commande", +"unclaimSuccess": "{userName} n'a pas réclamé le ticket, il ne vous assistera plus.", +"unclaimDontHavePerms": "Je n'ai pas l'autorisation de modifier les autorisations de cette chaîne, veuillez vérifier mes autorisations", + +"ticketNewTicketTitle": "Nouveau ticket", +"ticketNewTicketWelcome": "Bienvenue sur votre ticket {userTag}", +"ticketNewTicketWaitForAssistant": "Merci d'avoir créé un ticket, l'équipe d'assistance sera avec vous sous peu\n\nEn attendant, veuillez expliquer votre problème ci-dessous", +"ticketOpenedBy": "Ticket ouvert par", +"ticketEmbedTitleInfo": "Informations", +"ticketEmbedValueInfo": "**Utilisateur:** {utilisateur}\n**Canal du ticket:** {chanName}\n**Ticket:** #{serverCase}\n**Date:** {ticketDate}", +"ticketYouHaveOpen": "Vous avez déjà un ticket ouvert", + +"addNotValidChannel": "Ce n'est pas un canal de ticket valide", +"addNotSpecifyUser": "Vous n'avez pas spécifié d'utilisateur", + +"setdaysInvalidArg": "Veuillez spécifier un jour valide, il doit également être un numéro", +"setdaysSuccess": "Modification de la restriction d'âge alternative pour les nombres d'axes", +"abypassNotPremium10": "Vous ne pouvez pas avoir plus de 10 ID car cette guilde n'est pas premium", +"abypassNotValidUser":" Ceci n'est pas un ID utilisateur valide à contourner ", + +"adisallowNotInArray": "Cet utilisateur ne contourne pas le détecteur alt", +"adisallowSucess": "Cet utilisateur a été supprimé avec succès", + +"aactionNotValidChoice": "Vous devez spécifier entre: {allChoices}", +"aactionSuccess": "J'ai réussi à changer l'action en {action}", + +"amodlogNotValidChannel": "Le canal que vous avez fourni n'est pas un canal valide", +"amodlogSuccess": "J'ai défini avec succès {modLog} comme canal modlog", + +"atoggleSuccess": "Le détecteur alt est maintenant {toggle}", + +"addquestionMoreThanLength": "Vous ne pouvez pas ajouter plus de {amountLength} questions", +"addquestionSuccess": "J'ai ajouté toutes les questions avec succès", +"addquestionMissingArg": "Vous devez spécifier la (les) question (s)\n\n Conseil: utilisez le symbole | pour séparer chaque question", + +"remquestion": "Veuillez spécifier l'ID valide des questions", +"remquestionSuccess": "J'ai supprimé cette question avec succès", + +"questionNoQuest": "Ce serveur n'a pas de questions", +"questionTitle": "Questions sur ce serveur" +} \ No newline at end of file diff --git a/data/language/spanish.json b/data/language/spanish.json new file mode 100644 index 00000000..f269a5ec --- /dev/null +++ b/data/language/spanish.json @@ -0,0 +1,602 @@ +{ + "setLangInvalidPermission":"Necesita permiso de ADMINISTRADOR para ejecutar este comando", + "setLangMissingArgument":"No especificaste un idioma", + "setLangInvalidOption":"Especifique entre: {languages}", + "setLangChange":"El idioma cambió a {language}", + + "setPrefixInvalidPermission":"Necesita permiso de ADMINISTRADOR para ejecutar este comando", + "setPrefixMissingArgument":"No especificaste el nuevo prefijo", + "setPrefixLongLength":"La longitud del prefijo no puede ser superior a 5", + "setPrefixChange": "El prefijo ha sido reemplazado por {prefix}", + + "helpInvalidCommand":"Orden inválida", + "helpInvalidListCommand":"Haz `{prefix}help` para la lista de comandos.", + "helpCommand":"Mando", + "helpDescription":"Descripción", + "helpAlias":"También conocido como", + "helpUsage":"Utilizar", + "helpCategory":"Categoría", + "helpInviteBot":"Invita al bot", + "helpSupportServer":"Servidor de asistencia", + "serverInfo1":"All | Members | Bots", + "workJobTitle": "Trabajos disponibles", + "workJobPage":"página", + "workJobArtist":"{emoji} | **Artista** - {prefix}work job artist", + "workJobChef": "{emoji} | **Jefe** - {prefix}work job Chef", + "workJobFirefighter": "{emoji} | **Bombero** - {prefix}work job firefighter", + "workJobDoctor": "{emoji} | **Médico** - {prefix}work job doctor", + "workJobTeacher": "{emoji} | **Profesor** - {prefix}work job teacher", + "workJobLifeguard": "{emoji} | **Salvador** - {prefix}work job lifeguard", + "workJobDetective": "{emoji} | **Detective** - {prefix}work job detective", + "workJobFarmer": "{emoji} | **Granjero** - {prefix}work job farmer", + "workJobButcher":"{emoji} | **Carnicero** - {prefix}work job butcher", + "workJobLawyer":"{emoji} | **Abogado** - {prefix}work job lawyer", + "workInvalidArg0": "No especificó entre {array}", + "workJobInvalidArg0": "Elección de trabajo no válida, verifique la información de trabajo de {prefix}work info para obtener más información", + "workHasJob": "Ya tienes un trabajo, usa {prefix}work quit para dejar tu trabajo", + "workHasNoJob": "Vous n'avez pas de travail à quitter", + "workJobNotEnoughSucceed": "Aún no desbloqueaste el trabajo {userJob}", + "workJobSuccessQuit": "Ha dejado su trabajo con éxito", + "workJobNoHave": "No tienes un trabajo para trabajar, consulta {prefix}work info información del trabajo para obtener más información", + "workJobGot": "Ahora estás trabajando como {newWork}", + "workJobTime": "Ya trabajó recientemente \nVuelva a intentarlo en: {timeMinute}m {timeSecond}s", + "workFail": "Falló su trabajo y no recibió dinero", + "workSucceed": "Trabajó y ganó {moneyAmount}{emoji}", + + "searchPlaces": ["bolsillo", "armario", "sofá", "bolso", "cama", "casa", "calle", "baño", "coche", "tela", "teléfono", "juegos","pantalones","camisa","museo"," cine","centro-comercial","aire","tienda","supermercado","casa"], + "searchTime": "Ya buscaste recientemente \nVuelve a intentarlo en: {timeMinute}m {timeSecond}s", + "searchToChoose": "Por favor, elija dónde le gustaría buscar entre:`{place1}`,`{place2}`,`{place3}`", + "searchSucceed": "Buscaste en {place} y encontraste {money}{emoji}", + "searchInvalidChoice": "Este no es un lugar válido para buscar", + + "balanceTitle": "Saldo de {user}", + "balanceCheck": "Efectivo: {money}{emoji}\nBanco: {bank}/{bankspace}\nTotal: {total}", + + "depositMissingArg0": "No especificó cuánto dinero desea depositar", + "depositSuccessfull": "He depositado correctamente {money} en su banco", + "depositMaxBank": "Su banco está lleno", + "depositNoMoney": "No tienes dinero para depositar en tu banco", + "depositNegative": "No puede depositar dinero negativo", + "depositIsNan": "La cantidad que está depositando debe ser un número", + "depositNotEnoughMoney": "No tiene tanto dinero para depositar", + "depositBankNoFit": "Su banco no puede ajustar tanto dinero", + "DepositSuccessNumber": "Se depositó correctamente {amount}{emoji} en su banco", + + "withdrawMissingArg0": "No especificó cuánto dinero desea depositar", + "withdrawNoMoney": "No tienes dinero en tu banco para retirar", + "withdrawSuccessful": "Retiró {bankMoney}{emoji} de su banco con éxito", + "withdrawNegative": "No puede retirar dinero negativo", + "withdrawIsNan": "La cantidad que está retirando debe ser un número", + "withdrawMoreThanHave": "No puede retirar más dinero del que tiene", + "withdrawSuccessNumber": "Retiró {amount}{emoji} de su banco con éxito", + + "warnMissingUser": "¡Olvidó especificar un usuario!", + "warnMissingPermission": "No tiene el permiso Administrar roles para usar este comando", + "warnHigherRole": "No puede advertir a un usuario con un rol superior al suyo", + "warnSuccessful": "{emoji} | **{user}** ha sido advertido", + "warnLogTitle": "¡Nueva advertencia!", + "warnLogDescription": "**Personal**: {author} \n**Miembro**: {user} \n**Razón**: {reason}", + + "birdError": "Se ha producido un error en el comando bird, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + + "catError": "Se ha producido un error en el comando cat, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + + "changeError":"Se ha producido un error en el comando change my mind, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + "changeErrorValid":"Por favor envíame un mensaje de texto", + "changeErrorCharacter":"Proporcione un texto de 85 caracteres o menos", + + "clydeError":"Se ha producido un error en el comando clyde, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + "clydeErrorCharacter":"Proporcione un texto de 60 caracteres o menos", + + "generating":" Generando ...", + + "magikError":"Se ha producido un error en el comando magik, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + + "mcErrorCharacter":"Proporcione un texto de 25 caracteres o menos", + + "phubErrorCharacter":"Proporcione un texto de 50 caracteres o meno", + + "cmdHandlerNoPerms": "Necesita {permission} para utilizar este comando", + + "warningsNoError":"no tiene advertencias", + "warnName": "Lista de advertencias", + "warnModerator": "Moderador", + "warnReason": "Razón", + "warnID": "ID de advertencia", + "warnDateIssued": "Fecha de emisión", + "warnList":"Lista de advertencias", + "warnAction": "Acción del moderador", + "warnExpire": "Caduca en 3 minutos", + + "slapError":"Por favor proporcioname un usuario valido", + + "trumpError":"Se ha producido un error en el comando cat, si esto sigue sucediendo, ¡póngase en contacto con el propietario!", + + "urlshortnerMissingArg": "El enlace especificado no es válido", + "urlshortnerSuccessful": "Se creó correctamente el vínculo, haga clic aquí: https://url.pogy.xyz/{shortUrl}", + + "banError":"Necesita el permiso Prohibir miembros para usar este comando", + "banUserValid":"Proporcione una mención / identificación de usuario válida", + "banYourselfError":"No puedes prohibirte", + "banHigherRole":"El usuario proporcionado tiene un rol igual o superior al suyo.", + "banBannable":"No puedo prohibir a este usuario porque no es posible hacerlo.", + "noReasonProvided":"Sin motivo proporcionado", + "banBan":"fue prohibido con éxito..", + + "kickMissingPermission":"Necesita el permiso de Kick Members para usar este comando", + "kickYourself":"No puedes patearte a ti mismo", + "kickKickable":"No puedo prohibir a este usuario porque no se puede patear.", + "kickKick":"fue pateado.", + + "muteMissingPerms":"No tienes permisos para usar ese comando", + "muteMissingPermsBot":"No tengo permisos para usar ese comando", + "muteTime":"Esa no es una cantidad de tiempo válida para silenciar a un miembro.", + "muteRolePosition":"No puedo silenciar a este miembro porque sus roles son más altos que los míos.", + "muteRolePositionBot":"No puedo silenciar a este miembro porque el rol de `Muted` es más alto que el mío.", + "muteMuted":"Este miembro ya está silenciado.", + "muteMember":"Miembro", + "muteLength":"Longitud", + + "rmPermission":"Vous ne pouvez pas retirer ce membre car son rôle est supérieur au vôtre.", + "rmNoWarning":"Ce membre n'a aucun avertissement.", + "rmWarnInvalid":"Esta es una identificación de advertencia no válida.", + + "managemessages":"Hola ... Esta función solo está disponible para miembros con **Manage Messages**", + "notaccessible":"Este canal no es accesible para mí", + "whatdoIsay":"Escribe eso de nuevo, ¡pero dame un mensaje de texto!", + "sendmessages":"Je n'ai pas la permission d'envoyer des messages!", + "userSendMessages":"No tienes permiso para enviar mensajes al canal proporcionado.", + + "coiniflippedacoinfor":"Lancé una moneda por", + "coinitwas":"era", + "emojify":"Escribe eso de nuevo, ¡pero con un texto!", + "dontmention":"No tienes que mencionar a nadie", +"emojifyError":"Impossible d'envoyer le message, assurez-vous que votre texte n'est pas vraiment volumineux", + + +"f1":"ha presentado sus respetos.", +"f2":"ha presentado sus respetos a", +"f3":"Presione F para presentar sus respetos.", + +"hack1":"Woaaah más despacio, ¿a quién estamos pirateando?", +"hackbot":"Realmente no puedes hackear un bot", +"hack2":"pog", +"hack3":"atractivo", +"hack4":"niño", +"hack5":"Medio", +"hack6":"nerd", +"hack7":"¿Quiero salir?", +"hack8":"Ella es realmente buena", +"hack9":"Esto es tan POG", +"hack10":"Es tan grande", +"hack11":"Nosotros estamos a punto de hackear", +"hack12":"todo comienza ahora ...", +"hack13":"Finding discord login ... (2fa omitido)", +"hack14":"Buscando la palabra más común ...", +"hack15":"Vendiendo datos al gobierno ...", +"hack16":"Denunciando cuenta a la discordia por romper ToS ...", +"hack17":"Hackeo terminado", +"hack18":"El truco se completó..", + +"softbanNoPerm": "Necesita el permiso de Prohibir miembros para usar este comando", +"softbanNoUser": "No especificó un usuario válido", +"softbanSelfUser": "No puede hacer softban usted mismo", +"softbanEqualRole": "El usuario proporcionado tiene un rol igual o superior al suyo", +"softbanNotBannable": "Este usuario no es bannable", +"softbanNoReason": "No se proporcionó ningún motivo", +"softbanResponsible": "Usuario responsable", +"softbanSuccess": "He realizado softbanned exitosamente", + +"unbanNoPerm": "Necesita el permiso de Prohibir miembros para usar este comando", +"unbanInvalidID": "Este no es un ID de usuario válido", +"unbanNoReason": "No se proporcionó ningún motivo", +"unbanResponsible": "Usuario responsable", +"unbanSuccess": "Desactivado correctamente", + +"kill1":"Vaya, eso fue genial ... ¿Pero a quién mato?", +"kill2":"Bruh, pareces deprimido .. ¿Cómo puedo ayudar?", +"kill3":"se sentó en", +"kill4":", como el otro tristemente *sofocado*", +"kill5":"muere por bailar demasiado fuerte", +"kill6":"murió de un ataque al corazón", +"kill7":"murió por no comer mucho culo", +"kill8":"lo mató de inmediato,", +"kill9":"parece muy agradable ... por qué él", +"kill10":"fue a pelear", +"kill11":", pero fue **noqueado** en la primera ronda", +"kill12":"tropezó y tristemente murió", +"kill13":"estaba pidiendo perdon, pero", +"kill14":"lo mató de inmediato", +"kill15":"murió de sida", +"kill16":"no podría manejar", +"kill17":"'s estupidez, entonces le disparó", +"kill18":"murió mientras escalaba el muro de China", +"kill19":"murió mientras *robaba* un banco", +"kill20":"murió mientras estudiaba historia", +"kill21":"se sentó en", +"kill22":"matándolo", +"kill23":"abofeteado", +"kill24":"es demasiado débil para manejar esto", +"kill25":"Pogy se sentó en", +"kill26":", El otro tristemente *sofocado*", +"kill27":"Pogy abofeteó", +"kill28":"con un microondas", +"kill29":"Muerto de hambre", +"kill30":"sparece realmente inocente", +"kill31":"Lo siento", +"kill32":"parece agradable, no puedo", +"kill33":"fue atropellado por un coche", + +"unmuteRolePosition": "La posición del rol mudo es más alta que la mía", +"unmuteUserRoleHigher": "El rol de los usuarios es más alto que el mío, así que no puedo reactivarlo", +"unmuteNotMuted": "Este miembro no está silenciado", +"unmuteNoMutedRole": "No hay función Muted, pero tan pronto como silencias a alguien, se creará una automáticamente", +"unmuteNoUser": "Olvidó especificar un usuario", + +"rate1":"Te daría un", +"rate2":"¡Tu artículo parece ENORME! Realmente no podría calificar ...", +"rate3":".. Eh, ¿debería calificarme a mí mismo? Bueno, ¡me daría un 10/10!", +"rate4":"Daria", +"rate5":"una", + +"shopMissingArg0": "No especificó entre {choose}", +"shopCompany": "Empresas", +"shopItem": "Artículos", +"shopCompanyPage1": "**McDonald** - Tenga su propio restaurante de comida rápida, precio: 5,000{money} - {prefix}buy McDonald\n**Target** - Tenga su propio target, precio: 15,000{money} - {prefix}buy Target\n**Walmart** - Tenga su propio Walmart, precio: 30,000{money} -{prefix}buy Walmart\n**FedEx** - Tenga su propia empresa de correo, precio: 65,000{price} - {prefix}buy FedEx\n **StarBucks** - Tenga su propio Starbucks, precio: 115,000{money} - {prefix}buy StarBucks", +"shopCompanyPage2": "**Boeing** - Puedes comprar esto si siempre quisiste un avión, precio: 200,000 {money} - {prefix}buy Boeing\n**BuzzFeed** - Ten tu propio buzzfeed y difunde las noticias alrededor, precio: 500,000{money} - {prefix}buy BuzzFeed\n**FaceBook** - Tenga su propia plataforma de redes sociales, precio: 1,750,000{money} - {prefix}buy FaceBook\n** CocaCola ** - Tenga la suya una gran compañía de bebidas, precio: 3,250,000{money} - {prefix}buy CocaCola\n**Spotify** - Tenga una de las compañías de música más grandes, precio: 5,000,000{money} - {prefix}buy Spotify", +"shopCompanyPage3": "**SpaceX** - Tendrás una gran empresa espacial, precio: 15.000.000{money} - {prefix}buy SpaceX\n**NASA** - ¿Siempre has querido ser dueño de la NASA? Aquí tienes tu chance!, precio: 35,000,000{money} - {prefix}buy NASA\n**Nintendo** - Posee una de las compañías de juegos más grandes, precio: 80,000,000{money} - {prefix}buy Nintendo\n**Google** - Tener una de las mayores empresas de motores de búsqueda, precio: 200.000.000{money} - {prefix}buy Google\n**Tesla ** - Tener una de las mayores empresas de automóviles, precio: 500.000.000{money} - {prefix}buy Tesla ", +"shopItemPage1": "**Candado** - Este candado evitará que todos los ladrones molestos intenten robarte, precio: 1,000{money} - {prefix}buy padlock\n**Computadora portátil** - Con esta computadora portátil lo harás poder subir memes y buscar donaciones de personas en línea, precio: 3,000{money} - {prefix}buy laptop\n**Caña de pescar** - Este artículo te permite pescar peces, también puedes tener suerte y encontrar otros cosas mientras pesca, precio: 5,000{money} - {prefix}buy fishingrod\n**Rifle** - Este es un rifle poderoso, puede usarlo para cazar animales e incluso encontrar especies especiales, precio: 10,000{money} - {prefix}buy rifle", + +"reverseError":"..¿Qué debo revertir? Vuelve a intentarlo con un texto", +"rickroll":"¡Primero debes unirte a un canal de voz!", +"simpmachine":"Máquina Simp", +"simpmachinee":"Máquina Gay", +"simpIs":"es", +"simpyouare":"Usted está", +"youtube":"Oye, especifica un nombre de video y lo buscaré", +"youtubeUnable":"No se puede encontrar, prueba con otra cosa ...", +"zalgolize":"..¿Qué debería Zagolize? Vuelve a intentarlo con un texto", + +"buyInvalidItem": "Este no es un artículo válido, consulte {prefix}shop para obtener más información", +"buyAlreadyHaveCompany": "Ya tienes esta empresa, ¿por qué necesitas otra?", +"buyNotEnoughMoney": "No tienes suficiente para comprar este artículo", +"buySuccessful": "Ha comprado {baughtAmount} {baughtItem} por {baughtPrice}", + + +"shortUrlError":"Proporcióname un enlace válido", +"urlCreated":"¡Tu enlace ha sido creado!", +"shorturlCooldown":"Reduzca la velocidad, solo puede crear 1 enlace cada 5 minutos", +"youtubeCooldown":"Reduzca la velocidad, solo puede buscar 1 video por minuto ", + +"afk1":"Asegúrese de no incluir menciones.", +"afk2":"No puedes usar el ping everyone", +"afk3":"Esa es una gran razón tranquila", +"afk4":"¡Puedes hacerlo cada 20 segundos!", +"afk5":"Se le ha configurado como afk\n** Razón:**", +"afk6":"es actualmente afk:", +"afk7":"¡Parece que has vuelto! Eliminé tu afk\n\n**afk motivo:** ", + +"antiinvites1":"Debe escribir `enable` o `disable` para habilitar / deshabilitar el módulo.", +"antiinvites3":"Deshabilitó con éxito el módulo anti-invitación", +"antiinvites4":"Habilitado con éxito el módulo anti invitaciones", +"antilinks3":"Desactivado con éxito el módulo anti-enlace", +"antilinks4":"Habilitado con éxito el módulo anti-link", +"moduleEnabled":"El módulo ya está habilitado", +"moduleDisabled":"El módulo ya está desactivado", +"serversettings1":"Configuración del servidor", +"serversettings2":"Bienvenidos", +"serversettings3":"Salir", +"serversettings4":"Anti Invitar", +"serversettings5":"Anti enlaces", +"serversettings6":"Registro de moderación", +"serversettings7":"Prefijo del servidor", +"disabled":"Discapacitado", +"enabled":"Habilitado", +"farewell1":"Por favor, proporcione un canal válido", +"farewell2":"Los mensajes de despedida se han desactivado", +"farewell3":"No pude encontrar ese canal. Mencione un canal dentro de este servidor.", +"farewell4":"Los mensajes de despedida se han habilitado", +"greet1":"La función de bienvenida ha sido desactivada", +"greet2":"Se ha habilitado la función de bienvenida", +"serverlog1":"El módulo de registros del servidor se ha desactivado", +"serverlog2":"El módulo de registros del servidor se ha configurado para", +"shorturlBlock1":"No utilice ese enlace, ha sido **bloqueado** del siguiente comando durante **2 horas.**", +"shorturlBlock2":"Estás **bloqueado** desde el siguiente comando", +"properusage":"Uso adecuado:", +"example":"Ejemplo:", +"cc1":"¡El nombre de su comando tiene más de 30 caracteres!", +"cc2":"¡El contenido de su comando tiene más de 2000 caracteres!", +"cc3":"Comando agregado:", +"cc4":"¡El siguiente comando ya es un comando existente!", +"deletecmd1":"**Eliminado** Comando:", +"deletecmd2":"¡No pude encontrar el siguiente comando!", +"cc5":"¡El gremio actual no tiene comandos personalizados!", +"cc6":"Comandos personalizados", +"bigError":"Impossible d'envoyer le message, assurez-vous que votre texte n'est pas vraiment volumineux.", +"flippingCoin":"¡Lanzando Moneda! ...", +"callingError":"¡Asegúrese de que su texto tenga menos de 100 caracteres!", +"capchaError":"¡Asegúrese de que su texto tenga menos de 60 caracteres!", +"floorError":"¡Asegúrese de que su texto tenga menos de 40 caracteres!", + +"noNews":"¡No hay novedades por el momento!", +"datePublished":"Fecha de publicación:", +"pinging":"Obteniendo ping...", +"timeTaken":"Tiempo tomado:", +"discordAPI":"API de Discord:", +"nameS":"Nombre:", +"owner":"Propietario", +"verificationLevel":"Nivel de verificación", +"channels":"Canales", +"roleCount":"Recuento de roles", +"creationDate":"Fecha de creación", +"region":"Región", +"pogyOwners":"Dueños de Pogy", +"pogyDevelopers":"Desarrolladores", +"pogyContributor":"Colaboradores", +"pogyInfo":"Información de Pogy", +"pogyGeneral":"Información general", +"pogyTeam":"Miembros del equipo", +"pogyStats":"Estadísticas", +"pogyVersion":"Version", +"pogyCommands":"Commands", +"userh":"Usuario:", +"joinedDiscord":"Se unió a Discord en:", +"joinedServer":"Se unió al servidor en:", +"roles":"Roles:", +"noRoles":"Ese usuario no tiene roles", +"noBadge":"Ese usuario no tiene insignia de bot", +"botBadges":"Insignias de bot:", +"badgeslmao":"Insignias:", +"users":"Usuarios", + +"pfpAvatar":"Avatar de {user}", +"report1":"Oye, qué te gustaría informar?", +"report2":"Proporciónanos más información sobre el error.", +"report3":"Oye, el propietario recibió el error, asegúrate de avisarle, únete al", +"discrim1":"Proporcióname un discriminador de usuarios válido", +"none":"Ninguno", +"discrim3":"Encontré", +"discrim2":"Búsqueda de discriminador", +"discrim4":"Usuarios con discriminador", +"invite":"Invítame [aquí]", +"isitup2":"Por favor, proporcione un sitio web válido.", +"isitup3":"¡El sitio web proporcionado está caído!", +"suggest1":"Qué le gustaría sugerir?", +"suggest2":"Por favor bríndenos más información para su sugerencia.", +"suggest3":"Oye, el propietario recibió la sugerencia, asegúrate de informarle, únete al", +"support":"Únase al servidor de soporte [aquí]", +"uptime1":"Pogy ha estado listo para", +"vote":"Oye! Puedes votar por Pogy aquí:**\n\n**Top.gg:** [aquí](https://top.gg/bot/767705905235099658)\n**Bots for Discord:** [aquí](https://botsfordiscord.com/bot/767705905235099658)", +"define1":"Oye, dame una palabra!", +"define2":"No pude encontrar esa palabra!", +"namse":"Palabra", +"define3":"Definición", +"define4":"Ejemplo", +"define5":"Desarrollado por Urban Dictionary", +"isitup0":"Este sitio web está activo!", + +"useNoArgs0": "No especificó un elemento para usar", +"useNotUseableItem": "Este elemento no se puede utilizar", +"useInvalidItem": "Este no es un elemento válido, elementos válidos: {list}", +"useNoHaveItem": "No tienes un {item}", +"useNoHaveThatMuch": "No tienes {amount} {item} para usar", +"useAlreadyHasPadlock": "Ya tienes un candado activo", +"useSuccess": "Has utilizado {item} correctamente", + +"remind1":"Tu recordatorio aún se está ejecutando!", +"remind2":"Por favor escriba `start` Para comenzar la configuración del` Reminder`!", +"remind3":"Qué quieres que te recuerde? `(Longitud máxima: 1024)`", +"remind4":"Por favor, proporcione una duración de tiempo '(Max: 1d)'", +"remind5":"Por último, te gustaría configurar el recordatorio? Escriba `yes` para continuar y `cancel` para cancelarlo.", +"remind6":"Conjunto de recordatorio!", +"remind7":"He configurado un recordatorio! \n\n **Recordatorio:** `$ {reminder}`\n **Hora:** `${reminderTime}`\n\nTenga en cuenta que al configurar recordatorios, **está de acuerdo** de recibir mensajes", +"remind8":"Un recordatorio", +"remind9":"Me dijeron que te lo recordara, ¡así que aquí está tu recordatorio!", +"remind10":"Nombre del gremio:", +"remind11":"Hora:", +"remind12":"Recordatorio:", +"remind13":"No pude enviarle un mensaje porque sus dms están cerrados!", +"remind14":"Respuesta incorrecta Respuesta, Operación cancelada", +"remind15":"No hay respuesta después de 30 segundos, operación cancelada.", + +"huntNoHaveRifle": "No tienes un rifle para poder cazar", + + +"embedd1":"Ya tienes un Embed abierto!", +"embedd2":"Por favor, escriba `start` para iniciar el constructor de incrustaciones.", +"embedd3":"Ingrese un **título** `límite: 256 caracteres` **[escriba cancel para cancelar el proceso]**", +"embedd4":"Ingrese una **descripción** `límite: 2048 caracteres` **[escriba cancel para cancelar el proceso]**", +"embedd5":"Ingresa un **color hexadecimal** `formato: #000000`. \n Escribe `default` para usar el color predeterminado del bot. \n\n **[escribe cancel para cancelar el proceso]**", +"embedd6":"Ingrese una `URL en miniatura` para su inserción **(OPCIONAL)**. Escriba `none` para omitir este paso. \n **[escriba cancel para cancelar el proceso]**", +"embedd7":"Ingrese `una URL de imagen` para su inserción **(OPCIONAL)**. Escriba `none` para omitir este paso. \n *Solo funcionarán las URL de imágenes válidas* \n\n** [escriba cancel para cancelar el proceso] **", +"embedd8":"Ingrese un pie de página para su inserción **(OPCIONAL)**. Escriba `none` para omitir este paso. \n **[escriba cancel para cancel el proceso]**", +"embedd9":"Le gustaría tener una marca de tiempo en la inserción? \n ** [escriba cancel para cancelar el proceso] **", +"embedd10":"Le gustaría guardar la inserción como un `Comando personalizado?` \n **[escriba cancel para cancelar el proceso]**", +"embedd11":"Cómo le gustaría nombrar su comando personalizado? `[Máx: 30 caracteres / 1 palabra]` \n **[escriba cancel para cancelar el proceso]**", +"embedd12":"Ese comando ya es un comando bot existente!", +"embedd13":"He creado su comando personalizado! \n Uso:", +"embedd14":"Esto ya es un comando!", +"embed15":"Embed Builder cancelado", +"embedd16":"Pasaron 30 segundos y no respondió, Embed Builder cancelado", +"embedd17":"Finalmente, **menciona** el canal al que te gustaría enviar la inserción. \n **[escriba cancel para cancelar el proceso]**", + +"huntSuccessCaught": "Has atrapado {amount} {animal}", +"huntTime": "Ya trabajó recientemente\nVuelva a intentarlo en: {timeMinute}m {timeSecond}s", + +"postmemeNoHaveLaptop": "No tienes una computadora portátil para publicar memes", +"postmemePrompt": "__**¿Dónde te gustaría publicar este meme**__\n`n` | Normie Meme\n`e` | Edgy Meme\n`r` | Reposted Meme\n`d` | Dank Meme", + +"tiktok1":"Por favor, proporcione un perfil de usuario.", +"tiktok2":"Información de usuario", +"tiktok3":"Nombre de usuario", +"tiktok4":"Apodo", +"tiktok5":"Orgánico", +"tiktok6":"Seguidores", +"tiktok7":"Siguiente", +"tiktok8":"Corazones", +"tiktok9":"Solicitado por", +"tiktok10":"No se pudo encontrar el nombre de usuario:", + +"poll1":"__**Uso adecuado**__\n`1-` {prefix}poll {título} [opción 1] [opción 2] [opción 3] **(Max 20)**\n`2-` {prefix}poll \"hora\" {título} [option 1] [option 2] [option 3] **(Max 20)** **(s/m/h/d/w)**\n\n__**Ejemplos:**__\n`1-` {prefix}poll {Es Pogy el mejor bot?} [sí] [no] [quizás]\n`2-` {prefix}poll \"1d\" {Es Pogy el mejor bot?} [sí] [no] [quizás]", +"poll2":"No puedes tener más de 20 opciones en una encuesta", +"poll3":"Termina en:", +"poll4":"Fue un empate!", +"poll5":"La encuesta fue un empate!", +"votes":"Votos", +"votess":"votar", +"poll6":"Atado", +"poll7":"El ganador de la encuesta fue opción.", +"with":"con", +"votesss":"voto(s)", +"poll8":"(La encuesta fue eliminada)", + +"list":"Lista", +"members1":"No existen miembros con el rol {cap}!", +"members2":"__**Uso adecuado**__\n{prefix}members \n\n__**Ejemplos**__\n`1-` {prefix}members @miembros \n`2-` {prefix}members Miembros\n`3-` {prefix} members all", +"emoji1":"Lista de emojis", +"emoji2":"No se encontraron emojis en este servidor", + +"suggesting1":"Esta función aún no se ha configurado en este gremio.", +"suggesting2":"Parece que el canal de sugerencias se eliminó o no es válido.", +"suggesting3":"Nueva sugerencia", +"suggesting4":"Sugerido por", +"suggesting5":"No tengo permiso para hablar en el canal de sugerencias, verifique mis permisos.", +"suggesting6":"He enviado tu sugerencia a", +"suggesting7":"__**Uso adecuado**__\n`1-` {prefix}suggestion enable #channel\n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve \n`4-` {prefix}suggestion decline \n\n__**Ejemplos **__\n`1-` {prefix}suggestion enable #sugerencias\n`2-` {prefix}suggestion disable\n`3-` {prefix}suggestion approve 7347284293428 Lo agregó!\n`4-` {prefix}suggestion decline 7347284293428 Owner Declines", +"suggesting8":"El módulo de sugerencias ya está desactivado.", +"suggesting9":"He desactivado el módulo de sugerencias.", +"suggesting10":"ya es un canal de sugerencias!", +"suggesting11":"He establecido el canal de sugerencias en", +"suggesting12":"Por favor, proporcione un ID de mensaje", +"suggesting13":"No pude encontrar el siguiente mensaje!", +"suggesting14":"Sugerencia aprobada", +"suggesting15":"La siguiente sugerencia ya ha sido juzgada y aprobada.", +"suggesting16":"La siguiente sugerencia ya ha sido juzgada y rechazada.", +"suggesting17":"Su motivo debe tener menos de 600 caracteres!", +"suggesting18":"Se aprobó la siguiente sugerencia", +"suggesting19":"Aprobado por:", +"suggesting20":"Aprobé la sugerencia en", +"suggesting21":"Sugerencia rechazada", +"suggesting22":"Se rechazó la siguiente sugerencia", +"suggesting23":"Rechazado por:", +"suggesting24":"He rechazado la sugerencia en", +"reason":"Razón:", + +"reportt1":"__**Uso adecuado**__\n`1-` {prefix}report enable #canal\n`2-` {prefix}report disable\n`3-` {prefix}report user @usuario \n`4-` {prefix}report issue \n\n__**Ejemplos**__\n`1-` {prefix}report enable #informes del servidor\n`2-` {prefix}report disable\n`3-` {prefix}report user @peter Mods irrespetuosos\n`4-` {prefix}report issue el boleto no funciona", +"report4":"Los informes ya están deshabilitados", +"report5":"He desactivado el módulo de informes!", +"report6":"Ya es un canal de informes", +"report7":"He configurado el canal de informes en", +"report8":"No puedes denunciarte a ti mismo", +"report9":"No puedes reportar un bot", +"report10":"El módulo de informes está desactivado en el gremio actual.", +"report11":"No pude encontrar el canal de informes", +"report12":"Por qué le gustaría informar?", +"report13":"El motivo de su informe es demasiado corto", +"report14":"La descripción de su informe es demasiado larga!", +"report15":"Su informe ha sido recibido!", +"report16":"Informes del servidor", +"report17":"Se ha recibido un nuevo informe!", +"report18":"Usuario", +"report19":"ID de usuario", +"report20":"Etiqueta de usuario", +"report21":"Usuario reportado", +"report22":"ID de usuario informado", +"report23":"Etiqueta de usuario denunciada", +"report24":"Canal de informes", +"report25":"Hora", +"report26":"Informar caso", +"report27":"Razón del informe", +"report28":"Lo siento, pero no pude enviar su informe debido a la falta de permisos. Infórmele al propietario!", +"report29":"Caso", +"missingUser":"Permisos de usuario perdidos", +"missingUser1":"Nombre del comando: **informe**\nPermiso requerido: **Administrar mensajes**", +"tempvc1":"__**Uso adecuado**__\n`1-` {prefix}tempvc enable\n`2-` {prefix}tempvc disable\n\n__**Ejemplos:**__\n`1-` {prefix}tempvc enable\n`2-` {prefix}tempvc disable", +"tempvc2":"Nombre del comando: **Chat de voz temporal**\nPermiso requerido: **Administrar canales**", +"tempvc3":"Temp Vc ya está desactivado!", +"tempvc4":"Tengo el chat de voz temporal desactivado", +"tempvc5":"Cargando...", +"tempvc6":"Configuración", +"tempvc7":"Categoría creada", +"tempvc8":"Categoría encontrada!", +"tempvc9":"Canal de voz creado", +"tempvc10":"Canal de voz encontrado", +"tempvc11":"**Please run {prefix}tempvc on again**", +"tempvc12":"Set Up Done!", +"tempvc13":"Categoría:", +"tempvc14":"Canal de voz:", +"tempvc15":"Configuración hecha, puede seguir adelante y editar los canales.\n\nPara deshabilitar, puede usar", +"tempvc16":"La configuración falló, vuelva a ejecutar el comando, si esto sigue sucediendo, asegúrese de que el canal de voz y la categoría llamados **unirse para crear** se eliminen", + +"ticketNoPerms": "Necesita el permiso de `Administrador` para usar este comando ", +"ticketSetupTitle": "Configuración del ticket", +"ticketsetupToChooseFrom": "Para el primer paso, lo que tendrás que hacer es elegir entre `reaction` o `message`\nLas diferencias\nReacción: Le darás un mensaje y el bot agregará una reacción. y cuando un usuario reacciona, crea el ticket\nMensaje: Harás que los miembros ejecuten un comando para crear un ticket", +"ticketsetupTimeEnded": "El tiempo ha finalizado, el mensaje ha finalizado", +"ticketsetupInvalidChoice": "Esta es una elección no válida, debe haber elegido entre {toChooseFrom}", +"ticketsetupReaction": "Reacción", +"ticketsetupMessage": "Mensaje", +"ticketsetupReactionChannelID": "Muy bien, primer paso, por favor especifique un canal. Podría ser un ID o el nombre del canal o mencionándolo", +"ticketsetupReactionInvalidChannel": "El canal que me diste no es válido o no tengo permiso para verlo", +"ticketsetupReactionCustomChoice": "Por favor, especifique `bot` o `custom` \nLas diferencias \nBot: El bot enviará un mensaje con la reacción para crear un ticket \nCustom: Utilizará un ID de mensaje que elija con un incrustado personalizado o mensaje", +"ticketsetupReactionCustomMessageID": "Ahora, especifique un ID de mensaje del canal que mencionó anteriormente", +"ticketsetupReactionCustomInvalidMessageID": "Este messageID no está en el canal mencionado anteriormente o no es válido", +"ticketsetupReactionCustomCategory": "Ahora, especifique una categoría en la que se crearán todos los tickets, puede ser un categoryID o un nombre de categoría", +"ticketsetupReactionCustomInvalidCategory": "No especificó una categoría válida para la que se crearán los tickets", +"ticketsetupReactionCustomNotCategory":" El canal proporcionado no es una categoría ", +"ticketsetupReactionCustomSuccess": "Se creó correctamente el sistema de tickets, con la opción: {option}", +"ticketsetupReactionCustomRole": "Ahora, especifique un rol. El rol será el soporte para los tickets, ellos tendrán acceso a todos los tickets", +"ticketsetupReactionCustomInvalidRole": "El rol que me asignaste no es válido", +"ticketsetupReactionCustomModLogs": "Por último, especifique un canal de registro de mods donde desee que se publiquen todos los registros", +"ticketTicketWord": "Entradas", +"ticketHowToCreate": "Si desea crear un ticket, reaccione con 🎫", +"ticketPromptseggs":"Invite annulée avec succès", +"ticketAlreadyOpen":"Vous avez déjà un constructeur de tickets ouvert!", +"ticketsetupReactionMaxTicket": "Por último, especifique cuántos tickets puede crear un miembro", +"ticketsetupReactMaxTicketNaN": "La cantidad máxima del boleto debe ser un número", + +"claimNotValidChannel": "El ticket que está intentando reclamar no es válido", +"claimNotHaveRole": "No tiene la función {roleName} para usar este comando", +"claimSuccess": "{userName} reclamó el boleto, ahora lo ayudará", + +"unclaimNotValidChannel": "El ticket que estás intentando anular no es válido", +"unclaimNotHaveRole": "No tienes la función {roleName} para usar este comando", +"unclaimSuccess": "{userName} no ha reclamado el ticket, ya no le ayudará", +"unclaimDontHavePerms": "No tengo permiso para cambiar los permisos en este canal, verifique mis permisos", + +"ticketNewTicketTitle": "Nuevo ticket", +"ticketNewTicketWelcome": "Bienvenido a su ticket {userTag}", +"ticketNewTicketWaitForAssistant": "Gracias por crear un ticket, el equipo de soporte estará contigo en breve\n\nMientras tanto, explica tu problema a continuación", +"ticketOpenedBy": "Ticket abierto por", +"ticketEmbedTitleInfo": "Información", +"ticketEmbedValueInfo": "**Usuario:** {usuario}\n**Canal de entradas:** {chanName}\n**Entrada:** #{serverCase}\n**Fecha:** {ticketDate}", +"ticketYouHaveOpen": "Ya tienes un ticket abierto", + +"addNotValidChannel": "Este no es un canal de ticket válido", +"addNotSpecifyUser": "No especificó un usuario", + +"setdaysInvalidArg": "Especifique un día válido, también debe ser un número", +"setdaysSuccess": "Se cambió correctamente la restricción de edad de axcounts alternativos", +"abypassNotPremium10": "No puedes tener más de 10 ID ya que este gremio no es premium", +"abypassNotValidUser":"Este no es un ID de usuario válido para omitir", + +"adisallowNotInArray": "Este usuario no está pasando por alto el detector alt", +"adisallowSucess": "Este usuario ha sido eliminado correctamente", + +"aactionNotValidChoice": "Debe especificar entre: {allChoices}", +"aactionSuccess": "He cambiado correctamente la acción a {action}", + +"amodlogNotValidChannel": "El canal que proporcionaste no es un canal válido", +"amodlogSuccess": "He configurado correctamente {modLog} como canal de modlog", + +"atoggleSuccess": "El detector alternativo ahora es {toggle}", + +"addquestionMoreThanLength": "No puede agregar más de {amountLength} preguntas", +"addquestionSuccess": "He añadido correctamente todas las preguntas", +"addquestionMissingArg": "Debe especificar la (s) pregunta (s)\n\n Consejo: Utilice el símbolo | para separar cada pregunta", + +"remquestion": "Especifique el ID válido de las preguntas", +"remquestionSuccess": "He eliminado correctamente esta pregunta", + +"questionNoQuest": "Este servidor no tiene ninguna pregunta", +"questionTitle": "Preguntas en este servidor" +} \ No newline at end of file diff --git a/data/permissions.json b/data/permissions.json new file mode 100644 index 00000000..3f6f91d6 --- /dev/null +++ b/data/permissions.json @@ -0,0 +1,33 @@ +{ + "ADMINISTRATOR": "Administrator", + "VIEW_AUDIT_LOG": "View Audit Log", + "VIEW_GUILD_INSIGHTS": "View Server Insights", + "MANAGE_GUILD": "Manage Server", + "MANAGE_ROLES": "Manage Roles", + "MANAGE_CHANNELS": "Manage Channels", + "KICK_MEMBERS": "Kick Members", + "BAN_MEMBERS": "Ban Members", + "CREATE_INSTANT_INVITE": "Create Invite", + "CHANGE_NICKNAME": "Change Nickname", + "MANAGE_NICKNAMES": "Manage Nicknames", + "MANAGE_EMOJIS": "Manage Emojis", + "MANAGE_WEBHOOKS": "Manage Webhooks", + "VIEW_CHANNEL": "Read Text Channels & See Voice Channels", + "SEND_MESSAGES": "Send Messages", + "SEND_TTS_MESSAGES": "Send TTS Messages", + "MANAGE_MESSAGES": "Manage Messages", + "EMBED_LINKS": "Embed Links", + "ATTACH_FILES": "Attach Files", + "READ_MESSAGE_HISTORY": "Read Message History", + "MENTION_EVERYONE": "Mention @everyone, @here, and All Roles", + "USE_EXTERNAL_EMOJIS": "Use External Emojis", + "ADD_REACTIONS": "Add Reactions", + "CONNECT": "Connect", + "SPEAK": "Speak", + "STREAM": "Video", + "MUTE_MEMBERS": "Mute Members", + "DEAFEN_MEMBERS": "Deafen Members", + "MOVE_MEMBERS": "Move Members", + "USE_VAD": "Use Voice Activity", + "PRIORITY_SPEAKER": "Priority Speaker" +} \ No newline at end of file diff --git a/data/structures/fetchAll.js b/data/structures/fetchAll.js new file mode 100644 index 00000000..b7239b18 --- /dev/null +++ b/data/structures/fetchAll.js @@ -0,0 +1,30 @@ +module.exports = async (message, reaction) => { + const users = []; + let lastID = ''; + + while (true) { // eslint-disable-line no-constant-condition + try { + var fetchedUsers = // eslint-disable-line no-var + lastID != '' + ? await message.reactions.cache.get(reaction).users.fetch({ limit: 100, after: lastID }) + : (await message.reactions.cache.get(reaction).users.fetch({ limit: 100 })); + } + catch { + return undefined; + } + + + fetchedUsers = fetchedUsers.array(); + + if (!fetchedUsers.length) { + return users; + } + else { + fetchedUsers.forEach((u) => { + users.push(u); + }); + + lastID = users[users.length - 1].id; + } + } +}; \ No newline at end of file diff --git a/data/structures/optionArray.js b/data/structures/optionArray.js new file mode 100644 index 00000000..94669a46 --- /dev/null +++ b/data/structures/optionArray.js @@ -0,0 +1,25 @@ +module.exports = () => { + return [ + '🇦', + '🇧', + '🇨', + '🇩', + '🇪', + '🇫', + '🇬', + '🇭', + 'ℹ️', + '🇯', + '🇰', + '🇱', + '🇲', + '🇳', + '🇴', + '🇵', + '🇶', + '🇷', + '🇸', + '🇹', + '🇺', + ]; +}; \ No newline at end of file diff --git a/database/schemas/Guild.js b/database/schemas/Guild.js new file mode 100644 index 00000000..f317a5c0 --- /dev/null +++ b/database/schemas/Guild.js @@ -0,0 +1,192 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + disabledCommands: { + type: mongoose.SchemaTypes.Array, + default: [] + }, + prefix: { + type: mongoose.SchemaTypes.String, + required: true, + default: 'p!' + }, + isPremium: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + premium: { + + redeemedBy: { + id: {type: mongoose.SchemaTypes.String, default: null}, + tag: {type: mongoose.SchemaTypes.String, default: null}, + }, + + redeemedAt: {type: mongoose.SchemaTypes.String, default: null}, + + expiresAt: {type: mongoose.SchemaTypes.String, default: null}, + + plan: {type: mongoose.SchemaTypes.String, default: null}, + + }, + logChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + }, + modlogcolor: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + greetChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + }, + farewellChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + }, + antiInvites: { + type: mongoose.SchemaTypes.Boolean, + }, + antiLinks: { + type: mongoose.SchemaTypes.Boolean, + }, + leaves: { + type: mongoose.SchemaTypes.Array, + default: [] + }, + suggestion: { + + suggestionChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + suggestioncolor: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + suggestionlogChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + decline: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + deleteSuggestion: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + description: { + type: mongoose.SchemaTypes.String, + required: false, + default: `{suggestion}` + }, + footer:{ + type: mongoose.SchemaTypes.String, + required: false, + default: `Suggested by {user_tag}` + }, + timestamp: { + type: mongoose.SchemaTypes.String, + required: false, + default: false, + }, + reaction: { + type: mongoose.SchemaTypes.String, + required: false, + default: `1`, + } + + }, + report: { + + reportChannelID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + reportcolor: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + disableUser: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + disableIssue: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + upvote: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + reaction: { + type: mongoose.SchemaTypes.String, + required: false, + default: `1` + }, + reportCase: { + type: mongoose.SchemaTypes.Number, + default: '1' + }, + + }, + dashboardLogID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + cases: { + type: mongoose.SchemaTypes.Number + }, + language: { + type: mongoose.SchemaTypes.String, + default: 'english' + }, + reactionDM: { + type: Boolean, + default: true + }, + reactionLogs: { + type: mongoose.SchemaTypes.String, + default: null, + required: false, + }, + reactionColor :{ + type: mongoose.SchemaTypes.String, + default: '#000000', + required: false, + }, + autoroleID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + autoroleToggle: { + type: Boolean, + required: false, + default: false + }, + + + +}); + +module.exports = mongoose.model('guild', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/GuildPremium.js b/database/schemas/GuildPremium.js new file mode 100644 index 00000000..377ea622 --- /dev/null +++ b/database/schemas/GuildPremium.js @@ -0,0 +1,16 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + +code: {type: mongoose.SchemaTypes.String, default: null}, + +expiresAt: {type: mongoose.SchemaTypes.String, default: Date.now() + 2592000000}, + +plan: {type: mongoose.SchemaTypes.String, default: null}, + + + + +}); + +module.exports = mongoose.model('premium-guild', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/Pogy.js b/database/schemas/Pogy.js new file mode 100644 index 00000000..f5a5cf24 --- /dev/null +++ b/database/schemas/Pogy.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose'); + +const SlayBotSchema = mongoose.Schema({ + news: { + type: mongoose.SchemaTypes.String, + required: true, + }, + tag:{ + type: mongoose.SchemaTypes.String, + required: true, + }, + time:{ + type: mongoose.SchemaTypes.String, + required: true, + } +}); + +module.exports = mongoose.model('PogyNews', SlayBotSchema); \ No newline at end of file diff --git a/database/schemas/User.js b/database/schemas/User.js new file mode 100644 index 00000000..faf02766 --- /dev/null +++ b/database/schemas/User.js @@ -0,0 +1,23 @@ +const mongoose = require('mongoose'); + +const userSchema = mongoose.Schema({ + + discordId: { + type: String, + required: true, + unique: true + }, + badges: { + type: Array, + default: [] + }, + rep: { + type: Number, + required: false, + }, + lastVoted: { type: Number }, + votes: { type: Number } +}); + + +module.exports = mongoose.model('User', userSchema); \ No newline at end of file diff --git a/database/schemas/autoResponse.js b/database/schemas/autoResponse.js new file mode 100644 index 00000000..f83d557f --- /dev/null +++ b/database/schemas/autoResponse.js @@ -0,0 +1,19 @@ +const mongoose = require('mongoose'); + +const customCommandSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: false + }, + name: { + type: mongoose.SchemaTypes.String, + required: true, + }, + content: { + type: mongoose.SchemaTypes.String, + required: true, + }, +}); + +module.exports = mongoose.model('autoResponse', customCommandSchema); \ No newline at end of file diff --git a/database/schemas/blacklist.js b/database/schemas/blacklist.js new file mode 100644 index 00000000..2eb38a9a --- /dev/null +++ b/database/schemas/blacklist.js @@ -0,0 +1,28 @@ +const mongoose = require('mongoose'); + +const blacklistSchema = mongoose.Schema({ + discordId: { + type: String, + }, + guildId: { + type: String, + }, + type: { + type: String, + required: true, + }, + isBlacklisted: { + type: Boolean, + required: false + }, + reason: { + type: String, + required: false + }, + length: { + type: Date, + } +}); + + +module.exports = mongoose.model('Blacklist', blacklistSchema); \ No newline at end of file diff --git a/database/schemas/customCommand.js b/database/schemas/customCommand.js new file mode 100644 index 00000000..2bc94c0c --- /dev/null +++ b/database/schemas/customCommand.js @@ -0,0 +1,52 @@ +const mongoose = require('mongoose'); + +const customCommandSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: false + }, + name: { + type: mongoose.SchemaTypes.String, + required: true, + }, + json: { + type: mongoose.SchemaTypes.String, + default: false, + }, + content: { + type: mongoose.SchemaTypes.String, + required: true, + }, + title: { + type: mongoose.SchemaTypes.String, + required: false, + }, + description: { + type: mongoose.SchemaTypes.String, + required: false, + }, + color: { + type: mongoose.SchemaTypes.String, + required: false, + }, + footer: { + type: mongoose.SchemaTypes.String, + required: false, + }, + thumbnail: { + type: mongoose.SchemaTypes.String, + required: false, + }, + image: { + type: mongoose.SchemaTypes.String, + required: false, + }, + timestamp: { + type: mongoose.SchemaTypes.String, + required: false, + }, + +}); + +module.exports = mongoose.model('customCommand', customCommandSchema); \ No newline at end of file diff --git a/database/schemas/editsnipe.js b/database/schemas/editsnipe.js new file mode 100644 index 00000000..8348ad41 --- /dev/null +++ b/database/schemas/editsnipe.js @@ -0,0 +1,14 @@ +const mongoose = require('mongoose') + +const esnipe = mongoose.Schema({ + + guildId: {type: String}, + channel: {type: String}, + oldmessage: {type: Array, default: []}, + newmessage: {type: Array, default: []}, + id: {type: Array, default: []}, + url: {type: Array, default: []}, + +}) + +module.exports = mongoose.model('edit-snipe', esnipe) \ No newline at end of file diff --git a/database/schemas/leave.js b/database/schemas/leave.js new file mode 100644 index 00000000..e7583ed7 --- /dev/null +++ b/database/schemas/leave.js @@ -0,0 +1,93 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + leaveToggle: { + type: mongoose.SchemaTypes.String, + default: false, + }, + leaveDM: { + type: mongoose.SchemaTypes.String, + default: false + }, + leaveChannel:{ + type: mongoose.SchemaTypes.String, + default: null, + }, + leaveMessage:{ + type: mongoose.SchemaTypes.String, + default: `{user_tag} just left {guild}, we now have {memberCount} Members!`, + }, + leaveEmbed:{ + type: mongoose.SchemaTypes.String, + default: false, + }, + + embed: { + + title: { + type: mongoose.SchemaTypes.String, + default: `Goodbye!`, + }, + + titleURL: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + description: { + type: mongoose.SchemaTypes.String, + default: `{user_tag} just left {guild}, we now have {memberCount} Members!`, + }, + footer: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + footerIcon: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + color: { + type: mongoose.SchemaTypes.String, + default: `#000000`, + }, + timestamp :{ + type: mongoose.SchemaTypes.String, + default: false, + }, + + thumbnail: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + author: { + + name: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + + url: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + icon: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + }, + + }, + + +}); + +module.exports = mongoose.model('leave', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/logging.js b/database/schemas/logging.js new file mode 100644 index 00000000..ba0dd7df --- /dev/null +++ b/database/schemas/logging.js @@ -0,0 +1,340 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + + moderation: { + + mute_role: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + + delete_after_executed: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + delete_reply: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + include_reason: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + remove_roles: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + ban_action: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + kick_action: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + warn_action: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + mute_action: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + ban_message: { + + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + message: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + } + + }, + auto_punish: { + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + amount: { + type: mongoose.SchemaTypes.Number, + required: false, + default: 1 + }, + punishment: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + dm: { + type: mongoose.SchemaTypes.String, + required: false, + default: "1" + }, + + }, + + channel: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + caseN: { + type: mongoose.SchemaTypes.Number, + required: false, + default: 1 + }, + ignore_channel: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + + ignore_role: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + + color: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + + ban: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + kick: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + role: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + purge: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + lock: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + warns: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + mute: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + slowmode: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + nicknames: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + + }, + + server_events: { + + channel: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + + + color: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + + voice: { + + join: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + move: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + leave: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + + }, + + channel_created: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + channel_update: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + channel_delete: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + role_create: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + role_update: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + guild_update: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + emoji_update: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + member_join: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + member_leave: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + + }, + member_events: { + + channel: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + color: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + + role_update: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + name_change: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + + + }, + + message_events: { + + channel: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + color: { + type: mongoose.SchemaTypes.String, + required: false, + default: "#000000" + }, + toggle: { + type: mongoose.SchemaTypes.String, + required: false, + default: false + }, + + deleted: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + edited: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + purged: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + ignore: { + type: mongoose.SchemaTypes.String, + required: false, + default: true, + }, + + }, + + +}); + +module.exports = mongoose.model('logging', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/maintenance.js b/database/schemas/maintenance.js new file mode 100644 index 00000000..39d6361e --- /dev/null +++ b/database/schemas/maintenance.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose') + +const maintenance = mongoose.Schema({ + + maintenance: {type: String, default: 'maintenance'}, + toggle: {type: String, default: 'false'}, + +}) + +module.exports = mongoose.model('maintenance', maintenance) \ No newline at end of file diff --git a/database/schemas/nicknames.js b/database/schemas/nicknames.js new file mode 100644 index 00000000..8f97a0b3 --- /dev/null +++ b/database/schemas/nicknames.js @@ -0,0 +1,21 @@ +const mongoose = require('mongoose'); + +const nickSchema = mongoose.Schema({ + + discordId: { + type: String, + required: true, + }, + guildId: { + type: String, + required: true, + }, + nicknames: { + type: Array, + default: [], + }, + +}); + + +module.exports = mongoose.model('Nickname', nickSchema); \ No newline at end of file diff --git a/database/schemas/poll.js b/database/schemas/poll.js new file mode 100644 index 00000000..704052c2 --- /dev/null +++ b/database/schemas/poll.js @@ -0,0 +1,11 @@ +const { Schema, model } = require('mongoose'); + +const poll = Schema({ + guild: String, + textChannel: String, + message: String, + title: String, + expiryDate: Date, +}); + +module.exports = model('poll', poll); \ No newline at end of file diff --git a/database/schemas/snipe.js b/database/schemas/snipe.js new file mode 100644 index 00000000..3d3b7562 --- /dev/null +++ b/database/schemas/snipe.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') + +const snipe = mongoose.Schema({ + + guildId: {type: String}, + channel: {type: String}, + message: {type: Array, default: []}, + tag: {type: Array, default: []}, + image: {type: Array, default: []}, + +}) + +module.exports = mongoose.model('snipe', snipe) \ No newline at end of file diff --git a/database/schemas/stickyRole.js b/database/schemas/stickyRole.js new file mode 100644 index 00000000..b167441d --- /dev/null +++ b/database/schemas/stickyRole.js @@ -0,0 +1,26 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + stickyroleID: { + type: mongoose.SchemaTypes.String, + required: false, + default: null + }, + stickyroleToggle: { + type: String, + required: false, + default: false + }, + stickyroleUser: { + type: Array, + required: false, + default: [] + } +}); + +module.exports = mongoose.model('sticky', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/tempvc.js b/database/schemas/tempvc.js new file mode 100644 index 00000000..8bb9121c --- /dev/null +++ b/database/schemas/tempvc.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + channelID: { + type: mongoose.SchemaTypes.String, + required: false, + }, + categoryID: { + type: mongoose.SchemaTypes.String, + required: false, + }, + +}); + +module.exports = mongoose.model('Temp Vc', guildConfigSchema); \ No newline at end of file diff --git a/database/schemas/usernames.js b/database/schemas/usernames.js new file mode 100644 index 00000000..f1954a1c --- /dev/null +++ b/database/schemas/usernames.js @@ -0,0 +1,17 @@ +const mongoose = require('mongoose'); + +const uSchema = mongoose.Schema({ + + discordId: { + type: String, + required: true, + }, + usernames: { + type: Array, + default: [], + }, + +}); + + +module.exports = mongoose.model('Username', uSchema); \ No newline at end of file diff --git a/database/schemas/welcome.js b/database/schemas/welcome.js new file mode 100644 index 00000000..f6e98afc --- /dev/null +++ b/database/schemas/welcome.js @@ -0,0 +1,98 @@ +const mongoose = require('mongoose'); + +const guildConfigSchema = mongoose.Schema({ + guildId: { + type: mongoose.SchemaTypes.String, + required: true, + unique: true + }, + welcomeToggle: { + type: mongoose.SchemaTypes.String, + default: false, + }, + welcomeDM: { + type: mongoose.SchemaTypes.String, + default: false + }, + welcomeChannel:{ + type: mongoose.SchemaTypes.String, + default: null, + }, + welcomeMessage:{ + type: mongoose.SchemaTypes.String, + default: `Welcome {user} to {guild}! We now have {memberCount} Members!`, + }, + welcomeEmbed:{ + type: mongoose.SchemaTypes.String, + default: false, + }, + + embed: { + + title: { + type: mongoose.SchemaTypes.String, + default: `Welcome!`, + }, + + titleURL: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + description: { + type: mongoose.SchemaTypes.String, + default: `Welcome {user} to {guild}, we now have {memberCount} Members!`, + }, + footer: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + footerIcon: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + color: { + type: mongoose.SchemaTypes.String, + default: `#000000`, + }, + timestamp :{ + type: mongoose.SchemaTypes.String, + default: false, + }, + + thumbnail: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + image: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + author: { + + name: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + + url: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + icon: { + type: mongoose.SchemaTypes.String, + default: ``, + }, + + }, + + }, + + +}); + +module.exports = mongoose.model('welcome-module', guildConfigSchema); \ No newline at end of file diff --git a/events/channels/channelCreate.js b/events/channels/channelCreate.js new file mode 100644 index 00000000..e05b4bdd --- /dev/null +++ b/events/channels/channelCreate.js @@ -0,0 +1,100 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const cooldown = new Set(); + +const Maintenance = require('../../database/schemas/maintenance') + +module.exports = class extends Event { + +async run(message, channel) { + +if(!message || !channel) return; + + +const logging = await Logging.findOne({ guildId: message.guild.id }) + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(cooldown.has(message.guild.id)) return; + +if (message.name.indexOf('Room') >= 0) return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await message.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = message.client.color.green; + + + if(logging.server_events.channel_created == "true"){ + + +if(message.type === "text"){ + + const embed = new discord.MessageEmbed() + .setDescription(`:pencil: ***Channel Created***`) + .addField('Channel', message, true) + .addField('Channel Name', message.name, true) + .addField('Channel Type', 'Text Channel', true) + .setFooter(`Channel ID: ${message.id}`) + .setTimestamp() + .setColor(color) + + if(message.parent && message.type !== 'category')embed.addField(`Parent Name`, message.parent.name) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + cooldown.add(message.guild.id); + setTimeout(()=>{ +cooldown.delete(message.guild.id) + }, 3000) + } + +} else { + + const embed = new discord.MessageEmbed() + .setDescription(`🆕 ***Channel Created***`) + .addField('Channel Name', message.name, true) + .addField('Channel Type', message.type, true) + .setFooter(`Channel ID: ${message.id}`) + .setTimestamp() + .setColor(color) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + cooldown.add(message.guild.id); + setTimeout(()=>{ +cooldown.delete(message.guild.id) + }, 3000) + } + +} + + } + + + } + } +} + + + } +}; \ No newline at end of file diff --git a/events/channels/channelDelete.js b/events/channels/channelDelete.js new file mode 100644 index 00000000..4373f0fb --- /dev/null +++ b/events/channels/channelDelete.js @@ -0,0 +1,67 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const cooldown = new Set(); + +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(message, channel) { + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: message.guild.id }) + +if(cooldown.has(message.guild.id)) return; + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +if (message.name.indexOf('Room') >= 0) return; + +const channelEmbed = await message.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = message.client.color.red; + + + if(logging.server_events.channel_delete == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`:wastebasket: ***Channel Deleted***`) + .addField('Channel Type', message.type, true) + .addField('Channel Name', message.name, true) + .setFooter(`Channel ID: ${message.id}`) + .setTimestamp() + .setColor(color) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + cooldown.add(message.guild.id); + setTimeout(()=>{ +cooldown.delete(message.guild.id) + }, 3000) + } + } + + + } + } +} + + + } +}; \ No newline at end of file diff --git a/events/channels/channelUpdate.js b/events/channels/channelUpdate.js new file mode 100644 index 00000000..60f2c3d5 --- /dev/null +++ b/events/channels/channelUpdate.js @@ -0,0 +1,127 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +const cooldown = new Set(); + +module.exports = class extends Event { + +async run(oldChannel, newChannel) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; +if(cooldown.has(newChannel.guild.id)) return; + + if(!oldChannel.name.startsWith('ticket-') || !newChannel.name.startsWith('ticket-')){ + +if (oldChannel.name.indexOf('Room') >= 0) return; +if (newChannel.name.indexOf('Room') >= 0) return; + + +const logging = await Logging.findOne({ guildId: newChannel.guild.id }) + + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +const channelEmbed = await oldChannel.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = this.client.color.yellow; + + let type; + + if(newChannel.type === "category") type = "Category"; + if(newChannel.type === "text") type = "Text Channel"; + if(newChannel.type === "voice") type = "Voice Channel"; + + + if(logging.server_events.channel_created == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`:pencil: ***${type} Updated***`) + .addField('Channel', newChannel, true) + .setFooter(`Channel ID: ${newChannel.id}`) + .setTimestamp() + .setColor(color) + + +if(oldChannel.name !== newChannel.name) { + embed.addField('Name Update', `${oldChannel.name} --> ${newChannel.name}`, true) + + } else { + embed.addField('Name Update', `Name not updated`, true) + + } + +if(oldChannel.topic || newChannel.topic){ +if(oldChannel.topic !== newChannel.topic){ + +embed.addField('Topic', `${oldChannel.topic || 'none'} --> ${newChannel.topic || 'none'}`) + +} +} + + + +if(oldChannel.nsfw || newChannel.nsfw){ +if(oldChannel.nsfw !== newChannel.nsfw){ + + +embed.addField('NSFW', `${oldChannel.nsfw} --> ${newChannel.nsfw}`) + +} +} + + +if(oldChannel.rateLimitPerUser || newChannel.rateLimitPerUser ){ +if(oldChannel.rateLimitPerUser!== newChannel.rateLimitPerUser){ + +embed.addField('Slowmode', `${oldChannel.rateLimitPerUser} --> ${newChannel.rateLimitPerUser}`) + +} +} + +if(oldChannel.rateLimitPerUser === newChannel.rateLimitPerUser ){ + if(oldChannel.name === newChannel.name) { + if(oldChannel.topic === newChannel.topic){ + if(oldChannel.nsfw === newChannel.nsfw){ + return; + } + } + } +} + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newChannel.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + cooldown.add(newChannel.guild.id); + setTimeout(()=>{ +cooldown.delete(newChannel.guild.id) + }, 3000) + } + + + + } + } + } + } + +} + + } +}; \ No newline at end of file diff --git a/events/debug.js b/events/debug.js new file mode 100644 index 00000000..823fb317 --- /dev/null +++ b/events/debug.js @@ -0,0 +1,44 @@ +const muteModel = require('../models/mute'); +const Event = require('../structures/Event'); +const Discord = require('discord.js') +const webhookClient = new Discord.WebhookClient('', ''); +const logger = require('../utils/logger'); +const Maintenance = require('../database/schemas/maintenance') +let number = 1 +module.exports = class extends Event { + async run(info) { + +let embed; + const maintenance = await Maintenance.findOne({maintenance: 'maintenance'}) + + + if(info.includes('hit')){ + + +number = ++number + +embed = `${info} - ${number}`; +logger.info(info, { label: 'Debug' }) + + +if(number >= 10){ + embed = `${info} - ${number} - SAFE MODE REACHED <@710465231779790849>`; + console.log('Safe mode reached - Turning maintenance mode on.') + maintenance.toggle = "true" + await maintenance.save(); + process.exit(1); + +} + +const lmao = new Discord.MessageEmbed() +.setDescription(embed) +.setColor('RED') + + +webhookClient.send(lmao) + } + + + + } +} \ No newline at end of file diff --git a/events/emojis/emojiCreate.js b/events/emojis/emojiCreate.js new file mode 100644 index 00000000..d02bb19a --- /dev/null +++ b/events/emojis/emojiCreate.js @@ -0,0 +1,64 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(emoji) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: emoji.guild.id }) + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await emoji.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = emoji.client.color.green; + + + if(logging.server_events.emoji_update == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`🆕 ***Emoji Created***`) + .addField('Emoji Name', emoji.name, true) + .addField('Emoji', emoji, true) + .addField('Full ID', `\`<:${emoji.name}:${emoji.id}>\``, true) + .setFooter(`Emoji ID: ${emoji.id}`) + .setTimestamp() + .setColor(color) + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(emoji.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + + } +}; \ No newline at end of file diff --git a/events/emojis/emojiDelete.js b/events/emojis/emojiDelete.js new file mode 100644 index 00000000..5e2158d8 --- /dev/null +++ b/events/emojis/emojiDelete.js @@ -0,0 +1,63 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(emoji) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: emoji.guild.id }) + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await emoji.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = emoji.client.color.red; + + + if(logging.server_events.emoji_update == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`🗑️ ***Emoji Delete***`) + .addField('Emoji Name', emoji.name, true) + .addField('Emoji', emoji, true) + .setFooter(`Emoji ID: ${emoji.id}`) + .setTimestamp() + .setColor(color) + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(emoji.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + + } +}; \ No newline at end of file diff --git a/events/emojis/emojiUpdate.js b/events/emojis/emojiUpdate.js new file mode 100644 index 00000000..c86560f8 --- /dev/null +++ b/events/emojis/emojiUpdate.js @@ -0,0 +1,61 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(oldEmoji, newEmoji) { + +const logging = await Logging.findOne({ guildId: newEmoji.guild.id }) + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await oldEmoji.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = oldEmoji.client.color.yellow; + + + if(logging.server_events.emoji_update == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`:pencil: ***Emoji Updated***`) + .addField('Emoji Name', `${oldEmoji.name} --> ${newEmoji.name}`, true) + .addField('Emoji', newEmoji, true) + .addField('Full ID', `\`<:${oldEmoji.name}:${oldEmoji.id}>\``, true) + .setFooter(`Emoji ID: ${oldEmoji.id}`) + .setTimestamp() + .setColor(color) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newEmoji.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + + } +}; \ No newline at end of file diff --git a/events/errors/apiError.js b/events/errors/apiError.js new file mode 100644 index 00000000..7fa134b6 --- /dev/null +++ b/events/errors/apiError.js @@ -0,0 +1,11 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); + +module.exports = class extends Event { + + async run(error, message, command) { + console.log(error); + + message.channel.send(``) + } +}; \ No newline at end of file diff --git a/events/errors/botMissingPermissions.js b/events/errors/botMissingPermissions.js new file mode 100644 index 00000000..37e87324 --- /dev/null +++ b/events/errors/botMissingPermissions.js @@ -0,0 +1,11 @@ +const Event = require('../../structures/Event'); +const permissions = require('../../assets/json/permissions.json'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Event { + + async run(permissions, message) { + if (!message) return; + + + } +}; \ No newline at end of file diff --git a/events/errors/commandError.js b/events/errors/commandError.js new file mode 100644 index 00000000..6811d4f7 --- /dev/null +++ b/events/errors/commandError.js @@ -0,0 +1,21 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const webhookClient = new Discord.WebhookClient('', ''); + +module.exports = class extends Event { + + async run(error, message) { + console.error(error) + + if(message.channel && + message.channel.viewable && + message.channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + message.channel.send(`${message.client.emoji.fail} Hey pogger! An Error just occured, make sure to report it here https://discord.gg/FqdH4sfKBg`).catch(()=>{}) + } + + + + webhookClient.send(`${message.author.username} (${message.author.id})\n${message.content}\n${error}`); + + } +}; \ No newline at end of file diff --git a/events/errors/fatalError.js b/events/errors/fatalError.js new file mode 100644 index 00000000..332154d8 --- /dev/null +++ b/events/errors/fatalError.js @@ -0,0 +1,37 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const webhookClient = new Discord.WebhookClient('', ''); +const fatalCooldown = new Set(); +const uuid = require("uuid"); +const id = uuid.v4(); + +module.exports = class extends Event { + + async run(error, message, command) { + console.log(error); + +/* + if(message.channel && + message.channel.viewable && + message.channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + if(!fatalCooldown.has(message.channel.id)){ + message.channel.send(`${message.client.emoji.fail} Hey Pogger. An error Just occured and will be reported.\n\`code: ${id}\`\n\nmake sure to report it here (important) https://discord.gg/FqdH4sfKBg `).catch(()=>{}); + + + + fatalCooldown.add(message.channel.id) + setTimeout(()=>{ + fatalCooldown.delete(message.channel.id) + }, 100000) + } + } + */ + const embed = new Discord.MessageEmbed() + .setColor('GREEN') + .setDescription(`**User:** ${message.author} (${message.author.tag} - ${message.author.id})\n**Message:** ${message.content}\n**Error:** ${error}\n**ID:** \`${id}\`\n\n__**Guild Info**__\nName: ${message.guild.name}\nID: ${message.guild.id}\nChannel: ${message.channel.name} (${message.channel.id})`) + .setTimestamp() + + webhookClient.send(embed) + + } +}; \ No newline at end of file diff --git a/events/guild/guildCreate.js b/events/guild/guildCreate.js new file mode 100644 index 00000000..9fe85f13 --- /dev/null +++ b/events/guild/guildCreate.js @@ -0,0 +1,142 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const logger = require('../../utils/logger'); +const Guild = require('../../database/schemas/Guild'); +const metrics = require('datadog-metrics'); +const Logging = require('../../database/schemas/logging') +const welcomeClient = new Discord.WebhookClient('',''); + +const webhookClient = new Discord.WebhookClient('', ''); + +module.exports = class extends Event { + + async run(guild) { + logger.info(`Joined to "${guild.name}" (${guild.id})`, { label: 'Guilds' }) + + const find = await Guild.findOne({ + guildId: guild.id, + }) + + if(!find){ + const guildConfig = await Guild.create({ + guildId: guild.id, + language: "english" + }) + await guildConfig.save().catch(()=>{}) + } + + + var textChats = guild.channels.cache + .find(ch => ch.type === 'text' && ch.permissionsFor(guild.me).has(['SEND_MESSAGES', 'VIEW_CHANNEL', 'EMBED_LINKS'])) + +const modLog = guild.channels.cache.find(c => c.name.replace('-', '').replace('s', '') === 'modlog' || + c.name.replace('-', '').replace('s', '') === 'moderatorlog'); + + let muteRole = guild.roles.cache.find(r => r.name.toLowerCase() === 'muted'); + if (!muteRole) { + try { + muteRole = await guild.roles.create({ + data: { + name: 'Muted', + permissions: [] + } + }); + } catch { + + } + for (const channel of guild.channels.cache.values()) { + try { + if (channel.viewable && channel.permissionsFor(guild.me).has('MANAGE_ROLES')) { + if (channel.type === 'text') + await channel.updateOverwrite(muteRole, { + 'SEND_MESSAGES': false, + 'ADD_REACTIONS': false + }); + else if (channel.type === 'voice' && channel.editable) // + await channel.updateOverwrite(muteRole, { + 'SPEAK': false, + 'STREAM': false + }); + } + } catch (err) { + + } + } + } + + const logging = await Logging.findOne({ + guildId: guild.id + }) + if(!logging){ + const newL = await Logging.create({ + guildId: guild.id + }) + await newL.save().catch(()=>{}) + } + + const logging2 = await Logging.findOne({ + guildId: guild.id + }) + + if(logging2){ + if(muteRole){ +logging2.moderation.mute_role = muteRole.id + } + + if(modLog){ + logging2.moderation.channel = modLog.id + } + await logging2.save().catch(()=>{}) + + + } + + if(textChats){ + const embed = new Discord.MessageEmbed() + .setColor('PURPLE') + .setDescription(`Hey Poggers! I'm **Pogy**.\n\nThank you for inviting me to your server as it means a lot to us! You can get started with [\`p!help\`](https://pogy.xyz) & customise your server settings by accessing the Dashboard [\`here\`](https://pogy.xyz/dashboard/${guild.id}).\n\n__**Current News**__\n\`\`\`\nWe are currently giving premium to all servers until 1000 guilds! If interested Please visit https://pogy.xyz/redeem\`\`\`\n\nAgain, thank you for inviting me! (this server is now very pog)\n**- Pogy**`) + .addField( + '\u200b', + '**[Invite](https://invite.pogy.xyz) | ' + + '[Support Server](https://pogy.xyz/support) | ' + + '[Dashboard](https://pogy.xyz/dashboard)**' + ); + + + + textChats.send(embed).catch(()=>{}) + } + + + const welcomeEmbed = new Discord.MessageEmbed() + .setColor(`PURPLE`) + .setTitle('New Server') + .setThumbnail(`https://pogy.xyz/logo`) + .setDescription(`Pogy was added to a new Server!`) + .addField(`Server Name`, `\`${guild.name}\``, true) + .addField(`Server ID`, `\`${guild.id}\``, true) + .setFooter(`${this.client.guilds.cache.size} guilds `, 'https://pogy.xyz/logo.png'); + +welcomeClient.send({ + username: 'Pogy', + avatarURL: 'https://pogy.xyz/logo.png', + embeds: [welcomeEmbed], +}) + metrics.init({ apiKey: this.client.config.datadogApiKey, host: 'pogy', prefix: 'pogy.' }); + metrics.increment('guildCreate'); + + const embed = new Discord.MessageEmbed() + .setColor('GREEN') + .setDescription(`I have joined the ${guild.name} server.\n\nID: ${guild.id}`) + .setFooter(`Gained ${guild.members.cache.size - 1} members • I'm now in ${this.client.guilds.cache.size} servers!`) + .setThumbnail(guild.iconURL({ dynamic: true }) ? guild.iconURL({ dynamic: true }) : `https://guild-default-icon.herokuapp.com/${encodeURIComponent(guild.nameAcronym)}`) + .addField('Server Owner', `${guild.owner.user.tag} / ${guild.ownerID}`) + + webhookClient.send({ + username: 'Pogy', + avatarURL: 'https://pogy.xyz/logo.png', + embeds: [embed], + }); + +} +}; \ No newline at end of file diff --git a/events/guild/guildDelete.js b/events/guild/guildDelete.js new file mode 100644 index 00000000..48bb23eb --- /dev/null +++ b/events/guild/guildDelete.js @@ -0,0 +1,55 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const logger = require('../../utils/logger'); +const Guild = require('../../database/schemas/Guild'); +const metrics = require('datadog-metrics'); +const Logging = require('../../database/schemas/logging') +const webhookClient = new Discord.WebhookClient('', ''); +const welcomeClient = new Discord.WebhookClient('',''); +module.exports = class extends Event { + + async run(guild) { + Guild.findOneAndDelete({ + guildId: guild.id, + }, (err, res) => { + if (err) console.log(err) + logger.info(`Left from "${guild.name}" (${guild.id})`, { label: 'Guilds' }) + }) + + const welcomeEmbed = new Discord.MessageEmbed() + .setColor(`RED`) + .setTitle('Leave Server') + .setThumbnail(`https://pogy.xyz/logo`) + .setDescription(`Pogy left a Server!`) + .addField(`Server Name`, `\`${guild.name}\``, true) + .addField(`Server ID`, `\`${guild.id}\``, true) + .setFooter(`${this.client.guilds.cache.size} guilds `, 'https://pogy.xyz/logo.png'); + +welcomeClient.send({ + username: 'Pogy', + avatarURL: 'https://pogy.xyz/logo.png', + embeds: [welcomeEmbed], +}) + +Logging.findOneAndDelete({ + guildId: guild.id, + }).catch(()=>{}); + + metrics.init({ apiKey: this.client.config.datadogApiKey, host: 'pogy', prefix: 'pogy.' }); + metrics.increment('guildDelete'); + + const embed = new Discord.MessageEmbed() + .setColor('RED') + .setDescription(`I have left the ${guild.name} server.`) + .setFooter(`Lost ${guild.members.cache.size - 1} members • I'm now in ${this.client.guilds.cache.size} servers..\n\nID: ${guild.id}`) + .setThumbnail(guild.iconURL({ dynamic: true }) ? guild.iconURL({ dynamic: true }) : `https://guild-default-icon.herokuapp.com/${encodeURIComponent(guild.nameAcronym)}`) + .addField('Server Owner', `${guild.owner} / ${guild.ownerID}`) + + webhookClient.send({ + username: 'Pogy', + avatarURL: 'https://pogy.xyz/logo.png', + embeds: [embed], + }); + + } +}; \ No newline at end of file diff --git a/events/guild/guildUpdate.js b/events/guild/guildUpdate.js new file mode 100644 index 00000000..278be96d --- /dev/null +++ b/events/guild/guildUpdate.js @@ -0,0 +1,104 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(oldGuild, newGuild) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: oldGuild.id }) + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +const channelEmbed = await oldGuild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = oldGuild.client.color.yellow; + + + if(logging.server_events.channel_created == "true"){ + + + const embed = new discord.MessageEmbed() + .setDescription(`:pencil: ***Guild Updated***`) + .setFooter(`Guild ID: ${oldGuild.id}`) + .setTimestamp() + .setColor(color) + + +if(oldGuild.name !== newGuild.name) { + embed.addField('Name Update', `${oldGuild.name} --> ${newGuild.name}`, true) + + } else { + embed.addField('Name Update', `Name not updated`, true) + + } + + +if(oldGuild.verificationLevel !== newGuild.verificationLevel) { + embed.addField('verification Level', `${oldGuild.verificationLevel || 'none'} --> ${newGuild.verificationLevel || 'none'}`, true) + + } + + if(oldGuild.icon !== newGuild.icon) { + embed.addField('Icon', `[old Icon](${oldGuild.iconURL({ dynamic: true, size: 512 })}) --> [new Icon](${newGuild.iconURL({ dynamic: true, size: 512 })})`, true) + + } + + + if(oldGuild.region !== newGuild.region) { + embed.addField('region', `${oldGuild.region || 'none'} --> ${newGuild.region || 'none'}`, true) + + } + + + if(oldGuild.ownerID !== newGuild.ownerID) { + embed.addField('Owner', `<@${oldGuild.ownerID || 'none'}> **(${oldGuild.ownerID})** --> <@${newGuild.ownerID}>**(${newGuild.ownerID})**`, true) + + } + + if(oldGuild.afkTimeout !== newGuild.afkTimeout) { + embed.addField('afk Timeout', `${oldGuild.afkTimeout || 'none'} --> ${newGuild.afkTimeout || 'none'}`, true) + + } + + if(oldGuild.afkChannelID !== newGuild.afkChannelID) { + embed.addField('afk Channel', `${oldGuild.afkChannelID || 'none'}> --> ${newGuild.afkChannelID || 'none'}`, true) + + } + + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newGuild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + + + } + } + } + +} + + + + } +}; \ No newline at end of file diff --git a/events/members/guildMemberAdd.js b/events/members/guildMemberAdd.js new file mode 100644 index 00000000..9de9c75d --- /dev/null +++ b/events/members/guildMemberAdd.js @@ -0,0 +1,377 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Guild = require('../../database/schemas/Guild'); +const WelcomeDB = require('../../database/schemas/welcome'); +const Canvas = require('canvas'); +const { MessageAttachment } = require('discord.js'); +const discord = require("discord.js"); +const muteModel = require('../../models/mute'); +const moment = require('moment'); +const alt = require("../../models/altdetector.js") +const StickyDB = require('../../database/schemas/stickyRole'); +const Logging = require('../../database/schemas/logging'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + async run(member) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: member.guild.id }); + +const muteDoc = await muteModel.findOne({ + guildID: member.guild.id, + memberID: member.id, + }) + + if (muteDoc) { + const muteRole = member.guild.roles.cache.find(r => r.name == 'Muted') + + if (muteRole) member.roles.add(muteRole.id, ["Mute Command / User left and Rejoined."]).catch(()=>{}) + + muteDoc.memberRoles = [] + + await muteDoc.save().catch(()=>{}) + } + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +const channelEmbed = await member.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = member.client.color.green; + + + if(logging.server_events.member_join == "true"){ + + + + const embed = new discord.MessageEmbed() + .setTitle('📥 Member Joined') + .setAuthor(`${member.guild.name}`, member.guild.iconURL({ dynamic: true })) + .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${member} (**${member.user.tag}**)`) + .addField('Account created on', moment(member.user.createdAt).format('dddd, MMMM Do YYYY')) + .setTimestamp() + .setColor(member.guild.me.displayHexColor); + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(member.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + + } + } + } + +} + + + + + + + let altDetector = await alt.findOne({ guildID: member.guild.id }) + if(altDetector) { + if(altDetector.altToggle === true) { + let arr = altDetector.allowedAlts + if(!arr.includes(member.id)) { + let altLog = member.guild.channels.cache.get(altDetector.altModlog); + + let day = Number(altDetector.altDays) + let x = Date.now() - member.user.createdAt; + let created = Math.floor(x / 86400000); + + + + if(day >= created) { + + let action; + if(altDetector.altAction && altDetector.altAction.toLowerCase() === "ban") { + await member.ban({reason: "Alt Account | Alt Detector Module"}).catch(()=>{}) + action = "Banned" + } + if(altDetector.altAction && altDetector.altAction.toLowerCase() === "kick") { + await member.kick({ reason: "Alt Account | Alt Detector Module"}).catch(()=>{}) + action = "Kicked" + } + + if(altLog) { + if(action && action === "Kicked" || action === "Banned"){ + const embedAlt = new discord.MessageEmbed() + .setColor('GREEN') + .setTitle(`Alt Detector | ${member.user.tag}`) + .setDescription(`**${action} ${member.user.tag} From the guild.**\n\n**Reason:** Alt Detector\n\n__**Account Created at:**__ ${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + altLog.send(embedAlt).catch(()=>{}) + } + } + + } + } + } + } + + let guildDB = await Guild.findOne({ + guildId: member.guild.id + }); + + let welcome = await WelcomeDB.findOne({ + guildId: member.guild.id + }) + + if (!welcome) { + + const newSettings = new WelcomeDB({ + guildId: member.guild.id + }); + await newSettings.save().catch(()=>{}); + welcome= await WelcomeDB.findOne({ guildId: member.guild.id }); + + } + + if(welcome.welcomeToggle == "true") { + + if(welcome.welcomeDM == "true"){ + +let text = welcome.welcomeMessage.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(welcome.welcomeEmbed == "false") { + member.send(`${text}`).catch(() => {}) + } + if(welcome.welcomeEmbed == "true") { + let embed = new discord.MessageEmbed() + + let color = welcome.embed.color + if(color) embed.setColor(color) + + let title = welcome.embed.title + if(title !== null) embed.setTitle(title) + + let titleUrl = welcome.embed.titleURL + if(titleUrl !== null) embed.setURL(titleUrl) + + let textEmbed = welcome.embed.description.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(textEmbed !== null) embed.setDescription(textEmbed) + + let authorName = welcome.embed.author.name.replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + + if(authorName !== null) embed.setAuthor(authorName) + + let authorIcon = welcome.embed.author.icon + if(authorIcon !== null) embed.setAuthor(authorName, authorIcon) + + let authorUrl = welcome.embed.author.url + if(authorUrl !== null) embed.setAuthor(authorName, authorIcon, authorUrl) + + + let footer = welcome.embed.footer + if(footer !== null) embed.setFooter(footer) + + let footerIcon = welcome.embed.footerIcon + if(footer && footerIcon !== null) embed.setFooter(footer, footerIcon) + + let timestamp = welcome.embed.timestamp + if(timestamp == "true") embed.setTimestamp() + + + let thumbnail = welcome.embed.thumbnail + if(thumbnail === "{userAvatar}") thumbnail = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(thumbnail !== null) embed.setThumbnail(thumbnail) + + let image = welcome.embed.image + if(image === "{userAvatar}") image = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(image !== null) embed.setImage(image) + + member.send(embed).catch(()=>{}) + } + + + }; + if(welcome.welcomeDM == "false"){ + if (welcome.welcomeChannel) { + const greetChannel = member.guild.channels.cache.get(welcome.welcomeChannel) + if (greetChannel) { + + let text = welcome.welcomeMessage.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(welcome.welcomeEmbed == "false") { + + if(greetChannel && + greetChannel.viewable && + greetChannel.permissionsFor(member.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + greetChannel.send(`${text}`).catch(() => {}) + } + + + } + if(welcome.welcomeEmbed == "true") { + let embed = new discord.MessageEmbed() + + let color = welcome.embed.color + if(color) embed.setColor(color) + + let title = welcome.embed.title + if(title !== null) embed.setTitle(title) + + let titleUrl = welcome.embed.titleURL + if(titleUrl !== null) embed.setURL(titleUrl) + + let textEmbed = welcome.embed.description.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(textEmbed !== null) embed.setDescription(textEmbed) + + let authorName = welcome.embed.author.name.replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + + if(authorName !== null) embed.setAuthor(authorName) + + let authorIcon = welcome.embed.author.icon + if(authorIcon !== null) embed.setAuthor(authorName, authorIcon) + + let authorUrl = welcome.embed.author.url + if(authorUrl !== null) embed.setAuthor(authorName, authorIcon, authorUrl) + + + let footer = welcome.embed.footer + if(footer !== null) embed.setFooter(footer) + + let footerIcon = welcome.embed.footerIcon + if(footer && footerIcon !== null) embed.setFooter(footer, footerIcon) + + let timestamp = welcome.embed.timestamp + if(timestamp == "true") embed.setTimestamp() + + + let thumbnail = welcome.embed.thumbnail + if(thumbnail === "{userAvatar}") thumbnail = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(thumbnail !== null) embed.setThumbnail(thumbnail) + + let image = welcome.embed.image + if(image === "{userAvatar}") image = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(image !== null) embed.setImage(image) + + if(greetChannel && + greetChannel.viewable && + greetChannel.permissionsFor(member.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + greetChannel.send(embed).catch(() => {}) + } + } + } + } + } +} + + if(guildDB && guildDB.autorole && guildDB.autoroleToggle === true) { + if(guildDB.autoroleID) { + let role = member.guild.roles.cache.get(guildDB.autoroleID) + if(role) { + member.roles.add(role).catch(() => {}) + } + } + } + + + let sticky = await StickyDB.findOne({ + guildId: member.guild.id + }) + + if (!sticky) { + + const newSettingss = new StickyDB({ + guildId: member.guild.id + }); + await newSettingss.save().catch(()=>{}); + sticky = await StickyDB.findOne({ guildId: member.guild.id }); + + } + + + if(sticky){ + +let stickyRoleID = sticky.stickyroleID; +let stickyRole = member.guild.roles.cache.get(stickyRoleID); +if(sticky.stickyroleToggle == "true"){ +if(stickyRole){ + + +if(!member.roles.cache.find(r => r.name.toLowerCase() === stickyRole.name)){ + +if(sticky.stickyroleUser.includes(member.id)){ + await member.roles.add(stickyRole).catch(()=>{}) +} + + +} + + +} +} + + } + } +}; \ No newline at end of file diff --git a/events/members/guildMemberRemove.js b/events/members/guildMemberRemove.js new file mode 100644 index 00000000..a4f5da45 --- /dev/null +++ b/events/members/guildMemberRemove.js @@ -0,0 +1,329 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Guild = require('../../database/schemas/Guild'); +const Canvas = require('canvas'); +const { MessageAttachment } = require('discord.js'); +const discord = require("discord.js"); +const moment = require('moment'); +const LeaveDB = require('../../database/schemas/leave'); +const StickyDB = require('../../database/schemas/stickyRole'); +const Logging = require('../../database/schemas/logging'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + async run(member) { + const logging = await Logging.findOne({ guildId: member.guild.id }); + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +const channelEmbed = await member.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = member.client.color.red; + + + if(logging.server_events.member_join == "true"){ + + + + const embed = new discord.MessageEmbed() + .setTitle(':outbox_tray: Member Left') + .setAuthor(`${member.guild.name}`, member.guild.iconURL({ dynamic: true })) + .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${member} (**${member.user.tag}**)`) + .addField('Account created on', moment(member.user.createdAt).format('dddd, MMMM Do YYYY')) + .setTimestamp() + .setColor(member.guild.me.displayHexColor); + channelEmbed.send(embed).catch(()=>{}) + + + + + } + } + } + +} + + + let guildDB = await Guild.findOne({ + guildId: member.guild.id + }); + + if(guildDB){ + guildDB.leaves.forEach(async(leave)=>{ + + + let xx = leave - Date.now(); + let createdd = Math.floor(xx / 86400000); + + + + if(6 <= createdd) { + removeA(guildDB.leaves, leave) + await guildDB.save().catch(()=>{}) + + } + }); + + guildDB.leaves.push(Date.now()) + await guildDB.save().catch(()=>{}) + }; + + let leave = await LeaveDB.findOne({ + guildId: member.guild.id + }) + + if (!leave) { + + const newSettings = new LeaveDB({ + guildId: member.guild.id + }); + await newSettings.save().catch(()=>{}); + leave = await LeaveDB.findOne({ guildId: member.guild.id }); + + } + + if(leave.leaveToggle == "true") { + + if(leave.leaveDM == "true"){ + +let text = leave.leaveMessage.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(leave.leaveEmbed == "false") { + member.send(`${text}`).catch(() => {}) + } + if(leave.leaveEmbed == "true") { + let embed = new discord.MessageEmbed() + + let color = leave.embed.color + if(color) embed.setColor(color) + + let title = leave.embed.title + if(title !== null) embed.setTitle(title) + + let titleUrl = leave.embed.titleURL + if(titleUrl !== null) embed.setURL(titleUrl) + + let textEmbed = leave.embed.description.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(textEmbed !== null) embed.setDescription(textEmbed) + + let authorName = leave.embed.author.name.replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + + if(authorName !== null) embed.setAuthor(authorName) + + let authorIcon = leave.embed.author.icon + if(authorIcon !== null) embed.setAuthor(authorName, authorIcon) + + let authorUrl = leave.embed.author.url + if(authorUrl !== null) embed.setAuthor(authorName, authorIcon, authorUrl) + + + let footer = leave.embed.footer + if(footer !== null) embed.setFooter(footer) + + let footerIcon = leave.embed.footerIcon + if(footer && footerIcon !== null) embed.setFooter(footer, footerIcon) + + let timestamp = leave.embed.timestamp + if(timestamp == "true") embed.setTimestamp() + + + let thumbnail = leave.embed.thumbnail + if(thumbnail === "{userAvatar}") thumbnail = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(thumbnail !== null) embed.setThumbnail(thumbnail) + + member.send(embed).catch(()=>{}) + } + + + }; + if(leave.leaveDM == "false"){ + if (leave.leaveChannel) { + const greetChannel = member.guild.channels.cache.get(leave.leaveChannel) + if (greetChannel) { + + let text = leave.leaveMessage.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(leave.leaveEmbed == "false") { + greetChannel.send(`${text}`).catch(() => {}) + } + if(leave.leaveEmbed == "true") { + let embed = new discord.MessageEmbed() + + let color = leave.embed.color + if(color) embed.setColor(color) + + let title = leave.embed.title + if(title !== null) embed.setTitle(title) + + let titleUrl = leave.embed.titleURL + if(titleUrl !== null) embed.setURL(titleUrl) + + let textEmbed = leave.embed.description.replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(member.user.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(member.user.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + if(textEmbed !== null) embed.setDescription(textEmbed) + + let authorName = leave.embed.author.name.replace(/{user_tag}/g, `${member.user.tag}`) + .replace(/{user_name}/g, `${member.user.username}`) + .replace(/{user_ID}/g, `${member.id}`) + .replace(/{guild_name}/g, `${member.guild.name}`) + .replace(/{guild_ID}/g, `${member.guild.id}`) + .replace(/{memberCount}/g, `${member.guild.memberCount}`) + .replace(/{size}/g, `${member.guild.memberCount}`) + .replace(/{guild}/g, `${member.guild.name}`) + + if(authorName !== null) embed.setAuthor(authorName) + + let authorIcon = leave.embed.author.icon + if(authorIcon !== null) embed.setAuthor(authorName, authorIcon) + + let authorUrl = leave.embed.author.url + if(authorUrl !== null) embed.setAuthor(authorName, authorIcon, authorUrl) + + + let footer = leave.embed.footer + if(footer !== null) embed.setFooter(footer) + + let footerIcon = leave.embed.footerIcon + if(footer && footerIcon !== null) embed.setFooter(footer, footerIcon) + + let timestamp = leave.embed.timestamp + if(timestamp == "true") embed.setTimestamp() + + + let thumbnail = leave.embed.thumbnail + if(thumbnail === "{userAvatar}") thumbnail = member.user.displayAvatarURL({ dynamic: true, size: 512 }) + if(thumbnail !== null) embed.setThumbnail(thumbnail) + + greetChannel.send(embed).catch(()=>{}) + } + } + } + } +} + + if(guildDB && guildDB.autoroleToggle && guildDB.autoroleToggle === true) { + if(guildDB.autoroleID) { + let role = member.guild.roles.cache.get(guildDB.autoroleID) + if(role) { + member.roles.add(role).catch(() => {}) + } + } + } + + + + + + + let sticky = await StickyDB.findOne({ + guildId: member.guild.id + }) + + if (!sticky) { + + const newSettingss = new StickyDB({ + guildId: member.guild.id + }); + await newSettingss.save().catch(()=>{}); + sticky = await StickyDB.findOne({ guildId: member.guild.id }); + + } + + + if(sticky){ + +let stickyRoleID = sticky.stickyroleID; +let stickyRole = member.guild.roles.cache.get(stickyRoleID); +if(sticky.stickyroleToggle == "true"){ +if(stickyRole){ + + +if(member.roles.cache.find(r => r.name.toLowerCase() === stickyRole.name)){ + + +sticky.stickyroleUser.push(member.id) +await sticky.save().catch(()=>{}) + + + +} + + +} +} + } + + + + } +}; +function removeA(arr) { + var what, a = arguments, L = a.length, ax; + while (L > 1 && arr.length) { + what = a[--L]; + while ((ax= arr.indexOf(what)) !== -1) { + arr.splice(ax, 1); + } + } + return arr; +} \ No newline at end of file diff --git a/events/members/guildMemberUpdate.js b/events/members/guildMemberUpdate.js new file mode 100644 index 00000000..cf9746af --- /dev/null +++ b/events/members/guildMemberUpdate.js @@ -0,0 +1,176 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Nickname = require('../../database/schemas/nicknames'); +const discord = require("discord.js"); +const moment = require('moment'); +const Logging = require('../../database/schemas/logging'); +const Maintenance = require('../../database/schemas/maintenance') +const cooldown = new Set(); + +module.exports = class extends Event { + async run(oldMember, newMember) { + +const logging = await Logging.findOne({ guildId: oldMember.guild.id }); + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(logging){ + if(logging.member_events.toggle == "true"){ + + +const channelEmbed = await oldMember.guild.channels.cache.get(logging.member_events.channel) + +if(channelEmbed){ + + if(logging.member_events.role_update == "true"){ + +let colorGreen = logging.member_events.color; +if(colorGreen == "#000000") colorGreen = oldMember.client.color.green; +let colorRed = logging.member_events.color; +if(colorRed == "#000000") colorRed = oldMember.client.color.red; +const role = oldMember.roles.cache.difference(newMember.roles.cache).first(); + + if (oldMember.roles.cache.size < newMember.roles.cache.size) { + const roleAddembed = new discord.MessageEmbed() + .setAuthor(`${newMember.user.tag} | Role add`, newMember.user.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(colorGreen) + .setFooter(`ID: ${newMember.id}`) + .setDescription(`**Added Roles**\n Role: ${role}\n User: ${newMember}\n\n ${newMember} Was given the **${role.name}** Role.`); + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newMember.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(roleAddembed).catch(()=>{}); + cooldown.add(newMember.guild.id) + setTimeout(()=>{ + cooldown.delete(newMember.guild.id) + }, 3000) + } + + + + } + + +if (oldMember.roles.cache.size > newMember.roles.cache.size) { + + const roleRemoveembed = new discord.MessageEmbed() + .setAuthor(`${newMember.user.tag} | Role Remove`, newMember.user.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setColor(colorRed) + .setFooter(`ID: ${newMember.id}`) + .setDescription(`**Removed Roles**\n Role: ${role}\n User: ${newMember}\n\n The **${role.name}** role was removed from ${newMember}`); + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newMember.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(roleRemoveembed).catch(()=>{}); + cooldown.add(newMember.guild.id) + setTimeout(()=>{ + cooldown.delete(newMember.guild.id) + }, 3000) + } + +} + + + } + if(logging.member_events.name_change == "true"){ + + if (oldMember.nickname != newMember.nickname) { +let colorYellow = logging.member_events.color; +if(colorYellow == "#000000") colorYellow = oldMember.client.color.yellow; + + +const oldNickname = oldMember.nickname || '`None`'; +const newNickname = newMember.nickname || '`None`'; + +const nicknameEmbed = new discord.MessageEmbed() + .setAuthor(`${newMember.user.tag} | Nickname Update`, newMember.user.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setFooter(`ID: ${newMember.id}`) + .setColor(colorYellow) + .setDescription(`**Nickname Update**\n ${newMember}'s **nickname** was changed.`) + .addField('Nickname', `${oldNickname} --> ${newNickname}`); + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newMember.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(nicknameEmbed).catch(()=>{}); + cooldown.add(newMember.guild.id) + setTimeout(()=>{ + cooldown.delete(newMember.guild.id) + }, 3000) + } + + } + } + + + + } + } + } + + + + + + + + + //last 5 nicknames + if (oldMember.nickname != newMember.nickname) { + +if(newMember.nickname == null || newMember.nickname == newMember.user.username) { + +} else { + +const user = await Nickname.findOne({ +discordId: newMember.id, +guildId: oldMember.guild.id +}) + + +if(!user){ + + const newUser = new Nickname({ + discordId: newMember.id, + guildId: oldMember.guild.id + }) + newUser.nicknames.push(newMember.nickname) + newUser.save() + + +} else { + + if(user.nicknames.length > 4){ + + user.nicknames.splice(-5,1); + user.nicknames.push(newMember.nickname) + + } else { + + user.nicknames.push(newMember.nickname) + + } + + user.save().catch(()=>{}) + +} + + } + } + + + + } +}; \ No newline at end of file diff --git a/events/members/userMissingPermissions.js b/events/members/userMissingPermissions.js new file mode 100644 index 00000000..a419e3c4 --- /dev/null +++ b/events/members/userMissingPermissions.js @@ -0,0 +1,21 @@ +const Event = require('../../structures/Event'); +const { MessageEmbed } = require('discord.js'); +module.exports = class extends Event { + + async run(permissions, message) { + if (!message) return; + const embed = new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`X Missing User Permissions`) + .setDescription(`Required Permission: \`${permissions.replace('_', ' ')}\``) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor); + if(message.channel && + message.channel.viewable && + message.channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + message.channel.send(embed).catch(()=>{}) + } + + } +}; \ No newline at end of file diff --git a/events/members/userUpdate.js b/events/members/userUpdate.js new file mode 100644 index 00000000..cab8b32e --- /dev/null +++ b/events/members/userUpdate.js @@ -0,0 +1,61 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Username = require('../../database/schemas/usernames'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + async run(oldUser, newUser) { + + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + + if (oldUser.username != newUser.username || oldUser.discriminator != newUser.discriminator) { + + let user = await Username.findOne({ +discordId: newUser.id, +}) + + +if(!user){ + + const newUser1 = new Username({ + discordId: newUser.id, + }) + newUser1.usernames.push(newUser.tag) + newUser1.save() + + user = await Username.findOne({ +discordId: newUser.id, +}) + + +} else { + + if(user.usernames.length > 4){ + + user.usernames.splice(-5,1); + user.usernames.push(newUser.tag) + + } else { + + user.usernames.push(newUser.tag) + + } + + user.save().catch(()=>{}) + +} + + + } + + + + } +}; \ No newline at end of file diff --git a/events/message/message.js b/events/message/message.js new file mode 100644 index 00000000..27531c6c --- /dev/null +++ b/events/message/message.js @@ -0,0 +1,416 @@ +const Event = require('../../structures/Event'); +const { Permissions, Collection } = require("discord.js"); +const afk = require("../../models/afk"); +const Statcord = require("statcord.js"); +const moment = require('moment'); +const discord = require("discord.js"); +const config = require('./../../config.json'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const nsfwplease = require('../../assets/json/nfsw.json'); +const mongoose = require('mongoose'); +const Guild = require('../../database/schemas/Guild'); +const User = require('../../database/schemas/User'); +const Blacklist = require('../../database/schemas/blacklist'); +const customCommand = require('../../database/schemas/customCommand'); +const autoResponse = require('../../database/schemas/autoResponse'); +const autoResponseCooldown = new Set(); +const inviteFilter = require('../../filters/inviteFilter'); +const linkFilter = require('../../filters/linkFilter'); +const maintenanceCooldown = new Set(); +const metrics = require('datadog-metrics'); +const permissions = require('../../assets/json/permissions.json') +const Maintenance = require('../../database/schemas/maintenance') +require("moment-duration-format"); + +module.exports = class extends Event { + constructor(...args) { + super(...args); + + this.impliedPermissions = new Permissions([ + "VIEW_CHANNEL", + "SEND_MESSAGES", + "SEND_TTS_MESSAGES", + "EMBED_LINKS", + "ATTACH_FILES", + "READ_MESSAGE_HISTORY", + "MENTION_EVERYONE", + "USE_EXTERNAL_EMOJIS", + "ADD_REACTIONS" + ]); + + this.ratelimits = new Collection(); + } + + async run(message) { + try { + + if (!message.guild) return; + + metrics.init({ apiKey: this.client.config.datadogApiKey, host: 'pogy', prefix: 'pogy.' }); + + const mentionRegex = RegExp(`^<@!?${this.client.user.id}>$`); + const mentionRegexPrefix = RegExp(`^<@!?${this.client.user.id}>`); + + if (!message.guild || message.author.bot) return; + + const settings = await Guild.findOne({ + guildId: message.guild.id, + }, async (err, guild) => { + if (err) console.log(err) + + if (!guild) { + const newGuild = await Guild.create({ + guildId: message.guild.id, + prefix: 'p!', + language: "english" + }); + } + }); + + //if (!settings) return message.channel.send('Oops, this server was not found in the database. Please try to run the command again now!'); + + if (message.content.match(mentionRegex)) { + const proofita = `\`\`\`css\n[ Prefix: ${settings.prefix || '!'} ]\`\`\``; + const proofitaa = `\`\`\`css\n[ Help: ${settings.prefix || '!'}help ]\`\`\``; + const embed = new MessageEmbed() + .setTitle('Hello, I\'m Pogy. What\'s Up?') + .addField(`Prefix`,proofita, true) + .addField(`Usage`,proofitaa, true) + .setDescription(`\nIf you like Pogy, Consider [voting](https://top.gg/bot/767705905235099658), or [inviting](https://discord.com/oauth2/authorize?client_id=767705905235099658&scope=bot&permissions=470150262) it to your server! Thank you for using Pogy, we hope you enjoy it, as we always look forward to improve the bot`) + .setFooter('Thank you for using Pogy!!') + .setColor('#FF2C98') + message.channel.send(embed); + } + + // Add increment after every fucking message lmfao! + metrics.increment('messages_seen'); + + // Filters + if (settings && await inviteFilter(message)) return; + if (settings && await linkFilter(message)) return; + + let mainPrefix = settings ? settings.prefix : '!'; + + const prefix = message.content.match(mentionRegexPrefix) ? + message.content.match(mentionRegexPrefix)[0] : mainPrefix + + + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + +// maintenance mode + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + + + + + const userBlacklistSettings = await Blacklist.findOne({ discordId: message.author.id,}); + const guildBlacklistSettings = await Blacklist.findOne({ guildId: message.guild.id }); + //autoResponse + + + const autoResponseSettings = await autoResponse.findOne({ guildId: message.guild.id, name: message.content.toLowerCase() }); + + + if (autoResponseSettings && autoResponseSettings.name) { + + if (userBlacklistSettings && userBlacklistSettings.isBlacklisted) return; + if(maintenance && maintenance.toggle == "true") return; + if(autoResponseCooldown.has(message.author.id)) return message.channel.send(`${message.client.emoji.fail} Slow Down - ${message.author}`) + + message.channel.send(autoResponseSettings.content + + .replace(/{user}/g, `${message.author}`) + + .replace(/{user_tag}/g, `${message.author.tag}`) + .replace(/{user_name}/g, `${message.author.username}`) + .replace(/{user_ID}/g, `${message.author.id}`) + .replace(/{guild_name}/g, `${message.guild.name}`) + .replace(/{guild_ID}/g, `${message.guild.id}`) + .replace(/{memberCount}/g, `${message.guild.memberCount}`) + .replace(/{size}/g, `${message.guild.memberCount}`) + .replace(/{guild}/g, `${message.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(message.author.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(message.author.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`)) + + + autoResponseCooldown.add(message.author.id) + setTimeout(()=>{ + autoResponseCooldown.delete(message.author.id) + }, 2000) + + + return; + } + + + //afk + let language = require(`../../data/language/english.json`) + if(guildDB) language = require(`../../data/language/${guildDB.language}.json`) + + + moment.suppressDeprecationWarnings = true; + + if(message.mentions.members.first()){ + if(maintenance && maintenance.toggle == "true") return; + const afklist = await afk.findOne({ userID: message.mentions.members.first().id, serverID: message.guild.id}); + if(afklist){ + + await message.guild.members.fetch(afklist.userID).then(member => { + let user_tag = member.user.tag; + return message.channel.send(`**${afklist.oldNickname || user_tag || member.user.username}** ${language.afk6} ${afklist.reason} **- ${moment(afklist.time).fromNow()}**`).catch(() => {}); + }); + } + } + + + const afklis = await afk.findOne({ userID: message.author.id, serverID: message.guild.id}); + + + if(afklis) { + if(maintenance && maintenance.toggle == "true") return; + let nickname = `${afklis.oldNickname}`; + message.member.setNickname(nickname).catch(() => {}); + await afk.deleteOne({ userID: message.author.id }); + return message.channel.send(new discord.MessageEmbed().setColor('GREEN').setDescription(`${language.afk7} ${afklis.reason}`)).then(m => { + setTimeout(() => { + m.delete().catch(() => {}); + }, 10000); + }); + + }; + + if (!message.content.startsWith(prefix)) return; + + // eslint-disable-next-line no-unused-vars + const [cmd, ...args] = message.content.slice(prefix.length).trim().split(/ +/g); + const command = this.client.commands.get(cmd.toLowerCase()) || this.client.commands.get(this.client.aliases.get(cmd.toLowerCase())); + + + +// maintenance mode + +if(!this.client.config.developers.includes(message.author.id)){ + +if(maintenance && maintenance.toggle == "true") { + +if(maintenanceCooldown.has(message.author.id)) return; + +message.channel.send(`Pogy is currently undergoing maintenance which won't allow anyone to access Pogy's Commands. Feel free to try again later. For updates: https://discord.gg/FqdH4sfKBg`) + +maintenanceCooldown.add(message.author.id); +setTimeout(() => { +maintenanceCooldown.delete(message.author.id) +}, 10000); + + return; +} +} + + + + // Custom Commands + const customCommandSettings = await customCommand.findOne({ guildId: message.guild.id, name: cmd.toLowerCase() }); + + const customCommandEmbed = await customCommand.findOne({ guildId: message.guild.id, name: cmd.toLowerCase() }); + + if (customCommandSettings && customCommandSettings.name && customCommandSettings.description) { + + if (userBlacklistSettings && userBlacklistSettings.isBlacklisted) return; + + +let embed = new MessageEmbed() + .setTitle(customCommandEmbed.title) + .setDescription(customCommandEmbed.description) + .setFooter(``) + +if( customCommandEmbed.image !== "none") embed.setImage(customCommandEmbed.image) +if( customCommandEmbed.thumbnail !== "none") embed.setThumbnail(customCommandEmbed.thumbnail) + +if( customCommandEmbed.footer !== "none") embed.setFooter(customCommandEmbed.footer) +if( customCommandEmbed.timestamp !== "no") embed.setTimestamp() +if( customCommandEmbed.color == 'default') { + +embed.setColor(message.guild.me.displayHexColor) + + } else embed.setColor(`${customCommandEmbed.color}`) + +return message.channel.send(embed) + } + + + if (customCommandSettings && customCommandSettings.name && !customCommandSettings.description && customCommandSettings.json == "false") { + if (userBlacklistSettings && userBlacklistSettings.isBlacklisted) return; + return message.channel.send(customCommandSettings.content + + + .replace(/{user}/g, `${message.author}`) + + .replace(/{user_tag}/g, `${message.author.tag}`) + .replace(/{user_name}/g, `${message.author.username}`) + .replace(/{user_ID}/g, `${message.author.id}`) + .replace(/{guild_name}/g, `${message.guild.name}`) + .replace(/{guild_ID}/g, `${message.guild.id}`) + .replace(/{memberCount}/g, `${message.guild.memberCount}`) + .replace(/{size}/g, `${message.guild.memberCount}`) + .replace(/{guild}/g, `${message.guild.name}`) + .replace(/{member_createdAtAgo}/g, `${moment(message.author.createdTimestamp).fromNow()}`) + .replace(/{member_createdAt}/g, `${moment(message.author.createdAt).format('MMMM Do YYYY, h:mm:ss a')}`) + + ) + } + + + if (customCommandSettings && customCommandSettings.name && !customCommandSettings.description && customCommandSettings.json == "true") { + if (userBlacklistSettings && userBlacklistSettings.isBlacklisted) return; + const command = JSON.parse(customCommandSettings.content) + return message.channel.send(command).catch((e)=>{message.channel.send(`There was a problem sending your embed, which is probably a JSON error.\nRead more here --> https://pogy.xyz/embeds\n\n__Error:__\n\`${e}\``)}) + } + + if (command) { + await User.findOne({ + discordId: message.author.id + }, (err, user) => { + if (err) console.log(err) + + if (!user) { + const newUser = new User({ + discordId: message.author.id + }) + + newUser.save() + } + }); + + + + const disabledCommands = guildDB.disabledCommands; + if (typeof(disabledCommands) === 'string') disabledCommands = disabledCommands.split(' '); + + + const rateLimit = this.ratelimit(message, cmd); + + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + + // Check if user is Blacklisted + if (userBlacklistSettings && userBlacklistSettings.isBlacklisted) { + logger.warn(`${message.author.tag} tried to use "${cmd}" command but the user is blacklisted`, { label: 'Commands' }) + return message.channel.send(`${message.client.emoji.fail} You are blacklisted from the bot :(`); + } + + // Check if server is Blacklisted + if (guildBlacklistSettings && guildBlacklistSettings.isBlacklisted) { + logger.warn(`${message.author.tag} tried to use "${cmd}" command but the guild is blacklisted`, { label: 'Commands' }) + return message.channel.send(`${message.client.emoji.fail} This guild is Blacklisted :(`); + } + + let number = Math.floor((Math.random() * 10) + 1); + if (typeof rateLimit === "string") return message.channel.send(` ${message.client.emoji.fail} Please wait **${rateLimit}** before running the **${cmd}** command again - ${message.author}\n\n${number === 1 ? "*Did You know that Pogy has its own dashboard? `https://pogy.xyz/dashboard`*" : ""}${number === 2 ? "*You can check our top.gg page at `https://vote.pogy.xyz`*" : ""}`).then((s)=>{ + message.delete().catch(()=>{}); + s.delete({timeout: 4000}).catch(()=>{}) + }).catch(()=>{}) + + + if (command.botPermission) { + + const missingPermissions = + message.channel.permissionsFor(message.guild.me).missing(command.botPermission).map(p => permissions[p]); + + if (missingPermissions.length !== 0) { + const embed = new MessageEmbed() + .setAuthor(`${this.client.user.tag}`, message.client.user.displayAvatarURL({ dynamic: true })) + .setTitle(`<:wrong:822376943763980348> Missing Bot Permissions`) + .setDescription(`Command Name: **${command.name}**\nRequired Permission: **${missingPermissions.map(p => `${p}`).join(' - ')}**`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor); + return message.channel.send(embed).catch(()=>{}) + } + } + + + + + + if (command.userPermission) { + const missingPermissions = + message.channel.permissionsFor(message.author).missing(command.userPermission).map(p => permissions[p]); + if (missingPermissions.length !== 0) { + const embed = new MessageEmbed() + .setAuthor(`${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true })) + .setTitle(`<:wrong:822376943763980348> Missing User Permissions`) + .setDescription(`Command Name: **${command.name}**\nRequired Permission: **${missingPermissions.map(p => `${p}`).join('\n')}**`) + .setTimestamp() + .setFooter('https://pogy.xyz') + .setColor(message.guild.me.displayHexColor); + return message.channel.send(embed).catch(()=>{}) + } + + } + if(disabledCommands.includes(command.name || command)) return; + + + if (command.ownerOnly) { + if (!this.client.config.developers.includes(message.author.id)) return + } + + metrics.increment('commands_served'); + + if (command.disabled) return message.channel.send(`The owner has disabled the following command for now. Try again Later!\n\nFor Updates: https://discord.gg/FqdH4sfKBg`) + if (command.nsfwOnly && !message.channel.nsfw && message.guild) return message.channel.send(`${nsfwplease[Math.round(Math.random() * (nsfwplease.length - 1))]}`) + + Statcord.ShardingClient.postCommand(cmd, message.author.id, this.client); + + await this.runCommand(message, cmd, args) + + .catch(error => { + metrics.increment('command_error'); + return this.client.emit("commandError", error, message, cmd); + }) + } + } catch(error) { + metrics.increment('command_error'); + return this.client.emit("fatalError", error, message); + } + } + + async runCommand(message, cmd, args) { + + if (!message.channel.permissionsFor(message.guild.me) || !message.channel.permissionsFor(message.guild.me).has('EMBED_LINKS')) + return message.channel.send(`${message.client.emoji.fail} Missing bot Permissions - **Embeds Links**`) + + const command = this.client.commands.get(cmd.toLowerCase()) || this.client.commands.get(this.client.aliases.get(cmd.toLowerCase())); + logger.info(`"${message.content}" (${command.name}) ran by "${message.author.tag}" (${message.author.id}) on guild "${message.guild.name}" (${message.guild.id}) channel "#${message.channel.name}" (${message.channel.id})`, { label: 'Command' }) + + await command.run(message, args) + } + + ratelimit(message, cmd) { + try { + const command = this.client.commands.get(cmd.toLowerCase()) || this.client.commands.get(this.client.aliases.get(cmd.toLowerCase())); + if (message.author.permLevel > 4) return false; + + const cooldown = command.cooldown * 1000 + const ratelimits = this.ratelimits.get(message.author.id) || {}; // get the ENMAP first. + if (!ratelimits[command.name]) ratelimits[command.name] = Date.now() - cooldown; // see if the command has been run before if not, add the ratelimit + const difference = Date.now() - ratelimits[command.name]; // easier to see the difference + if (difference < cooldown) { // check the if the duration the command was run, is more than the cooldown + return moment.duration(cooldown - difference).format("D [days], H [hours], m [minutes], s [seconds]", 1); // returns a string to send to a channel + } else { + ratelimits[command.name] = Date.now(); // set the key to now, to mark the start of the cooldown + this.ratelimits.set(message.author.id, ratelimits); // set it + return true; + } + } catch(e) { + this.client.emit("fatalError", error, message); + } + } +} \ No newline at end of file diff --git a/events/message/messageDelete.js b/events/message/messageDelete.js new file mode 100644 index 00000000..b7146c2d --- /dev/null +++ b/events/message/messageDelete.js @@ -0,0 +1,184 @@ +const Event = require('../../structures/Event'); +const discord = require("discord.js"); +const config = require('./../../config.json'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const mongoose = require('mongoose'); +const Guild = require('../../database/schemas/Guild'); +const User = require('../../database/schemas/User'); +const metrics = require('datadog-metrics'); +require("moment-duration-format"); +const Db = require("../../packages/reactionrole/models/schema.js"); +const reactionTicket = require("../../models/tickets.js"); +const Logging = require('../../database/schemas/logging'); +const Snipe = require('../../database/schemas/snipe'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + + + async run(message) { + +if (!message.guild) return; + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + + +let snipe = await Snipe.findOne({ guildId: message.guild.id, channel: message.channel.id}) + + +const logging = await Logging.findOne({ guildId: message.guild.id }); + if(message && message.author && !message.author.bot){ +if(!snipe){ + + const snipeSave = new Snipe({ + guildId: message.guild.id, + channel: message.channel.id + }) + + snipeSave.message.push(message.content || null) + snipeSave.tag.push(message.author.id) + snipeSave.image.push(message.attachments.first() ? message.attachments.first().proxyURL : null) + + snipeSave.save().catch(()=>{}) + + snipe = await Snipe.findOne({ guildId: message.guild.id, channel: message.channel.id}) + + +} else { + + if(snipe.message.length > 4){ + + snipe.message.splice(-5,1); + snipe.tag.splice(-5,1); + snipe.image.splice(-5,1); + + snipe.message.push(message.content || null) + snipe.tag.push(message.author.id) + snipe.image.push(message.attachments.first() ? message.attachments.first().proxyURL : null) + + } else { + + snipe.message.push(message.content || null) + snipe.tag.push(message.author.id) + snipe.image.push(message.attachments.first() ? message.attachments.first().proxyURL : null) + + } + + snipe.save().catch(()=>{}) + +} + } + if (message.webhookID || (!message.content && message.embeds.length === 0)) return; + +let reactionDatabase = await Db.findOne({ + + guildid: message.guild.id, + msgid: message.id, + + }) + +let ticketDatabase = await reactionTicket.findOne({ + guildID: message.guild.id, + messageID: message.id +}) + + + +if(reactionDatabase){ + +const conditional = { + guildid: message.guild.id, + msgid: message.id, +} +const results = await Db.find(conditional) + +if (results && results.length) { + for (const result of results) { + const { guildid } = result + + try { + await Db.deleteOne(conditional) + } catch (e) { + console.log(e) + } + + } + +} + +} + +if(ticketDatabase){ + +await ticketDatabase.deleteOne().catch(()=>{}) + +} + +if(logging){ + if(logging.message_events.toggle == "true"){ + +if(logging.message_events.ignore == "true"){ + if(message.author.bot) return; +} + +const channelEmbed = await message.guild.channels.cache.get(logging.message_events.channel) + +if(channelEmbed){ + +let color = logging.message_events.color; +if(color == "#000000") color = message.client.color.red; + + + if(logging.message_events.deleted == "true"){ + + + const embed = new MessageEmbed() + .setAuthor(`${message.author.tag} | Message Deleted`, message.author.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setFooter(`ID: ${message.id}`) + .setColor(message.guild.me.displayHexColor); + + +if (message.content) { + + + + if (message.content.length > 1024) message.content = message.content.slice(0, 1021) + '...'; + + embed + .setDescription(`${message.member}'s message got deleted in ${message.channel}`) + .addField('Message', message.content); + + + + + } else { + + embed + .setDescription(`${message.member} deleted an **embed** in ${message.channel}`); + + + } + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + } + + + } + } +} + + + + + +} +} \ No newline at end of file diff --git a/events/message/messageDeleteBulk.js b/events/message/messageDeleteBulk.js new file mode 100644 index 00000000..d2a4c0c7 --- /dev/null +++ b/events/message/messageDeleteBulk.js @@ -0,0 +1,70 @@ +const Event = require('../../structures/Event'); +const discord = require("discord.js"); +const config = require('./../../config.json'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const mongoose = require('mongoose'); +const Guild = require('../../database/schemas/Guild'); +const User = require('../../database/schemas/User'); +const metrics = require('datadog-metrics'); +require("moment-duration-format"); +const Db = require("../../packages/reactionrole/models/schema.js"); +const reactionTicket = require("../../models/tickets.js"); +const Logging = require('../../database/schemas/logging'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + + + async run(messages) { + +const message = messages.first(); + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const logging = await Logging.findOne({ guildId: message.guild.id }); + +if(logging){ + if(logging.message_events.toggle == "true"){ + + +const channelEmbed = await message.guild.channels.cache.get(logging.message_events.channel) + +if(channelEmbed){ + +let color = logging.message_events.color; +if(color == "#000000") color = this.client.color.red; + + + if(logging.message_events.deleted == "true"){ + + + const embed = new MessageEmbed() + .setAuthor(`Messages Cleared`, message.guild.iconURL({ dynamic: true })) + .setTimestamp() + .setDescription(`**${messages.size} messages** in ${message.channel} were deleted.`) + .setColor(message.guild.me.displayHexColor) + .setFooter(`${messages.size} Messages`); + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + } + + + } + } +} + + + + + +} +} \ No newline at end of file diff --git a/events/message/messageUpdate.js b/events/message/messageUpdate.js new file mode 100644 index 00000000..dc0030e2 --- /dev/null +++ b/events/message/messageUpdate.js @@ -0,0 +1,160 @@ +const Event = require('../../structures/Event'); +const discord = require("discord.js"); +const config = require('./../../config.json'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const mongoose = require('mongoose'); +const Guild = require('../../database/schemas/Guild'); +const User = require('../../database/schemas/User'); +const metrics = require('datadog-metrics'); +require("moment-duration-format"); +const Db = require("../../packages/reactionrole/models/schema.js"); +const reactionTicket = require("../../models/tickets.js"); +const Logging = require('../../database/schemas/logging'); +const Snipe = require('../../database/schemas/editsnipe'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + + + async run(oldMessage, newMessage) { + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + + if (newMessage.webhookID) return; + + +if (newMessage.member && + newMessage.id === newMessage.member.lastMessageID && + !oldMessage.command + ) { + newMessage.client.emit('message', newMessage); + }; + +if(!oldMessage || !newMessage) return; + + +if(!oldMessage.content) return; +if(!newMessage.content) return; + + +if(oldMessage.content.length === null || newMessage.content.length === null) return; +if(newMessage === null) return; +if(oldMessage === null) return; + +let snipe = await Snipe.findOne({ guildId: newMessage.guild.id, channel: newMessage.channel.id}) +const logging = await Logging.findOne({ guildId: newMessage.guild.id }); + +if(newMessage.author && !newMessage.author.bot){ +if (oldMessage.content != newMessage.content) { +if(!snipe){ + + const snipeSave = new Snipe({ + guildId: newMessage.guild.id, + channel: newMessage.channel.id + }) + + snipeSave.oldmessage.push(oldMessage.content || null) + snipeSave.newmessage.push(newMessage.content || null) + snipeSave.url.push(newMessage.url || null) + snipeSave.id.push(newMessage.author.id) + + + snipeSave.save().catch(()=>{}) + + snipe = await Snipe.findOne({ guildId: newMessage.guild.id, channel: newMessage.channel.id}) + + +} else { + + if(snipe.oldmessage.length > 4){ + + snipe.oldmessage.splice(-5,1); + snipe.newmessage.splice(-5,1); + snipe.id.splice(-5,1); + snipe.url.splice(-5,1); + + snipe.oldmessage.push(oldMessage.content || null) + snipe.newmessage.push(newMessage.content || null) + snipe.url.push(newMessage.url || null) + snipe.id.push(newMessage.author.id) + + } else { + + snipe.oldmessage.push(oldMessage.content || null) + snipe.newmessage.push(newMessage.content || null) + snipe.url.push(newMessage.url || null) + snipe.id.push(newMessage.author.id) + + } + + snipe.save().catch(()=>{}) + +} + } + } + +if(logging){ + if(logging.message_events.toggle == "true"){ + +if(logging.message_events.ignore == "true"){ + if(newMessage.author.bot) return; +} + +const channelEmbed = await newMessage.guild.channels.cache.get(logging.message_events.channel) + +if(channelEmbed){ + +let color = logging.message_events.color; +if(color == "#000000") color = newMessage.client.color.yellow; + + + if(logging.message_events.deleted == "true"){ + +if(oldMessage.content && newMessage.content){ + if(oldMessage.content.length && newMessage.content.length){ + if (oldMessage.content != newMessage.content) { + + +if (newMessage.content.length > 1024) newMessage.content = newMessage.content.slice(0, 1021) + '...'; +if (oldMessage.content.length > 1024) oldMessage.content = oldMessage.content.slice(0, 1021) + '...'; + + + + + const embed = new MessageEmbed() + .setAuthor(`${newMessage.member.user.tag} | Message Edited`, newMessage.member.user.displayAvatarURL({ dynamic: true })) + .setTimestamp() + .setDescription(` + ${newMessage.member} edited a message in ${newMessage.channel}\n\n[Jump to message!](${newMessage.url}) + `) +.addField('Before', oldMessage.content) + .addField('After', newMessage.content) + .setFooter(`Member ID: ${newMessage.member.id}`) + .setColor(newMessage.guild.me.displayHexColor); + + + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newMessage.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + } + + + } +} + } +} + + +} +} + +} +} \ No newline at end of file diff --git a/events/rateLimit.js b/events/rateLimit.js new file mode 100644 index 00000000..40495577 --- /dev/null +++ b/events/rateLimit.js @@ -0,0 +1,25 @@ +const muteModel = require('../models/mute'); +const Event = require('../structures/Event'); +const logger = require('../utils/logger'); +const Maintenance = require('../database/schemas/maintenance') +const MessageEmbed = require('discord.js'); +const Discord = require('discord.js') +const webhookClient = new Discord.WebhookClient('', ''); + +module.exports = class extends Event { + async run(rl) { + + const embed = new Discord.MessageEmbed() + .setColor('RED') + .setDescription(`**Time out**\n\`${rl.timeout}ms\`\n**Limit:**\n\`${rl.limit}\`\n\n__**Information**__\n**Method:**${rl.method}\n\n**Path:**\n${rl.path} ${rl.route}`) + .setTimestamp() + + await setTimeout(function () { + webhookClient.send(embed) + logger.info(`Time out: ${rl.timeout}ms. Limit: ${rl.limit}`, {label: 'Rate Limit'}); + + }, rl.timeout + 10); + + + } +} \ No newline at end of file diff --git a/events/reactions/messageReactionAdd.js b/events/reactions/messageReactionAdd.js new file mode 100644 index 00000000..647b9a3f --- /dev/null +++ b/events/reactions/messageReactionAdd.js @@ -0,0 +1,422 @@ +const Event = require('../../structures/Event');////("discord.js") +const { MessageReaction, User, MessageEmbed } = require("discord.js"); +const Db = require("../../packages/reactionrole/models/schema.js") +const reactionTicket = require("../../models/tickets.js") +const reactionCooldown = new Set(); +const optionAdd = new Set(); +const discord = require("discord.js"); +const Discord = require("discord.js"); +const moment = require('moment') +const send = require(`../../packages/logs/index.js`) +const GuildDB = require('../../database/schemas/Guild'); +const Maintenance = require('../../database/schemas/maintenance'); +const ticketCooldownLol = new Set(); +const botCooldown = new Set(); + +/** + * + * @param {MessageReaction} reaction + * @param {User} user + */ + +module.exports = class extends Event { + async run(messageReaction, user) { + + if (this.client.user === user) return; + +const { message, emoji } = messageReaction; + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const member = message.guild.members.cache.get(user.id); + + +const guildDB = await GuildDB.findOne({ + guildId: message.guild.id +}) + +let prefix = guildDB.prefix +await Db.findOne({ + guildid: message.guild.id, + reaction: emoji.toString(), + msgid: message.id, + }, + + async (err, db) => { + + if(!db) return; + + + if(message.id != db.msgid) return; + + const rrRole = message.guild.roles.cache.get(db.roleid); + + if (!rrRole) return; + +if(botCooldown.has(message.guild.id)) return; + +let guild = this.client.guilds.cache.get(db.guildid); +let guildName = guild.name; + +let slowDownEmbed = new MessageEmbed() +.setDescription(`${message.client.emoji.fail} Slow Down There, You're on a cooldown\n\n**Role Name:** ${rrRole.name}\n**Guild Name:** ${guildName}`) +.setColor(message.client.color.red) + +let addEmbed = new MessageEmbed() +.setAuthor('Role Added', `${message.client.domain}/logo.png` , `${message.url}` ) +.setDescription(`You have recieved the **${rrRole.name}** Role by reacting in ${guildName}`) +.setFooter(`https://pogy.xyz`) +.setColor(message.client.color.green) + +let remEmbed = new MessageEmbed() +.setAuthor('Role Removed', `${message.client.domain}/logo.png` , `${message.url}` ) +.setDescription(`You have removed the **${rrRole.name}** Role by reacting in ${guildName}`) +.setFooter(`https://pogy.xyz`) +.setColor(message.client.color.green) + +let errorReaction = new MessageEmbed() +.setAuthor('Reaction Role Error', `${message.client.domain}/logo.png` , `${message.url}` ) +.setDescription(`${message.client.emoji.fail} Failed to Add the role, since I'm Missing the Manage Roles Permission.\n\nPlease let an admin Know.`) +.setFooter(`https://pogy.xyz`) +.setColor(message.client.color.green) + +if(reactionCooldown.has(user.id)) { + if(message.channel && + message.channel.viewable && + message.channel.permissionsFor(message.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + + + user.send(slowDownEmbed).catch(()=>{}); + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 4000) + } + +} + +if(db.option === 1) { + try { + if(!member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + + + + await member.roles.add(rrRole).catch(()=>{}) + if(guildDB.reactionDM === true){ + member.send(addEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { +console.log(err) + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + +if(db.option === 2) { + try { + if (!member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())) { + await member.roles.add(rrRole).catch(()=>{}) + if(guildDB.reactionDM === true){ + member.send(addEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(() => { + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + if(db.option === 3) { + try { + if (member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + await member.roles.remove(rrRole).catch(()=>{}) + if(guildDB.reactionDM === true){ + member.send(remEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(() => { + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + if(db.option === 4) { + try { + if (member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + await member.roles.remove(rrRole).catch(()=>{}) + reactionCooldown.add(user.id); + if(guildDB.reactionDM === true){ + member.send(remEmbed).catch(()=>{}) + } + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + if(db.option === 5) { + try { + if (member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + await member.roles.remove(rrRole); + message.reactions.cache.find(r => r.emoji.name == emoji.name).users.remove(user.id).catch(()=>{}) + + if(guildDB.reactionDM === true){ + member.send(remEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(() => { + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + + if(db.option === 6) { + try { + + + + if (member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + + message.reactions.cache.find(r => r.emoji.name == emoji.name).users.remove(user.id).catch(()=>{}) + await member.roles.remove(rrRole).catch(()=>{}) + + reactionCooldown.add(user.id); + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 5000); + + return; + + } else if (!member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())) { + + message.reactions.cache.find(r => r.emoji.name == emoji.name).users.remove(user.id).catch(()=>{}) + await member.roles.add(rrRole).catch(()=>{}) + + if(guildDB.reactionDM === true){ + member.send(addEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 5000); + } + + } catch (err) { + + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + + }); + + + //ticket stuff + await reactionTicket.findOne({ + guildID: message.guild.id, + }, async(err, db) => { + + + if(!db) return; + + if(db.ticketType == "reaction"){ + + if(db.messageID.includes(message.id)) { + + + if(emoji.toString() === "🎫" || emoji.toString() === "🎟️" || emoji.toString() === "📩" ||emoji.toString() === "✅" ||emoji.toString() === "📻" ||emoji.toString() === "☑️" ||emoji.toString() === "📲" ||emoji.toString() === "📟" ||emoji.toString() === "🆕" ||emoji.toString() === "📤" ||emoji.toString() === "📨" ||emoji.toString() === "🔑"||emoji.toString() === "🏷️") { + + +if(guildDB.isPremium == "false"){ + if(emoji.toString() === "🎟️" ||emoji.toString() === "✅" ||emoji.toString() === "📻" ||emoji.toString() === "☑️" ||emoji.toString() === "📲" ||emoji.toString() === "📟" ||emoji.toString() === "🆕" ||emoji.toString() === "📤" ||emoji.toString() === "📨" ||emoji.toString() === "🔑"||emoji.toString() === "🏷️") return; +} + let serverCase = db.ticketCase; +if(!serverCase || serverCase === null) serverCase = '1'; + + let channelReact = message.guild.channels.cache.get(db.ticketReactChannel) + let ticketRole = message.guild.roles.cache.get(db.supportRoleID); + let ticketCategory = message.guild.channels.cache.get(db.categoryID) + let ticketLog = message.guild.channels.cache.get(db.ticketModlogID) + + message.reactions.cache.find(r => r.emoji.name == emoji.name).users.remove(user.id).catch(()=>{}) + + + let id = user.id.toString().substr(0, 4) + user.discriminator; + let chann = `ticket-${id}`; + + + let array = [] + + message.guild.channels.cache.forEach(channel => { + if(channel.name == chann) array.push(channel.id) + }) + + +let ticketlimit = db.maxTicket +if(!ticketlimit) ticketlimit = 1 + +let arraylength = array.length + + + if(arraylength > ticketlimit || arraylength == ticketlimit) { + + if(ticketCooldownLol.has(user.id)) return; + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + if (!message.channel.permissionsFor(message.guild.me).has('EMBED_LINKS')) return; + message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription(`You already have ${arraylength} open tickets, as the current guild's ticket limit is ${ticketlimit} `).setAuthor(user.tag, user.displayAvatarURL()).setFooter('https://pogy.xyz')).then(m => m.delete({timeout: 5000})); + ticketCooldownLol.add(user.id) + setTimeout(()=>{ + ticketCooldownLol.delete(user.id) + }, 10000) + + return + } + + +let pogy = message.guild.me; + +let everyone = message.guild.roles.everyone; + + + + message.guild.channels.create(chann, { type: "text" }) + .then(async (chan) => { + if(pogy) { + chan.updateOverwrite(pogy, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + + if(everyone) { + chan.updateOverwrite(everyone, { VIEW_CHANNEL: false }); + } + + chan.updateOverwrite(user, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + + if(ticketRole) { + chan.updateOverwrite(ticketRole, { VIEW_CHANNEL: true, READ_MESSAGES: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, ATTACH_FILES: true }); + } + + await db.updateOne({ticketCase: serverCase + 1}); + + + let color = db.ticketWelcomeColor + if(color == "#000000") color = message.guild.me.displayHexColor + + if(db.ticketPing == "true"){ + +if(chan){ + if (!chan.permissionsFor(chan.guild.me).has('SEND_MESSAGES')) return; + if (!chan.permissionsFor(chan.guild.me).has('EMBED_LINKS')) return; + + chan.send(`${member} ${ticketRole}`).catch(()=>{}) +} + } + + chan.send(new discord.MessageEmbed() + .setAuthor(user.tag, user.displayAvatarURL()) + + .setDescription(db.ticketWelcomeMessage + .replace(/{user}/g, `${member}`) + .replace(/{user_tag}/g, `${member.tag}`) + .replace(/{user_name}/g, `${member.username}`) + .replace(/{reason}/g, `${member.username}`) + .replace(/{user_ID}/g, `${member.id}`) || language.ticketNewTicketWaitForAssistant) + + .setColor(color) + ); + + /* chan.send(new MessageEmbed() + .setDescription(`Please use \`${prefix}close\` to close the ticket.`) + .setColor(message.client.color.red) + .setFooter('https://pogy.xyz') + .setTimestamp())*/ + + if(ticketCategory){ + chan.setParent(ticketCategory.id) + } + + chan.setTopic(`Ticket opened by ${user.tag} (${user.id})`).catch(() => {}) + +let color2 = db.ticketLogColor + if(color2 == "#000000") color2 = `#36393f`; + + const embedLog = new discord.MessageEmbed() + .setColor(color2) + .setFooter('https://pogy.xyz') + .setTitle("Ticket Created") + .setTimestamp() + .addField("Information" , `**User:** ${user}\n**Ticket Channel: **${chan.name}\n**Ticket:** #${serverCase}\n**Date:** ${moment(new Date()).format("dddd, MMMM Do YYYY")} `) + + + + if(ticketLog) { + + send(ticketLog, embedLog, { + name: `Ticket Logs`, + icon: `${message.client.domain}/logo.png` + }).catch(()=>{}) + + + } + + }).catch(() => { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + message.channel.send(new discord.MessageEmbed().setColor(message.client.color.red).setDescription("There was an error creating the ticket, please check my permissions or contact support.")).then(m => m.delete({timeout: 5000})).catch(() => {}) + }) + }; + } + } + }) + } +} diff --git a/events/reactions/messageReactionRemove.js b/events/reactions/messageReactionRemove.js new file mode 100644 index 00000000..70c9b975 --- /dev/null +++ b/events/reactions/messageReactionRemove.js @@ -0,0 +1,135 @@ +const Event = require('../../structures/Event'); +const { MessageReaction, User, MessageEmbed } = require("discord.js"); +const Db = require("../../packages/reactionrole/models/schema.js"); +const reactionCooldown = new Set(); +const GuildDB = require('../../database/schemas/Guild'); +const Maintenance = require('../../database/schemas/maintenance'); +const botCooldown = new Set(); +/** + * + * @param {MessageReaction} reaction + * @param {User} user + */ + +module.exports = class extends Event { + async run(messageReaction, user) { + + +const { message, emoji } = messageReaction; + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +const member = message.guild.members.cache.get(user.id); + +const guildDB = await GuildDB.findOne({ + guildId: message.guild.id +}) + +let prefix = guildDB.prefix + +await Db.findOne({ + guildid: message.guild.id, + reaction: emoji.toString(), + msgid: message.id, + }, + + async (err, db) => { + + if(!db) return; + + if(message.id != db.msgid) return; + + + let guild = this.client.guilds.cache.get(db.guildid); +let guildName = guild.name; + + const rrRole = message.guild.roles.cache.get(db.roleid); + if (!rrRole) return; + +let addEmbed = new MessageEmbed() +.setAuthor('Role Added', `${message.client.domain}/logo.png` , `${message.url}` ) +.setDescription(`You have recieved the **${rrRole.name}** Role by reacting in ${guildName}`) +.setFooter(`https://pogy.xyz`) +.setColor(message.client.color.green) + +let remEmbed = new MessageEmbed() +.setAuthor('Role Removed', `${message.client.domain}/logo.png` , `${message.url}` ) +.setDescription(`You have removed the **${rrRole.name}** Role by reacting in ${guildName}`) +.setFooter(`https://pogy.xyz`) +.setColor(message.client.color.green) + + + + +if(reactionCooldown.has(user.id)) return + +if(db.option === 1) { + try { + if (member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())) { + await member.roles.remove(rrRole).catch(()=>{}) + reactionCooldown.add(user.id); + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 2000); + + if(guildDB.reactionDM === true){ + if(botCooldown.has(message.guild.id)) return; + member.send(remEmbed).catch(()=>{}) + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 4000) + + + } + + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; + +if(botCooldown.has(message.guild.id)) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + if(db.option === 4) { + try { + if (!member.roles.cache.find(r => r.name.toLowerCase() === rrRole.name.toLowerCase())){ + await member.roles.add(rrRole).catch(()=>{}) + if(guildDB.reactionDM === true){ + member.send(addEmbed).catch(()=>{}) + } + reactionCooldown.add(user.id); + setTimeout(()=>{ + reactionCooldown.delete(user.id) + }, 2000); + } + } catch (err) { + if (!message.channel.permissionsFor(message.guild.me).has('SEND_MESSAGES')) return; +if(botCooldown.has(message.guild.id)) return; + botCooldown.add(message.guild.id) + setTimeout(()=>{ + botCooldown.delete(message.guild.id) + }, 6000) + return member.send(errorReaction).catch(()=>{}) + } + } + + + + } + ); +}; + + + } + diff --git a/events/ready.js b/events/ready.js new file mode 100644 index 00000000..7b793bd0 --- /dev/null +++ b/events/ready.js @@ -0,0 +1,50 @@ +const muteModel = require('../models/mute'); +const Event = require('../structures/Event'); +const logger = require('../utils/logger'); +const Maintenance = require('../database/schemas/maintenance') +module.exports = class extends Event { + async run() { + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true"){ + + + + this.client.user.setPresence({ status: 'dnd' }); + this.client.user.setActivity('Under Maintenance') + + + +logger.info(`✅ loaded Maintenance Mode `, { label: 'Status' }) +} else { + const activities = [ + { name: 'p!help | pogy.xyz', type: 'WATCHING' }, + { name: '@pogy', type: 'WATCHING' } + ]; + + + this.client.user.setPresence({ status: 'online', activity: activities[0] }); + + let activity = 1; + + + setInterval(() => { + activities[2] = { name: `p!help | ${ this.client.guilds.cache.size} guilds`, type: 'WATCHING' }; + activities[3] = { name: `p!help | ${ this.client.guilds.cache.reduce((a, g) => a + g.memberCount, 0)} users`, type: 'WATCHING' }; + if (activity > 3) activity = 0; + this.client.user.setActivity(activities[activity]); + activity++; + }, 35000); + + + logger.info(`✅ loaded: Bot Status `, { label: 'Status' }) + + + } +} + +} + diff --git a/events/roles/roleCreate.js b/events/roles/roleCreate.js new file mode 100644 index 00000000..85f5c9ea --- /dev/null +++ b/events/roles/roleCreate.js @@ -0,0 +1,61 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(role) { + +const logging = await Logging.findOne({ guildId: role.guild.id }) + +if(!role) return; +if(role.managed) return; + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await role.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = role.client.color.green + + + if(logging.server_events.role_create == "true"){ + + const embed = new discord.MessageEmbed() + .setDescription(`🆕 ***Role Created***`) + .addField('Role', role, true) + .addField('Role Name', role.name, true) + .setFooter(`Role ID: ${role.id}`) + .setTimestamp() + .setColor(color) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(role.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + } +}; \ No newline at end of file diff --git a/events/roles/roleDelete.js b/events/roles/roleDelete.js new file mode 100644 index 00000000..858fb443 --- /dev/null +++ b/events/roles/roleDelete.js @@ -0,0 +1,59 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(role) { +if(!role) return; +if(role.managed) return; +const logging = await Logging.findOne({ guildId: role.guild.id }) + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await role.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = role.client.color.red + + + if(logging.server_events.role_create == "true"){ + + const embed = new discord.MessageEmbed() + .setDescription(`🗑️ ***Role Deleted***`) + .addField('Role Name', role.name, true) + .setFooter(`Role ID: ${role.id}`) + .setTimestamp() + .setColor(color) + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(role.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + } +}; \ No newline at end of file diff --git a/events/roles/roleUpdate.js b/events/roles/roleUpdate.js new file mode 100644 index 00000000..8d1562d6 --- /dev/null +++ b/events/roles/roleUpdate.js @@ -0,0 +1,86 @@ +const Event = require('../../structures/Event'); +const logger = require('../../utils/logger'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const moment = require('moment'); +const Maintenance = require('../../database/schemas/maintenance') +module.exports = class extends Event { + +async run(oldRole, newRole) { +if(!newRole) return; +if(newRole.managed) return; +const logging = await Logging.findOne({ guildId: oldRole.guild.id }) + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + + +const channelEmbed = await newRole.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let color = logging.server_events.color; +if(color == "#000000") color = newRole.client.color.green + + + if(logging.server_events.role_update == "true"){ + + const embed = new discord.MessageEmbed() + .setDescription(`:pencil: ***Role Updated***`) + + .setFooter(`Role ID: ${newRole.id}`) + .setTimestamp() + .setColor(color) + + + +if(oldRole.name !== newRole.name) { + embed.addField('Name Update', `${oldRole.name} --> ${newRole.name}`, true) + + } else { + embed.addField('Name Update', `Name not updated`, true) + + } +function makehex(rgb) { + var hex = Number(rgb).toString(16); + if (hex.length < 2) { + hex = "0" + hex; + } + return hex; +}; + + if(oldRole.color !== newRole.color) { + embed.addField('Color Update', `#${makehex(oldRole.color)} --> #${makehex(newRole.color)}`, true) + + } + + if(oldRole.mentionable !== newRole.mentionable) { + embed.addField('mentionable', `${oldRole.mentionable} --> ${newRole.mentionable}`, true) + + } + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newRoler.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(embed).catch(()=>{}) + } + + + } + + + } + } +} + + + } +}; diff --git a/events/shard/shardDisconnect.js b/events/shard/shardDisconnect.js new file mode 100644 index 00000000..7fd3d2da --- /dev/null +++ b/events/shard/shardDisconnect.js @@ -0,0 +1,25 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const webhookClient = new Discord.WebhookClient('', ''); + +module.exports = class extends Event { + constructor(...args) { + super(...args) + } + + async run() { + logger.error(`Shard ${this.client.shard.ids - 1 + 2}/${this.client.shard.count} has disconnected`, { label: `Shard` }) + + + + const embed = new MessageEmbed() + .setColor('RED') + .setDescription(`Pogy: [${this.client.shard.ids - 1 + 2}/${this.client.shard.count}] Disconnected`) + .setTimestamp() + + webhookClient.send(embed) + + } +} \ No newline at end of file diff --git a/events/shard/shardReady.js b/events/shard/shardReady.js new file mode 100644 index 00000000..9e6882f9 --- /dev/null +++ b/events/shard/shardReady.js @@ -0,0 +1,385 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const config = require('./../../config.json'); +const logger = require('../../utils/logger'); +const ms = require("ms") +const muteModel = require('../../models/mute'); +const BlacklistModel = require('../../database/schemas/blacklist'); + +const Guild = require('../../database/schemas/Guild'); +const { WebhookClient, MessageEmbed } = require('discord.js'); +const webhookClient = new WebhookClient('', ''); +const Maintenance = require('../../database/schemas/maintenance') +const premiumrip = new WebhookClient('', ''); +const moment = require(`moment`) +const fetchAll = require('../../data/structures/fetchAll'); +const emojiArray = require('../../data/structures/optionArray'); +const pollModel = require('../../database/schemas/poll'); +const Logging = require('../../database/schemas/logging.js'); +module.exports = class extends Event { + constructor(...args) { + super(...args) + } + async run() { + + const shardGuildCounts = await this.client.shard.fetchClientValues('guilds.cache.size') + const totalGuildCount = shardGuildCounts.reduce((total, current) => total + current) + + console.log('-----------') + logger.info(`Shard ${this.client.shard.ids - 1 + 2}/${this.client.shard.count} is connected`, { label: 'Shard' }) + console.log('------------') + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + +if(maintenance && maintenance.toggle == "true") return; + +// MUTE INTERVAL +setInterval(async () => { + for (const guild of this.client.guilds.cache) { + const muteArray = await muteModel.find({ + guildID: guild[0], + }) + + for (const muteDoc of muteArray) { + + if (Date.now() >= Number(muteDoc.length)) { + + const guild = this.client.guilds.cache.get(muteDoc.guildID) + const member = guild ? guild.members.cache.get(muteDoc.memberID) : null + const muteRole = guild ? guild.roles.cache.find(r => r.name == 'Muted') : null + + if (member) { + await member.roles.remove(muteRole ? muteRole.id : '').catch(err => console.log(err)) + + //logging + + const logging = await Logging.findOne({ guildId: guild.id }) + if(logging){ + + let muteRole = await guild.roles.cache.get(logging.moderation.mute_role); + + + await member.roles.remove(muteRole.id, [`Mute Command | Duration Expired`]).catch(()=>{}) + + let delaynumber = 2000; + if(muteDoc.memberRoles.length > 10) delaynumber = 4000; + if(muteDoc.memberRoles.length > 20) delaynumber = 8000; + if(muteDoc.memberRoles.length > 30) delaynumber = 10000; + if(muteDoc.memberRoles.length > 40) delaynumber = 12000; + + + if(logging && logging.moderation.remove_roles === "true"){ + for (const role of muteDoc.memberRoles) { + const roleM = await guild.roles.cache.get(role); +if(roleM){ + await member.roles.add(roleM, ["Mute Command, Mute duration Expired."]).catch(()=>{}) + + await delay(delaynumber); +} + + } + } + +const role = member.guild.roles.cache.get(logging.moderation.ignore_role); +const channel = member.guild.channels.cache.get(logging.moderation.channel) + + if(logging.moderation.toggle == "true"){ + if(channel){ + + +if(logging.moderation.mute == "true"){ + +let color = logging.moderation.color; +if(color == "#000000") color = member.client.color.green; + +let logcase = logging.moderation.caseN +if(!logcase) logcase = `1` + +const logEmbedm = new MessageEmbed() +.setAuthor(`Action: \`Un Mute\` | ${member.user.tag} | Case #${logcase}`, member.user.displayAvatarURL({ format: 'png' })) +.addField('User', member, true) +.addField('Reason', 'Mute Duration Expired', true) +.setFooter(`ID: ${member.id}`) +.setTimestamp() +.setColor(color) + +channel.send(logEmbedm).catch(()=>{}) + +logging.moderation.caseN = logcase + 1 +await logging.save().catch(()=>{}) +} + + } + } +} + /*for (const role of muteDoc.memberRoles) { + await member.roles.add(role).catch(err => console.log(err))*/ + } + } + if(Date.now() >= Number(muteDoc.length)){ + await muteDoc.deleteOne().catch(()=>{}) + } + } + } + }, 5000) + + +// Blacklist User Timeout + +//setInterval(async () => + +const now1 = new Date() + +const conditional1 = { + length: { + $lt: now1 + }, + isBlacklisted: true, + type: "user" +} +const results1 = await BlacklistModel.find(conditional1) + +if (results1 && results1.length) { + for (const resultz of results) { + const { discordId } = resultz + + try { + await BlacklistModel.deleteOne(conditional) + } catch (e) { + console.log(e) + } + +logger.info(`User of ID ${discordId} got Unblacklisted!`, { label: 'Unblacklist' }) +const embedz = new MessageEmbed() +.setTitle(`User Unblacklisted!`) +.setDescription(`User of ID ${discordId} Got Unblacklisted! (<@${discordId}>)`) +.setFooter(`https://pogy.xyz`) +.setColor('green') + webhookClient.send({ + username: 'Pogy User Blacklists', + avatarURL: `${this.client.domain}/logo.png`, + embeds: [embedz] + }); + } + +} + +//}, 60000) + + +// Blacklist Guild Timeout + +//setInterval(async () => { + +const now = new Date() + +const conditional = { + length: { + $lt: now + }, + isBlacklisted: true, + type: "guild" +} +const results = await BlacklistModel.find(conditional) + +if (results && results.length) { + for (const result of results) { + const { guildId } = result + + try { + await BlacklistModel.deleteOne(conditional) + } catch (e) { + console.log(e) + } + +logger.info(`Guild of ID ${guildId} got Unblacklisted!`, { label: 'Unblacklist' }) + +const embed = new MessageEmbed() +.setTitle(`Server Unblacklisted!`) +.setDescription(`Guild **${guildId}** Got Unblacklisted!`) +.setFooter(`https://pogy.xyz`) +.setColor('green') + + webhookClient.send({ + username: 'Pogy Guild Unblacklist', + avatarURL:`${this.client.domain}/logo.png`, + embeds: [embed] + }); + } + +} + +//}, 60000) + + +//premium + +setInterval(async () => { + + +const conditional = { + isPremium: "true", +} +const results = await Guild.find(conditional) + +if (results && results.length) { + for (const result of results) { + + + + if (Number(result.premium.redeemedAt) >= Number(result.premium.expiresAt)) { + + +const guildPremium = this.client.guilds.cache.get(result.guildId); +if(guildPremium){ + const user = await this.client.users.cache.get(result.premium.redeemedBy.id) + + if(user){ + + const embed = new Discord.MessageEmbed() + .setColor(this.client.color.red) + .setDescription(`Hey ${user.username}, Premium in ${guildPremium.name} has Just expired :(\n\n__You can you re-new your server here! [https://pogy.xyz/premium](https://pogy.xyz/premium)__\n\nThank you for purchasing premium Previously! We hope you enjoyed what you purchased.\n\n**- Pogy**`) + + user.send(embed).catch(()=>{}) + } + + + + + + const rip = new Discord.MessageEmbed() + .setDescription(`**Premium Subscription**\n\n**Guild:** ${guildPremium.name} | **${guildPremium.id}**\nRedeemed by: ${user.tag || 'Unknown'}\n**Plan:** ${result.premium.plan}`) + .setColor('RED') + .setTimestamp() + + await premiumrip.send({ + username: 'Pogy Loose Premium', + avatarURL: `${this.client.domain}/logo.png`, + embeds: [rip], + }).catch(()=>{}); + + + + result.isPremium = "false"; + result.premium.redeemedBy.id = null; + result.premium.redeemedBy.tag = null; + result.premium.redeemedAt = null; + result.premium.expiresAt = null; + result.premium.plan = null; + + await result.save().catch(()=>{}) +} + + + } + + } +} + +}, 60000) +//POLL INTERVAL + + setInterval(async () => { + for (const guild of this.client.guilds.cache) { + const pollArray = await pollModel.find({ + guild: guild[0], + }).catch(err => console.log(err)); + const guildDB = await Guild.findOne({ + guild: guild[0].id, + }).catch(err => console.log(err)); + +const language = require(`../../data/language/${guildDB.language}.json`) + + + + for (const poll of pollArray) { + if (Date.now() >= Number(poll.expiryDate)) { + + if(!poll.textChannel) return; + + const channel = this.client.channels.cache.get(poll.textChannel) + const msg = await channel.messages.fetch(poll.message).catch(() => {}); + + const resultsArr = []; + + for (const e of emojiArray()) { + const allReactions = await fetchAll(msg, e).catch(err => console.log(err)); + resultsArr.push([e, typeof allReactions == 'object' ? allReactions.length : undefined]); + } + + resultsArr.sort((a, b) => b[1] - a[1]); + + let votes = `${language.votes}`; + if(resultsArr[0][1] == '1') votes = `${language.votess}`; + + + if (resultsArr[0][1] == resultsArr[1][1]) { + + +if(msg){ + + + let embed = new MessageEmbed() + .setTitle(poll.title) + .setDescription(`${language.poll4} ${language.poll6} **${resultsArr[0][1] - 1}** ${votes}`) + .setColor('YELLOW') + .setFooter(`Ended at ${moment(new Date()).format('LLLL')}`) + msg.edit(embed).catch(() => {}); + msg.reactions.removeAll().catch(() => {}); + if (!channel.permissionsFor(channel.guild.me).has('SEND_MESSAGES')) return; +await poll.deleteOne().catch(() => {}); + channel.send(`${language.poll4} \nhttps://discordapp.com/channels/${msg.guild.id}/${channel.id}/${msg.id}`); + +} else{ + + if (!channel.permissionsFor(channel.guild.me).has('SEND_MESSAGES')) return; + await poll.deleteOne().catch(() => {}); + channel.send(`${language.poll5} \n**${language.poll8}** `).catch(() => {}); +} + return; + } + else { +if(msg){ + let embed = new MessageEmbed() + .setTitle(poll.title) + .setDescription(`${language.poll7} ${resultsArr[0][0]} ${language.with} ${resultsArr[0][1] - 1} ${language.votesss} `) + .setColor(`GREEN`) + .setFooter(`Ened at ${moment(new Date()).format('LLLL')}`) + msg.edit(embed).catch(() => {}); + msg.reactions.removeAll().catch(() => {}); + if (!channel.permissionsFor(channel.guild.me).has('SEND_MESSAGES')) return; +await poll.deleteOne().catch(() => {}); + channel.send(`${language.poll7} ${resultsArr[0][0]} - ${resultsArr[0][1] - 1} ${language.votesss} \nhttps://discordapp.com/channels/${msg.guild.id}/${channel.id}/${msg.id}`); + } else{ + if (!channel.permissionsFor(channel.guild.me).has('SEND_MESSAGES')) return; + await poll.deleteOne().catch(() => {}); + channel.send(`${language.poll7} ${resultsArr[0][0]} - ${resultsArr[0][1] - 1} ${language.votesss} \n**${language.poll8}**`); + + } + } + await poll.deleteOne().catch(err => console.log(err)); + return; + } + } + } + }, 15000); + + + + + + + } + + + + +} + + + function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} \ No newline at end of file diff --git a/events/shard/shardResume.js b/events/shard/shardResume.js new file mode 100644 index 00000000..8a4efd51 --- /dev/null +++ b/events/shard/shardResume.js @@ -0,0 +1,24 @@ +const Event = require('../../structures/Event'); +const Discord = require('discord.js'); +const { MessageEmbed } = require('discord.js'); +const logger = require('../../utils/logger'); +const webhookClient = new Discord.WebhookClient('', ''); + +module.exports = class extends Event { + constructor(...args) { + super(...args) + } + + async run() { + logger.info(`Shard ${this.client.shard.ids - 1 + 2}/${this.client.shard.count} has resumed`, { label: 'Shard' }) + + + const embed = new MessageEmbed() + .setColor('BLUE') + .setDescription(`Pogy: [${this.client.shard.ids - 1 + 2}/${this.client.shard.count}] Resumed`) + .setTimestamp() + + webhookClient.send(embed) + + } +} \ No newline at end of file diff --git a/events/voice/voiceStateUpdate.js b/events/voice/voiceStateUpdate.js new file mode 100644 index 00000000..1c720aba --- /dev/null +++ b/events/voice/voiceStateUpdate.js @@ -0,0 +1,176 @@ +const Event = require('../../structures/Event'); +const Logging = require('../../database/schemas/logging'); +const discord = require("discord.js"); +const Maintenance = require('../../database/schemas/maintenance') +const cooldown = new Set(); + +module.exports = class extends Event { + +async run(oldState, newState) { + +if(!oldState || !newState) return; + + + +const logging = await Logging.findOne({ guildId: oldState.guild.id }) + + +const maintenance = await Maintenance.findOne({ + maintenance: "maintenance" +}) + + +if(maintenance && maintenance.toggle == "true") return; + +if(cooldown.has(newState.guild.id)) return; + +if(logging){ + if(logging.server_events.toggle == "true"){ + + +const channelEmbed = await oldState.guild.channels.cache.get(logging.server_events.channel) + +if(channelEmbed){ + +let colorGreen = logging.server_events.color; +if(colorGreen === "#000000") colorGreen = 'GREEN'; + +let colorRed = logging.server_events.color; +if(colorRed === "#000000") colorRed = 'RED'; + +let colorYellow = logging.server_events.color; +if(colorYellow === "#000000") colorYellow = 'YELLOW'; + + + let oldChannelName; + let newChannelName; + let embed; + + + let oldparentname = "unknown" + let oldchannelname = "unknown" + let oldchanelid = "unknown" + if (oldState && oldState.channel && oldState.channel.parent && oldState.channel.parent.name) oldparentname = oldState.channel.parent.name + if (oldState && oldState.channel && oldState.channel.name) oldchannelname = oldState.channel.name + if (oldState && oldState.channelID) oldchanelid = oldState.channelID + + let newparentname = "unknown" + let newchannelname = "unknown" + let newchanelid = "unknown" + if (newState && newState.channel && newState.channel.parent && newState.channel.parent.name) newparentname = newState.channel.parent.name + if (newState && newState.channel && newState.channel.name) newchannelname = newState.channel.name + if (newState && newState.channelID) newchanelid = newState.channelID + + if (oldState.channelID && oldState.channel) { + if (typeof oldState.channel.parent !== "undefined") { + + oldChannelName = `**Category:** ${oldparentname}\n\t**Name:** ${oldchannelname}\n**ID: **${oldchanelid}` + + } else { + oldChannelName = `-\n\t**Name:** ${oldparentname}\n**ID:** ${oldchanelid}` + } + } else { + oldChannelName = `[Stage Channel]` + } + if (newState.channelID && newState.channel) { + if (typeof newState.channel.parent !== "undefined") { + + newChannelName = `**Category:** ${newparentname}\n\t**Name:** ${newchannelname}\n**ID:** ${newchanelid}` + + } else { + newChannelName = `-\n\t**Name:** ${newchannelname}**\n**ID:** ${newchanelid}` + } + } else { + newChannelName = `[Stage Channel]` + } + + // JOINED V12 + if (!oldState.channelID && newState.channelID) { + const joinembed = new discord.MessageEmbed() + .setAuthor(`${newState.member.user.tag} | Voice Channel Joined!`, newState.member.user.displayAvatarURL()) + .addField('member', newState.member, true) + .addField('Channel', newChannelName, true) + .setColor(colorGreen) + .setTimestamp() + .setFooter(`ID: ${newState.member.user.id}`) + + if(logging.server_events.voice.join == "true"){ + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newState.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(joinembed).catch(()=>{}) + cooldown.add(newState.guild.id); + setTimeout(()=>{ + cooldown.delete(newState.guild.id) + }, 3000) + } + + } + + + + } + + + // LEFT V12 + if (oldState.channelID && !newState.channelID) { + const leaveembed = new discord.MessageEmbed() + .setAuthor(`${newState.member.user.tag} | Voice Channel Left!`, newState.member.user.displayAvatarURL()) + .addField('member', newState.member, true) + .addField('Channel', oldChannelName, true) + .setColor(colorRed) + .setTimestamp() + .setFooter(`ID: ${newState.member.user.id}`) + + if(logging.server_events.voice.leave== "true"){ + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newState.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + channelEmbed.send(leaveembed).catch(()=>{}); + cooldown.add(newState.guild.id); + setTimeout(()=>{ + cooldown.delete(newState.guild.id) + }, 3000) + } + } +} + + + // SWITCH V12 + if (oldState.channelID && newState.channelID) { + // False positive check + if (oldState.channelID !== newState.channelID) { + + + const moveembed = new discord.MessageEmbed() + .setAuthor(`${newState.member.user.tag} | Moved Voice Channels`, newState.member.user.displayAvatarURL()) + .addField('Left', oldChannelName, true) + .addField('Joined', newChannelName, true) + .setColor(colorYellow) + .setTimestamp() + .setFooter(`ID: ${newState.member.user.id}`) + if(logging.server_events.voice.move == "true"){ + + if(channelEmbed && + channelEmbed.viewable && + channelEmbed.permissionsFor(newState.guild.me).has(['SEND_MESSAGES', 'EMBED_LINKS'])){ + + channelEmbed.send(moveembed).catch(()=>{}); + cooldown.add(newState.guild.id); + setTimeout(()=>{ + cooldown.delete(newState.guild.id) + }, 3000) + + } + } + } + } + + + } + } +} + } +}; \ No newline at end of file diff --git a/filters/inviteFilter.js b/filters/inviteFilter.js new file mode 100644 index 00000000..bb305fa7 --- /dev/null +++ b/filters/inviteFilter.js @@ -0,0 +1,61 @@ +const Guild = require('../database/schemas/Guild'); +const logger = require('../utils/logger'); +const fetch = require('node-fetch'); + +module.exports = async message => { + const inviteLink = new RegExp(/(https?:\/\/)?(www\.)?(discord\.(gg|io|me|li)|discordapp\.com\/invite)\/.+[a-z]/g); + + const settings = await Guild.findOne({ + guildId: message.guild.id, + }); + if (settings.antiLinks) return; + if (settings.antiInvites) { + if (!message.member.hasPermission('ADMINISTRATOR' || 'MANAGE_GUILD' || 'BAN_MEMBERS' || 'KICK_MEMBERS' || 'MANAGE_MESSAGES')) { + const inviteLink = new RegExp(/(https?:\/\/)?(www\.)?(discord\.(gg|io|me|li)|discordapp\.com\/invite)\/.+[a-z]/g); + if (inviteLink.test(message.content)) { + const msgcontent = message.content + code = msgcontent.replace(/(https:\/\/)?(www\.)?(discord\.gg|discord\.me|discordapp\.com\/invite|discord\.com\/invite)\/?/g, ""); + fetch(`https://discordapp.com/api/invite/${code}`) + .then((res) => res.json()) + .then((json) => { + if (json.message !== 'Unknown Invite') { + message.delete().catch(()=>{}) + message.channel.send({ + embed: { + color: 'RED', + author: { + name: `${message.member.user.tag}`, + icon_url: message.member.user.displayAvatarURL({format: 'png', dynamic: true, size: 1024}) + }, + footer: { + text: message.deletable ? '' : 'Couldn\'t delete the message due to missing permissions.' + }, + description: 'No invite links here', + } + }) + } + }); + } else { + let links = message.content.match(/(https:\/\/)?(www\.)?(discord\.gg|discord\.me|discordapp\.com\/invite|discord\.com\/invite)\/([a-z0-9-.]+)?/i); + if(links) { + + + message.delete().catch(()=>{}) + message.channel.send({ + embed: { + color: 'RED', + author: { + name: `${message.member.user.tag}`, + icon_url: message.member.user.displayAvatarURL({format: 'png', dynamic: true, size: 1024}) + }, + footer: { + text: message.deletable ? '' : 'Couldn\'t delete the message due to missing permissions.' + }, + description: 'No invite links here', + } + }) + } + } + } + } +} \ No newline at end of file diff --git a/filters/linkFilter.js b/filters/linkFilter.js new file mode 100644 index 00000000..419f8359 --- /dev/null +++ b/filters/linkFilter.js @@ -0,0 +1,47 @@ +const Guild = require('../database/schemas/Guild'); +const logger = require('../utils/logger'); + +module.exports = async message => { + const settings = await Guild.findOne({ + guildId: message.guild.id, + }, (err, guild) => { + if (err) console.log(err) + }); + + if (settings.antiLinks) { + if (!message.member.hasPermission('ADMINISTRATOR' || 'MANAGE_GUILD' || 'BAN_MEMBERS' || 'KICK_MEMBERS' || 'MANAGE_MESSAGES')) { + if (hasLink(message.content)) { + + return deleteLink(message); + } + } + } else return; + + function hasLink(string) { + let link = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + + if (link.test(string)) return true; + return false; + } + + function deleteLink(message) { + if (message.deletable) { + message.delete().catch(() => {}); + } + + message.channel.send({ + embed: { + color: 'RED', + author: { + name: `${message.member.user.tag}`, + icon_url: message.member.user.displayAvatarURL({format: 'png', dynamic: true, size: 1024}) + }, + footer: { + text: message.deletable ? '' : 'Couldn\'t delete the message due to missing permissions.' + }, + description: 'No Links allowed here' + } + }) + return true; + } +} \ No newline at end of file diff --git a/fonts/font.otf b/fonts/font.otf new file mode 100644 index 00000000..48b7fe78 Binary files /dev/null and b/fonts/font.otf differ diff --git a/fonts/font.ttf b/fonts/font.ttf new file mode 100644 index 00000000..69f558e3 Binary files /dev/null and b/fonts/font.ttf differ diff --git a/index.js b/index.js new file mode 100644 index 00000000..4a600e50 --- /dev/null +++ b/index.js @@ -0,0 +1,46 @@ +const PogyClient = require("./Pogy"); +const config = require("./config.json"); +var express = require('express'); + + +const Pogy = new PogyClient(config); + +const color = require("./data/colors"); +Pogy.color = color; + +Pogy.domain = `https://pogy.xyz`; + +const emoji = require("./data/emoji"); +Pogy.emoji = emoji; + +let client = Pogy +const jointocreate = require("./structures/jointocreate"); +jointocreate(client); + +Pogy.react = new Map() +Pogy.fetchforguild = new Map() + +//Pogy.cachedMessageReactions = new Map(); +//Pogy.on('debug', console.log)/* + +if(config.dashboard === "true"){ + const Dashboard = require("./dashboard/dashboard"); + Dashboard(client); +} + + +//const api = require("./api/test.js") + + + +Pogy.start(); + + + + + + + + + + \ No newline at end of file diff --git a/models/ShortUrl.js b/models/ShortUrl.js new file mode 100644 index 00000000..841d3a61 --- /dev/null +++ b/models/ShortUrl.js @@ -0,0 +1,26 @@ +const mongoose = require('mongoose') +const shortId = require('shortid') +let kaka = shortId.generate + +const shortUrlSchema = new mongoose.Schema({ + full: { + type: String, + required: true + }, + short: { + type: String, + required: true, + + }, + clicks: { + type: Number, + required: true, + default: 0 + }, + guildID: String, + memberID: String, + + +}) + +module.exports = mongoose.model('ShortUrl', shortUrlSchema) diff --git a/models/afk.js b/models/afk.js new file mode 100644 index 00000000..a85ccdf9 --- /dev/null +++ b/models/afk.js @@ -0,0 +1,11 @@ +const mongoose = require("mongoose"); + +const afkSchema = mongoose.Schema({ + userID: {type: String}, + serverID: {type: String}, + reason: {type: String, default: ' '}, + oldNickname: {type: String}, + time: {type: String, default: Date.now()} +}); + +module.exports = mongoose.model("Afk", afkSchema); diff --git a/models/altdetector.js b/models/altdetector.js new file mode 100644 index 00000000..f1ef5caf --- /dev/null +++ b/models/altdetector.js @@ -0,0 +1,15 @@ +const mongoose = require("mongoose") + +let altDetector = mongoose.Schema({ + guildID: {type: mongoose.SchemaTypes.String, + required: true, + unique: true}, + altDays: {type: String, default: 7}, + altModlog: {type: String, default: null}, + allowedAlts: {type: Array, default: []}, + altAction: {type: String, default: 'none'}, + altToggle: {type: Boolean, default: false}, + notifier: {type: Boolean, default: false} +}) + +module.exports = mongoose.model("altDetector", altDetector) \ No newline at end of file diff --git a/models/application/appID.js b/models/application/appID.js new file mode 100644 index 00000000..92a0168f --- /dev/null +++ b/models/application/appID.js @@ -0,0 +1,9 @@ +const mongoose = require("mongoose") + +let appID = mongoose.model({ + guildID: { type: String }, + userID: { type: String }, + appID: { type: String } +}) + +module.exports = mongoose.model("appID", appID) \ No newline at end of file diff --git a/models/application/application.js b/models/application/application.js new file mode 100644 index 00000000..0d6ccb0d --- /dev/null +++ b/models/application/application.js @@ -0,0 +1,33 @@ +const mongoose = require("mongoose") + +const app = mongoose.Schema({ + guildID: { + type: String + }, + questions: { + type: Array, + default: [] + }, + appToggle: { + type: Boolean, + default: false + }, + appLogs: { + type: String, + default: null + }, + add_role: { + type: String, + default: null + }, + remove_role: { + type: String, + default: null + }, + dm: { + type: Boolean, + default: true + }, +}) + +module.exports = mongoose.model('app', app) \ No newline at end of file diff --git a/models/application/applied.js b/models/application/applied.js new file mode 100644 index 00000000..f126f9e6 --- /dev/null +++ b/models/application/applied.js @@ -0,0 +1,10 @@ +const mongoose = require("mongoose") + +let applied = mongoose.Schema({ + guildID: { type: String }, + userID: { type: String }, + appID: { type: Array, default: [] }, + hasApplied: { type: Boolean, default: true } +}) + +module.exports = mongoose.model("applied", applied) \ No newline at end of file diff --git a/models/customcmd.js b/models/customcmd.js new file mode 100644 index 00000000..20c1acd2 --- /dev/null +++ b/models/customcmd.js @@ -0,0 +1,10 @@ +const mongoose = require("mongoose"); + +const customcmd = mongoose.Schema({ + userID: {type: String}, + serverID: {type: String}, + command: {type: Array, default: []}, + response: {type: Array, default: []}, +}); + +module.exports = mongoose.model("cc", customcmd); diff --git a/models/economy.js b/models/economy.js new file mode 100644 index 00000000..e69de29b diff --git a/models/economy/animals.js b/models/economy/animals.js new file mode 100644 index 00000000..a6074ab4 --- /dev/null +++ b/models/economy/animals.js @@ -0,0 +1,8 @@ +const mongoose = require("mongoose") + +let bal = mongoose.Schema({ + user: { type: String }, + Inventory: { type: Object }, +}) + +module.exports = mongoose.model("ecoanimal", bal) \ No newline at end of file diff --git a/models/economy/balance.js b/models/economy/balance.js new file mode 100644 index 00000000..1268ce33 --- /dev/null +++ b/models/economy/balance.js @@ -0,0 +1,8 @@ +const mongoose = require("mongoose") + +let bal = mongoose.Schema({ + user: { type: String }, + balance: { type: Number, default: 0 } +}) + +module.exports = mongoose.model("balance", bal) \ No newline at end of file diff --git a/models/economy/equipped.js b/models/economy/equipped.js new file mode 100644 index 00000000..77dfaa8e --- /dev/null +++ b/models/economy/equipped.js @@ -0,0 +1,8 @@ +const mongoose = require("mongoose") + +let bal = mongoose.Schema({ + user: { type: String, required: true,}, + itemEquipped: { type: String, default: "Default Shotgun" } +}) + +module.exports = mongoose.model("equippedItem", bal) \ No newline at end of file diff --git a/models/economy/items.js b/models/economy/items.js new file mode 100644 index 00000000..242828e6 --- /dev/null +++ b/models/economy/items.js @@ -0,0 +1,8 @@ +const mongoose = require("mongoose") + +let bal = mongoose.Schema({ + user: { type: String }, + Inventory: { type: Object }, +}) + +module.exports = mongoose.model("ecoitems", bal) \ No newline at end of file diff --git a/models/moderation.js b/models/moderation.js new file mode 100644 index 00000000..129b9a01 --- /dev/null +++ b/models/moderation.js @@ -0,0 +1,15 @@ +const mongoose = require('mongoose') + +const warn = mongoose.Schema({ + + guildID: {type: String}, + memberID: {type: String}, + modType: {type: Array, default: []}, + warnings: {type: Array, default: []}, + warningID: {type: Array, default: []}, + moderator: {type: Array, default: []}, + date: {type: Array, default: []}, + +}) + +module.exports = mongoose.model('warn', warn) \ No newline at end of file diff --git a/models/mute.js b/models/mute.js new file mode 100644 index 00000000..d75e7746 --- /dev/null +++ b/models/mute.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose') + +const mute = mongoose.Schema({ + + guildID: {type: String}, + memberID: {type: String}, + length: {type: Date, default: Date.now()}, + memberRoles: {type: Array, default: []}, + +}) + +module.exports = mongoose.model('mute', mute) \ No newline at end of file diff --git a/models/robbable.js b/models/robbable.js new file mode 100644 index 00000000..e91b3319 --- /dev/null +++ b/models/robbable.js @@ -0,0 +1,8 @@ +const mongoose = require("mongoose") + +let robSchema = mongoose.Schema({ + userID: {type: String}, + hasPadlock: {type: Boolean, default: false}, +}) + +module.exports = mongoose.model("EcoRob", robSchema) \ No newline at end of file diff --git a/models/tickets.js b/models/tickets.js new file mode 100644 index 00000000..4591232d --- /dev/null +++ b/models/tickets.js @@ -0,0 +1,36 @@ +const mongoose = require("mongoose") + +let ticketSchema = mongoose.Schema({ + guildID: {type: String}, + ticketReactChannel: {type: String}, + messageID: {type: Array, default: []}, + supportRoleID: {type: String}, + categoryID: {type: String}, + ticketModlogID: {type: String}, + ticketType: {type: String, default: ''}, + ticketCase: { + type: mongoose.SchemaTypes.Number, + default: '1' + }, + maxTicket: { + type: Number, + default: '1' + }, + ticketToggle: {type: String, default: false}, + ticketWelcomeMessage: {type: String, default: `Hey {user} Welcome to your ticket!\n\nThank you for creating a ticket, the support team will be with you shortly\n\nIn the mean time, please explain your issue below`}, + ticketPing: {type: String, default: false}, + ticketClose: {type: String, default: false}, + ticketTimestamp: {type: String, default: false}, + ticketLogColor: {type: String, default: `#000000`}, + ticketEmbedColor: {type: String, default: `#000000`}, + ticketTitle: {type: String, default: `Server Tickets`}, + ticketDescription: {type: String, default: `Please react with 🎫 to open a ticket!`}, + ticketFooter: {type: String, default: `Powered by Pogy.xyz`}, + ticketReaction: {type: String, default: `🎫`}, + ticketWelcomeColor: {type: String, default: `#000000`}, + requireReason: {type: String, default: true}, + ticketCustom: {type: String, default: "false"} + +}) + +module.exports = mongoose.model('ticketSchema', ticketSchema) \ No newline at end of file diff --git a/models/transcript.js b/models/transcript.js new file mode 100644 index 00000000..9100215f --- /dev/null +++ b/models/transcript.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose'); +const { customAlphabet } = require('nanoid'); +const dictionary = require('nanoid-dictionary'); +const nanoid = customAlphabet(dictionary.nolookalikes, 8); + +const paste = new mongoose.Schema({ + _id: { type: String}, + type: {type: String}, + by: { type: String }, + status: {type: String, default: null}, + paste: { type: Array }, + paste2: { type: Array }, + expiresAt: { type: Date, expires: 0 } +}, { + timestamps: true +}); + +module.exports = mongoose.model('Paste', paste); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..a573f67d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4780 @@ +{ + "name": "pogy", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@canvacord/assets": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvacord/assets/-/assets-1.0.0.tgz", + "integrity": "sha512-iPOJtM3XV8nQNNYW8V2G/+bgI//bzpy/lBfnlddjxnuwVs8fD9Q7Od00twvWrST0SdkBSaf3ndWpiC6CL1a/qg==" + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@top-gg/sdk": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@top-gg/sdk/-/sdk-3.0.8.tgz", + "integrity": "sha512-oZ4mw8LpD7k3jt1bL/+MngOVO8Qer9mbcGhlmROqA/bl8CpYdmhiKbkgtGt/uL8yhehTwGC5wzhtEZMbjC+CaA==", + "requires": { + "node-fetch": "^2.6.1", + "raw-body": "^2.4.1" + } + }, + "@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "requires": { + "@types/node": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/mongodb": { + "version": "3.6.10", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.10.tgz", + "integrity": "sha512-BkwAHFiZSSWdTIqbUVGmgvIsiXXjqAketeK7Izy7oSs6G3N8Bn993tK9eq6QEovQDx6OQ2FGP2KWDDxBzdlJ6Q==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.17.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.51.tgz", + "integrity": "sha512-KANw+MkL626tq90l++hGelbl67irOJzGhUJk6a1Bt8QHOeh9tztJx+L0AqttraWKinmZn7Qi5lJZJzx45Gq0dg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "ascii-table": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ascii-table/-/ascii-table-0.0.9.tgz", + "integrity": "sha1-BqZgTWpV1L9BqaR9mHLXp42jHnM=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "bignumber.js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-1.1.1.tgz", + "integrity": "sha1-GkFdmsAUwTJWrx/u2dGj5XF6jPc=" + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "canvacord": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/canvacord/-/canvacord-5.0.8.tgz", + "integrity": "sha512-1/0+p40FHeyc7csAofXuAa0nULBAEnTl+KfN67LarfQFo85hgcEP+y+btJ0h5qSJkD14zZVcugZ/WWZlBX38nA==", + "requires": { + "@canvacord/assets": "^1.0.0", + "canvas": "^2.6.1", + "gifencoder": "^2.0.1", + "moment": "^2.29.0", + "moment-duration-format": "^2.3.2", + "node-canvas-with-twemoji-and-discord-emoji": "^1.1.4" + }, + "dependencies": { + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + } + } + }, + "canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.7.0.tgz", + "integrity": "sha512-pzCxtkHb+5su5MQjTtepMDlIOtaXo277x0C0u3nMOxtkhTyQ+h2yNKhlROAaDllWgRyePAUitC08sXw26Eb6aw==", + "requires": { + "nan": "^2.14.0", + "node-pre-gyp": "^0.15.0", + "simple-get": "^3.0.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "chatcord": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/chatcord/-/chatcord-0.0.5.tgz", + "integrity": "sha512-mdM7nIAlt58yMAfrQ4utmYiMHVR/+heLBCdmK9l5pTLFmWawnh+zn6dPFuTxe86THKLS3XrtbgQPMbjH7zazAw==", + "requires": { + "md5": "^2.3.0", + "superagent": "^6.1.0" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "clarg": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/clarg/-/clarg-0.0.4.tgz", + "integrity": "sha1-cI/7XsNSImptxYccN02sqMhx/20=" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "datadog-metrics": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/datadog-metrics/-/datadog-metrics-0.8.2.tgz", + "integrity": "sha512-84WomqgMr7CigstOglR0dapSgaZ9w1kjdnjRAZQWEdwoXDxTS86qcjx+MOAGW3+tM/RNfA9Z3G//sFl+CBNOAA==", + "requires": { + "debug": "3.1.0", + "dogapi": "2.8.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "date-and-time": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", + "integrity": "sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==" + }, + "dblapi.js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dblapi.js/-/dblapi.js-2.4.1.tgz", + "integrity": "sha512-g+u1inF/qOLit5qPK4hBGk5pKL1vy09uBLV+nukkRMvw2S9D1PyiyO70n4fboUXOgbExPp6Sho/Y782OqQOUiQ==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "discord.js": { + "version": "12.5.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", + "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", + "requires": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.2", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.3.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dogapi": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/dogapi/-/dogapi-2.8.3.tgz", + "integrity": "sha512-CzJIllAcv17H8hylyuljldJv+2EGal5+Fa+gsXFrXDo1zl8cq9jk7FDCXDqH4C/tPNAusS9ckV8wuBFtCiuTUg==", + "requires": { + "extend": "^3.0.0", + "json-bigint": "^0.1.4", + "lodash": "^4.17.10", + "minimist": "^1.1.1", + "rc": "^1.2.8" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "requires": { + "jake": "^10.6.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", + "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-tesseract": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-tesseract/-/eslint-config-tesseract-0.0.3.tgz", + "integrity": "sha512-zE8Lp5Ys8pL0NNR4Tzlpni2JhDVvifr6S1qJCjpU5P/nylanVcZHyg3v60CiA4pgpCd70YRMoyaF7aZI28t7Og==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "dev": true, + "requires": { + "acorn": "^7.3.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + }, + "ffbinaries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ffbinaries/-/ffbinaries-1.1.4.tgz", + "integrity": "sha512-ZKT6Jwhq5zV04YRW8FR8sVlSWIoqV1BJbnt8NKVtbrUlrNNMbDrY2v1ZiGsJjdmAILzu1HIlj7awBHWLwyGHOA==", + "requires": { + "async": "^3.1.0", + "clarg": "0.0.4", + "extract-zip": "^1.6.7", + "fs-extra": "^8.1.0", + "lodash": "^4.17.15", + "request": "^2.88.0" + } + }, + "figlet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", + "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "generate-password": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.6.0.tgz", + "integrity": "sha512-YUJTQkApkLT/fru0QdYWP0lVZdPKhF5kXCP24sgI4gR/vFMJFopCj5t1+9FAKIYcML/nxzx2PMkA1ymO1FC+tQ==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gifencoder": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz", + "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==", + "requires": { + "canvas": "^2.2.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "requires": { + "ini": "^1.3.5" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "intl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", + "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz", + "integrity": "sha1-6YUMwsyGDDvAl36EzPDdRkWEJ5o=" + }, + "is-array-like": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-array-like/-/is-array-like-1.1.2.tgz", + "integrity": "sha1-fygKp3f1PrMfdOHc0+BAkjGGwgU=", + "requires": { + "is-array": "^1.0.1", + "is-function": "^1.0.1", + "is-window": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-nil": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-nil/-/is-nil-1.0.1.tgz", + "integrity": "sha1-LauingtYUGOHXntTnQcfWxWTeWk=" + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==" + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-window": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz", + "integrity": "sha1-LIlspT25feRdPDMTOmXYyfVjSA0=" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-bigint": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.1.4.tgz", + "integrity": "sha1-tdQLipAJ6S8Vf3wHnbCXABgw4B4=", + "requires": { + "bignumber.js": "~1.1.1" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json2csv": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-4.5.1.tgz", + "integrity": "sha512-o90Xa1ziGk3i7AJEO79Jac4+7SEUk58/DxS5mDPW6GF7poX0y7Y0pm1FbWrkz9VzKE4MpUW9aKBOCpJ0U1Ua8A==", + "requires": { + "commander": "^2.15.1", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + } + }, + "jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^0.1.2" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "max-array-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/max-array-length/-/max-array-length-1.0.0.tgz", + "integrity": "sha1-DmT12l3rR7zaqrRxYNZunybtRjE=" + }, + "max-safe-int": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/max-safe-int/-/max-safe-int-1.0.0.tgz", + "integrity": "sha1-RPuo7Jk97ZH7LFo15xz5yfNpzlI=" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "memorystore": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.5.tgz", + "integrity": "sha512-2RD1kTZhF0nywVtps2NoQgbMiPO6o1+dIRUAi2cRQDxMyCKwOZdBrC/Lk9/ttlF6lHn3T6uCPwSbgWxEef9djQ==", + "requires": { + "debug": "^4.3.0", + "lru-cache": "^4.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-duration-format": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", + "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" + }, + "mongodb": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.5.tgz", + "integrity": "sha512-mQlYKw1iGbvJJejcPuyTaytq0xxlYbIoVDm2FODR+OHxyEiMR021vc32bTvamgBjCswsD54XIRwhg3yBaWqJjg==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.2.tgz", + "integrity": "sha512-kT9t6Nvu9WPsfssn7Gzke446Il8UdMilY7Sa5vALtwoOoNOGtZEVjekZBFwsBFzTWtBA/x5gBmJoYFP+1LeDlg==", + "requires": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.5", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.4", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "7.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" + }, + "mquery": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.4.tgz", + "integrity": "sha512-uOLpp7iRX0BV1Uu6YpsqJ5b42LwYnmu0WeF/f8qgD/On3g0XDaQM6pfn0m6UxO6SM8DioZ9Bk6xxbWIGHm2zHg==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "nanoid-dictionary": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/nanoid-dictionary/-/nanoid-dictionary-4.2.0.tgz", + "integrity": "sha512-mLeTWGvp9jHbw6mXsHCGHKdJpGzy2gjF1ouS3tZER1DCZhXN/8Ks1w8fxLlIOn/8JhQmRBL1Y40q8kCPay6wNA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-canvas-with-twemoji-and-discord-emoji": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/node-canvas-with-twemoji-and-discord-emoji/-/node-canvas-with-twemoji-and-discord-emoji-1.1.4.tgz", + "integrity": "sha512-IQbXxxtxZnpT9X1IFvwyZIUj9LNVHCjYPzKVpiDR3wou6Wmha+wpOw8ocpJtn5ZSezWWBcTf50s1Pm09y+jIhQ==", + "requires": { + "canvas": "^2.6.1", + "twemoji": "^12.1.5" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-os-utils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-os-utils/-/node-os-utils-1.3.2.tgz", + "integrity": "sha512-wUo/q6u77y9+DBaXkn57IDyJlQuN7xP6VU9h6yeIGhKocc9rDQPyc3WmLgX+x5jf4WmbLcEaA3raM05+v5jW3g==" + }, + "node-pre-gyp": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", + "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.3", + "needle": "^2.5.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "nodemon": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", + "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", + "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "ow": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.4.0.tgz", + "integrity": "sha512-kJNzxUgVd6EF5LoGs+s2/etJPwjfRDLXPTCfEgV8At77sRrV+PSFA8lcoW2HF15Qd455mIR2Stee/2MzDiFBDA==" + }, + "ow-lite": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ow-lite/-/ow-lite-0.0.2.tgz", + "integrity": "sha1-359QDmdAtlkKHpqWVzDUmo61l9E=" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-discord": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/passport-discord/-/passport-discord-0.1.4.tgz", + "integrity": "sha512-VJWPYqSOmh7SaCLw/C+k1ZqCzJnn2frrmQRx1YrcPJ3MQ+Oa31XclbbmqFICSvl8xv3Fqd6YWQ4H4p1MpIN9rA==", + "requires": { + "passport-oauth2": "^1.5.0" + } + }, + "passport-oauth2": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz", + "integrity": "sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==", + "requires": { + "base64url": "3.x.x", + "oauth": "0.9.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pick-item": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pick-item/-/pick-item-1.0.4.tgz", + "integrity": "sha1-DgbK/bm4Hu4ak7zg3y3OYEyekBU=", + "requires": { + "is-array-like": "^1.1.0", + "random-index": "^1.0.4" + } + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "prism-media": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.5.tgz", + "integrity": "sha512-YqSnMCugv+KUNE9PQec48Dq22jSxB/B6UcfD9jTpPN1Mbuh+RqELdTJmRPj106z3aa8ZuXrWGQllXPeIGmKbvw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/random/-/random-2.2.0.tgz", + "integrity": "sha512-4HBR4Xye4jJ41QBi6RfIaO1yKQpxVUZafQtdE6NvvjzirNlwWgsk3tkGLTbQtWUarF4ofZsUVEmWqB1TDQlkwA==", + "requires": { + "babel-runtime": "^6.26.0", + "ow": "^0.4.0", + "ow-lite": "^0.0.2", + "seedrandom": "^3.0.5" + } + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "random-char": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/random-char/-/random-char-1.0.4.tgz", + "integrity": "sha1-X+LJUTTK/MXXvI9Ggx3Db9u9XGY=", + "requires": { + "is-nil": "^1.0.1", + "is-object": "^1.0.1", + "random-natural": "^1.0.3", + "to-str": "^1.0.0" + } + }, + "random-domains": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/random-domains/-/random-domains-1.0.3.tgz", + "integrity": "sha1-EWgmUldihj1sG6U0wHkHP0dRrAo=", + "requires": { + "clamp": "^1.0.1", + "random-lorem": "^1.0.3", + "random-tld": "^1.0.2", + "to-length": "^1.0.1", + "to-str": "^1.0.0" + } + }, + "random-email": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/random-email/-/random-email-1.0.3.tgz", + "integrity": "sha1-R3t5Xccwq0LivoQgBwmUFWiOixg=", + "requires": { + "random-domains": "1.0.3", + "random-lorem": "^1.0.4", + "to-str": "^1.0.0" + } + }, + "random-index": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/random-index/-/random-index-1.0.4.tgz", + "integrity": "sha1-VMDR7Xx/xDaD/IjWS3cTvfW05h0=", + "requires": { + "max-array-length": "^1.0.0", + "random-natural": "^1.0.3" + } + }, + "random-integral": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/random-integral/-/random-integral-1.0.3.tgz", + "integrity": "sha1-j/PBF1ZcmgS2bd1VnzrtKb0PD2w=", + "requires": { + "clamp": "^1.0.1", + "max-safe-int": "^1.0.0", + "to-integer": "^1.0.1" + } + }, + "random-lorem": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/random-lorem/-/random-lorem-1.0.4.tgz", + "integrity": "sha1-/UFERTeVS7XDM7PI76gw1GVYYVI=", + "requires": { + "clamp": "^1.0.1", + "random-char": "^1.0.4", + "random-natural": "^1.0.3", + "random-syllable": "^1.0.1" + } + }, + "random-natural": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/random-natural/-/random-natural-1.0.3.tgz", + "integrity": "sha1-7yhhWwPCy3Gq6/fyT0hyZqRDxcA=", + "requires": { + "max-safe-int": "^1.0.0", + "random-integral": "^1.0.3" + } + }, + "random-syllable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-syllable/-/random-syllable-1.0.1.tgz", + "integrity": "sha1-VJn7uocri/UqrUNBw+wxjbs8SfY=", + "requires": { + "clamp": "^1.0.1", + "is-object": "^1.0.1", + "random-char": "^1.0.4", + "random-natural": "^1.0.3", + "to-integer": "^1.0.1" + } + }, + "random-tld": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/random-tld/-/random-tld-1.0.2.tgz", + "integrity": "sha1-CB84qoif/bzbCWNXg9rsbRFfEak=", + "requires": { + "pick-item": "^1.0.4", + "tld-list": "1.0.0" + } + }, + "randomstrings": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/randomstrings/-/randomstrings-0.0.2.tgz", + "integrity": "sha1-3BwEdasn3UWk30RCv1qjD6JaHEI=" + }, + "randostrings": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/randostrings/-/randostrings-0.1.6.tgz", + "integrity": "sha512-GQ8cm1o4N9Oi9FiRIJ+VaTPgp+5reK6hPjCsEXzDB2QQFcPFFyIPovTsYabBsFMQiCk71JyWvrwci7ciIJGhIw==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shortid": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", + "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", + "requires": { + "nanoid": "^2.1.0" + }, + "dependencies": { + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + } + } + }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "snekfetch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-4.0.4.tgz", + "integrity": "sha512-dyycG9fvwtSJqKPfMVOpXt+60qvMGe7vWLwOJDiSJaiAx+hs2EnFChG2bXCWn7ulz+zGzrHdN9/yeEb0YqEPww==" + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "statcord.js": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/statcord.js/-/statcord.js-3.1.7.tgz", + "integrity": "sha512-8LtGM3TNMPCz1RHTAVy7tf8ZfWOCVqM9GpM1K+Koyu63jPlPZEDD+wU5mv1VG2ffG2WOfoUKr+nOIvf9ybvMmQ==", + "requires": { + "node-fetch": "^2.6.0", + "systeminformation": "^5.3.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==" + }, + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "systeminformation": { + "version": "5.6.9", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.6.9.tgz", + "integrity": "sha512-XtX2uYU67FyZVazuqW1s1ecmBEcSUsBK8L42JEaee9DmiNuehGnSL+SN+WE7yO101iMZ8KrnYdCVcjO76gc8rw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tiktok-scraper": { + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/tiktok-scraper/-/tiktok-scraper-1.4.12.tgz", + "integrity": "sha512-fxWh4iHwfLeP4iXNFouX4FKsYQplwVK+/D7DGEkFkWfbSCxsVM4waThj9DqG1aBNvIH/ZML/met2PzTQZbW4Dg==", + "requires": { + "archiver": "^3.1.1", + "async": "^3.1.0", + "bluebird": "^3.7.1", + "json2csv": "4.5.1", + "ora": "^4.0.2", + "progress": "^2.0.3", + "request": "^2.88.0", + "request-promise": "^4.2.4", + "socks-proxy-agent": "^5.0.0", + "yargs": "^14.2.0" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + } + } + }, + "tld-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tld-list/-/tld-list-1.0.0.tgz", + "integrity": "sha1-cXPudZKysBs83KF1jVShJymSiis=" + }, + "to-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-integer/-/to-integer-1.0.1.tgz", + "integrity": "sha1-URrUHc5qk3MKjztuNaFk/YKUZNo=", + "requires": { + "is-function": "^1.0.1", + "is-nil": "^1.0.0", + "is-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "to-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-length/-/to-length-1.0.1.tgz", + "integrity": "sha1-uK5JjIoH/QU+58cHiaYMDz0DpLU=", + "requires": { + "to-integer": "^1.0.0" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "to-str": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-str/-/to-str-1.0.0.tgz", + "integrity": "sha1-kDQkj1b0OYBMH9RaPL6Bley2CPE=", + "requires": { + "is-function": "^1.0.1", + "is-nil": "^1.0.0", + "is-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trials": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trials/-/trials-1.0.0.tgz", + "integrity": "sha1-ip+6KajXypcV6/TdtSoCgvaKgfw=" + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "twemoji": { + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-12.1.6.tgz", + "integrity": "sha512-FIKi9Jne5IiDGDWekoANJ1a8ltUKVbJLEIR8XUpbFRDMqIPgLWnYgjeWZ1KOrdiTztRCAa9x4v+5w5OuiJOGVw==", + "requires": { + "fs-extra": "^8.0.1", + "jsonfile": "^5.0.0", + "twemoji-parser": "12.1.3", + "universalify": "^0.1.2" + } + }, + "twemoji-parser": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-12.1.3.tgz", + "integrity": "sha512-ND4LZXF4X92/PFrzSgGkq6KPPg8swy/U0yRw1k/+izWRVmq1HYi3khPwV3XIB6FRudgVICAaBhJfW8e8G3HC7Q==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.1.tgz", + "integrity": "sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml2js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", + "requires": { + "sax": "0.5.x" + }, + "dependencies": { + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + } + } + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "youtube-search": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/youtube-search/-/youtube-search-1.1.6.tgz", + "integrity": "sha512-AgDClD3KTJph0oA3QNypUpZH8qUJM2hevQAzIbpQ+gEYaqdIKUgBqhfciZ7ureOH+NSK7X9gYDo2tbvE46n7UA==", + "requires": { + "axios": "^0.21.1", + "xml2js": "~0.2.8" + }, + "dependencies": { + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "requires": { + "follow-redirects": "^1.10.0" + } + } + } + }, + "zalgo": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/zalgo/-/zalgo-0.0.1.tgz", + "integrity": "sha1-P7WLVkT2YTFC8LDJ6bxLfijCOus=", + "requires": { + "colors": "0.5.x" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=" + } + } + }, + "zalgolize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/zalgolize/-/zalgolize-1.2.4.tgz", + "integrity": "sha1-r1QkPJ4E6mjNOPcFHxCsS0RF9fY=", + "requires": { + "minimist": "^1.2.0", + "trials": "^1.0.0" + } + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..3a00dab4 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "main": "shard.js", + "scripts": { + "node": "node shard.js", + "dev": "nodemon shard.js", + "lavalink": "java -jar Lavalink.jar" + }, + "devDependencies": { + "eslint": "^7.6.0", + "eslint-config-tesseract": "^0.0.3" + }, + "dependencies": { + "@top-gg/sdk": "^3.0.8", + "ascii-table": "0.0.9", + "axios": "^0.21.1", + "body-parser": "^1.19.0", + "canvacord": "^5.0.8", + "canvas": "^2.7.0", + "chalk": "^4.1.0", + "chatcord": "0.0.5", + "common-tags": "^1.8.0", + "crypto": "^1.0.1", + "datadog-metrics": "^0.8.2", + "date-and-time": "^0.14.2", + "dblapi.js": "^2.4.1", + "discord.js": "^12.5.1", + "discord.js-light": "^3.5.9", + "ejs": "^3.1.6", + "express": "^4.17.1", + "express-session": "^1.17.1", + "ffbinaries": "^1.1.4", + "figlet": "^1.5.0", + "fs": "0.0.2", + "generate-password": "^1.6.0", + "he": "^1.2.0", + "intl": "^1.2.5", + "memorystore": "^1.6.5", + "moment": "^2.27.0", + "moment-duration-format": "^2.3.2", + "mongoose": "^5.12.2", + "ms": "^2.1.2", + "nanoid": "^3.1.20", + "nanoid-dictionary": "^4.2.0", + "node-fetch": "^2.6.1", + "node-os-utils": "^1.3.2", + "nodemon": "^2.0.4", + "parse-ms": "^2.1.0", + "passport": "^0.4.1", + "passport-discord": "^0.1.4", + "random": "^2.2.0", + "random-email": "^1.0.3", + "randomstrings": "0.0.2", + "randostrings": "^0.1.6", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "shortid": "^2.2.16", + "snekfetch": "^4.0.4", + "statcord.js": "^3.1.7", + "superagent": "^6.1.0", + "tiktok-scraper": "^1.4.12", + "uniqid": "^5.3.0", + "uuid": "^8.3.0", + "voucher-code-generator": "^1.1.1", + "winston": "^3.3.3", + "youtube-search": "^1.1.6", + "zalgo": "0.0.1", + "zalgolize": "^1.2.4" + }, + "name": "pogy", + "version": "1.0.0", + "author": "", + "license": "ISC", + "keywords": [], + "description": "" +} diff --git a/packages/level/index.js b/packages/level/index.js new file mode 100644 index 00000000..b30f49dd --- /dev/null +++ b/packages/level/index.js @@ -0,0 +1,297 @@ +const mongoose = require("mongoose"); +const levels = require("./models/levels.js"); +var mongoUrl; + +class level { + + /** + * @param {string} [dbUrl] - A valid mongo database URI. + */ + + static async setURL(dbUrl) { + if (!dbUrl) throw new TypeError("A database url was not provided."); + mongoUrl = dbUrl; + return mongoose.connect(dbUrl, { + useNewUrlParser: true, + useUnifiedTopology: true + }); + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + */ + + static async createUser(userId, guildId) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + + const isUser = await levels.findOne({ userID: userId, guildID: guildId }); + if (isUser) return false; + + const newUser = new levels({ + userID: userId, + guildID: guildId + }); + + await newUser.save().catch(e => console.log(`Failed to create user: ${e}`)); + + return newUser; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + */ + + static async deleteUser(userId, guildId) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + await levels.findOneAndDelete({ userID: userId, guildID: guildId }).catch(e => console.log(`Failed to delete user: ${e}`)); + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [xp] - Amount of xp to append. + */ + + static async addXp(userId, guildId, xp) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (xp !== 0 && !xp) throw new TypeError("An amount of xp was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + + if (!user) { + const newUser = new levels({ + userID: userId, + guildID: guildId, + xp: xp, + level: Math.floor(0.1 * Math.sqrt(xp)) + }); + + await newUser.save().catch(e => console.log(`Failed to save new user.`)); + + return (Math.floor(0.1 * Math.sqrt(xp)) > 0); + }; + + user.xp += parseInt(xp, 10); + user.level = Math.floor(0.1 * Math.sqrt(user.xp)); + + await user.save().catch(e => console.log(`Failed to append xp: ${e}`) ); + + return (Math.floor(0.1 * Math.sqrt(user.xp -= xp)) < user.level); + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [levels] - Amount of levels to append. + */ + + static async addLevel(userId, guildId, levelss) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!levelss) throw new TypeError("An amount of levels was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + user.level += parseInt(levelss, 10); + user.xp = user.level * user.level * 100; + + user.save().catch(e => console.log(`Failed to append level: ${e}`) ); + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [xp] - Amount of xp to set. + */ + + static async setXp(userId, guildId, xp) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (xp !== 0 && !xp) throw new TypeError("An amount of xp was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + user.xp = xp; + user.level = Math.floor(0.1 * Math.sqrt(user.xp)); + + user.save().catch(e => console.log(`Failed to set xp: ${e}`) ); + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [level] - A level to set. + */ + + static async setLevel(userId, guildId, level) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!level) throw new TypeError("A level was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + user.level = level; + user.xp = level * level * 100; + + user.save().catch(e => console.log(`Failed to set level: ${e}`) ); + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + */ + + static async fetch(userId, guildId, fetchPosition = false) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + + const user = await levels.findOne({ + userID: userId, + guildID: guildId + }); + if (!user) return false; + + if (fetchPosition === true) { + const leaderboard = await levels.find({ + guildID: guildId + }).sort([['xp', 'descending']]).exec(); + + user.position = leaderboard.findIndex(i => i.userID === userId) + 1; + } + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [xp] - Amount of xp to subtract. + */ + + static async subtractXp(userId, guildId, xp) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (xp !== 0 && !xp) throw new TypeError("An amount of xp was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + user.xp -= xp; + user.level = Math.floor(0.1 * Math.sqrt(user.xp)); + + + user.save().catch(e => console.log(`Failed to subtract xp: ${e}`) ); + + return user; + } + + /** + * @param {string} [userId] - Discord user id. + * @param {string} [guildId] - Discord guild id. + * @param {number} [levels] - Amount of levels to subtract. + */ + + static async subtractLevel(userId, guildId, levelss) { + if (!userId) throw new TypeError("An user id was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!levelss) throw new TypeError("An amount of levels was not provided."); + + const user = await levels.findOne({ userID: userId, guildID: guildId }); + if (!user) return false; + + user.level -= levelss; + user.xp = user.level * user.level * 100; + + user.save().catch(e => console.log(`Failed to subtract levels: ${e}`) ); + + return user; + } + + /** + * @param {string} [guildId] - Discord guild id. + * @param {number} [limit] - Amount of maximum enteries to return. + */ + + + static async fetchLeaderboard(guildId, limit) { + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!limit) throw new TypeError("A limit was not provided."); + + var users = await levels.find({ guildID: guildId }).sort([['xp', 'descending']]).exec(); + + return users.slice(0, limit); + } + + /** + * @param {string} [client] - Your Discord.CLient. + * @param {array} [leaderboard] - The output from 'fetchLeaderboard' function. + */ + + static async computeLeaderboard(client, leaderboard, fetchUsers = false) { + if (!client) throw new TypeError("A client was not provided."); + if (!leaderboard) throw new TypeError("A leaderboard id was not provided."); + + if (leaderboard.length < 1) return []; + + const computedArray = []; + + if (fetchUsers) { + for (const key of leaderboard) { + const user = await client.users.fetch(key.userID) || { username: "Unknown", discriminator: "0000" }; + computedArray.push({ + guildID: key.guildID, + userID: key.userID, + xp: key.xp, + level: key.level, + position: (leaderboard.findIndex(i => i.guildID === key.guildID && i.userID === key.userID) + 1), + username: user.username, + discriminator: user.discriminator + }); + } + } else { + leaderboard.map(key => computedArray.push({ + guildID: key.guildID, + userID: key.userID, + xp: key.xp, + level: key.level, + position: (leaderboard.findIndex(i => i.guildID === key.guildID && i.userID === key.userID) + 1), + username: client.users.cache.get(key.userID) ? client.users.cache.get(key.userID).username : "Unknown", + discriminator: client.users.cache.get(key.userID) ? client.users.cache.get(key.userID).discriminator : "0000" + })); + } + + return computedArray; + } + + /* + * @param {number} [targetLevel] - Xp required to reach that level. + */ + static xpFor (targetLevel) { + if (isNaN(targetLevel) || isNaN(parseInt(targetLevel, 10))) throw new TypeError("Target level should be a valid number."); + if (isNaN(targetLevel)) targetLevel = parseInt(targetLevel, 10); + if (targetLevel < 1) throw new RangeError("Target level should be a positive number."); + return targetLevel * targetLevel * 100; + } +} + +module.exports = level; \ No newline at end of file diff --git a/packages/level/models/levels.js b/packages/level/models/levels.js new file mode 100644 index 00000000..1ec94498 --- /dev/null +++ b/packages/level/models/levels.js @@ -0,0 +1,11 @@ +const mongoose = require("mongoose"); + +const LevelSchema = new mongoose.Schema({ + userID: { type: String }, + guildID: { type: String }, + xp: { type: Number, default: 0 }, + level: { type: Number, default: 0 }, + lastUpdated: { type: Date, default: new Date() } +}); + +module.exports = mongoose.model('Levels', LevelSchema); \ No newline at end of file diff --git a/packages/logs/index.js b/packages/logs/index.js new file mode 100644 index 00000000..7efddc0b --- /dev/null +++ b/packages/logs/index.js @@ -0,0 +1,96 @@ +module.exports = async function (channel, message, options) { + const init = new Promise(async resolve => { // Create Promise + async function sendHook(hook, message, options) { + + // Check for Embed + if (typeof message !== 'string' && ['RichEmbed', 'MessageEmbed'].includes(message.constructor.name)) { + options.embeds = [message]; + message = null; + } + + // Send Webhook + if ((options.mentions || true) !== false) { + + let callback = await hook.send(message, { + username: options.name, + avatarURL: options.icon, + embeds: options.embeds + }); + + resolve(callback); + + } else { + let callback = await hook.send(message, { + username: options.name, + avatarURL: options.icon, + embeds: options.embeds, + allowedMentions: { parse: [] } + }); + resolve(callback); + } + + + + } + + async function fallback(channel, message, timer) { + + // Configure Channel + channel = channel.channel || channel; + + // Send Embed + let callback = await channel.send(message) + + // Run Options + if (timer) callback.delete({ + timeout: timer + }) + + resolve(callback); + + } + + // Verify Input + if (!channel) return console.log('HOOK: Please read the NPM page for documentation.') + + // Configure Channel + channel = channel.channel || channel; + + // Return Statements + if (!channel.send || !channel.fetchWebhooks) return console.log('HOOK: Invalid Channel.'); + if (!message) return console.log('HOOK: Invalid Message.'); + + // Configure Settings + if (!options) options = {}; + options = { + delete: options.delete || false, + color: options.color || null, + name: options.name || 'Message', + icon: options.icon || undefined + } + if (isNaN(options.delete)) options.delete = false; + + // Fetch Webhooks + let sended = false; + let webhooks = await channel.fetchWebhooks().catch(err => { + sended = true; + fallback(channel, message, options.delete) + }); + if(sended) return; + + // Assign Webhook + let hook = webhooks.find(w => w.name === 'https://pogy.xyz') + if (!hook) { + try { + hook = await channel.createWebhook('https://pogy.xyz', { + avatar: `https://pogy.xyz/logo.png` + }); + } catch (e) { + hook = await channel.createWebhook('https://pogy.xyz', `https://pogy.xyz/logo.png`); + } + return sendHook(hook, message, options); + } + sendHook(hook, message, options); + }) + return init; +} \ No newline at end of file diff --git a/packages/reactionrole/index.js b/packages/reactionrole/index.js new file mode 100644 index 00000000..96f5de30 --- /dev/null +++ b/packages/reactionrole/index.js @@ -0,0 +1,163 @@ + +const mongoose = require("mongoose"); +const serverset = require("./models/schema.js"); + +module.exports = class react { + + /** + * @param {string} [dbUrl] - A valid mongo database URI. + */ + + async setURL(dbUrl) { + if (!dbUrl) throw new TypeError("A database url was not provided."); + + return mongoose.connect(dbUrl, { + useNewUrlParser: true, + useUnifiedTopology: true + }); + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [roleid] - Discord guild id. + * @param {string} [emoji] - on which emoji u would get the role + * @param {Boolean} [dm] - Discord guild id. + */ + + async reactionCreate(client, guildId, msgid, roleid, emoji, dm, option) { + if (!client) throw new TypeError("An client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + if(!roleid) throw new TypeError("A role id was not provided."); + dm = dm ? dm : false ; + if(!option) option = 1 + + const issame = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji , roleid: roleid}); + if (issame) return false; + + const newRR = new serverset({ + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: roleid, + dm: dm, + option: option + }); + + await newRR.save().catch(e => console.log(`Failed to create reaction role: ${e}`)); + client.react.set(msgid+emoji, { + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: roleid, + dm: dm, + option: option + }); + return newRR; + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [emoji] - on which emoji u would get the role + */ + + async reactionDelete(client, guildId , msgid, emoji) { + if (!client) throw new TypeError("An client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + + + const reactionRole = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji }); + if (!reactionRole) return false; + + await serverset.findOneAndDelete({guildid: guildId , msgid: msgid , reaction: emoji, option: reactionRole.option }).catch(e => console.log(`Failed to delete reaction: ${e}`)); + + client.react.delete(msgid+emoji); + + + return reactionRole; + + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [newroleid] - Discord guild id. + * @param {string} [emoji] - on which emoji u would get the role + */ + + async reactionEdit(client, guildId , msgid, newroleid , emoji, newoption) { + if (!client) throw new TypeError("An client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + if(!newroleid) throw new TypeError("A role id was not provided."); + if(!newoption) newoption = 1 + + const reactionRole = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji }); + if (!reactionRole) return false; + reactionRole.roleid= newroleid; + + await reactionRole.save().catch(e => console.log(`Failed to save new prefix: ${e}`) ); + client.react.set(msgid+emoji, { + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: newroleid, + dm: reactionRole.dm, + option: reactionRole.option + }); + return; + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - Discord guild id. + * @param {string} [emoji] - Discord guild id. + */ + + async reactionFetch(client, guildId ,msgid , emoji) { + if (!client) throw new TypeError("A client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if(!client.fetchforguild.has(guildId)){ + let allrole = await serverset.find({guildid: guildId}).sort([['guildid', 'descending']]).exec(); + let i = 0; + for(i ; i < Object.keys(allrole).length; i++){ + await client.react.set(allrole[i].msgid+allrole[i].reaction, { + guildid: allrole[i].guildid, + msgid: allrole[i].msgid, + reaction: allrole[i].reaction , + roleid: allrole[i].roleid, + dm: allrole[i].dm + }); + } + client.fetchforguild.set(guildId, { + guildid: guildId, + totalreactions: Object.keys(allrole).length + }); + } + return client.react.get(msgid + emoji); + } + +/** +* @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches +*/ +async reactionFetchAll(client) { + if (!client) throw new TypeError("An client was not provided."); + let all = await serverset.find({}).sort([['guildid', 'descending']]).exec(); + + return all; + } + + +} + +//module.exports = react; \ No newline at end of file diff --git a/packages/reactionrole/models/schema.js b/packages/reactionrole/models/schema.js new file mode 100644 index 00000000..1b2d8909 --- /dev/null +++ b/packages/reactionrole/models/schema.js @@ -0,0 +1,14 @@ +const mongoose = require("mongoose"); + +const reactionSchema = new mongoose.Schema({ + + guildid: { type: String }, + msgid: { type: String}, + roleid: { type: String}, + reaction: { type: String }, + dm: {type: Boolean }, + option: { type: Number } + +}); + +module.exports = mongoose.model('reaction', reactionSchema); \ No newline at end of file diff --git a/plugins/reddit.js b/plugins/reddit.js new file mode 100644 index 00000000..e69de29b diff --git a/shard.js b/shard.js new file mode 100644 index 00000000..63f9431b --- /dev/null +++ b/shard.js @@ -0,0 +1,17 @@ +const config = require('./config.json'); +const logger = require('./utils/logger'); +const Discord = require('discord.js'); +const Statcord = require("statcord.js"); +const { token } = require('./utils/variables.js'); + + +const manager = new Discord.ShardingManager('./index.js', { + token: token, + //autoSpawn: true, + //totalShards: 'auto' + totalShards: 1 +}); + +manager.spawn(); + +manager.on('shardCreate', shard => logger.info(`Launching Shard ${shard.id + 1}`, { label: `Shard` })); diff --git a/structures/Command.js b/structures/Command.js new file mode 100644 index 00000000..657291f4 --- /dev/null +++ b/structures/Command.js @@ -0,0 +1,30 @@ +const { Permissions } = require('discord.js'); + +module.exports = class Command { + constructor(client, name, options = {}) { + this.client = client; + this.name = options.name || name; + this.aliases = options.aliases || []; + this.description = options.description || "No description provided."; + this.category = options.category || "General"; + this.usage = `${this.name} ${options.usage || ''}` || "No usage provided."; + this.examples = options.examples || []; + this.disabled = options.disabled || false; + this.cooldown = "cooldown" in options ? options.cooldown : 5 || 5; + this.ownerOnly = options.ownerOnly || false; + this.guildOnly = options.guildOnly || false; + this.nsfwOnly = options.nsfwOnly || false; + this.botPermission = options.botPermission || ['SEND_MESSAGES', 'EMBED_LINKS']; + this.userPermission = options.userPermission || null; + + } + + // eslint-disable-next-line no-unused-vars + async run(message, args) { + throw new Error(`The run method has not been implemented in ${this.name}`); + } + + reload() { + return this.store.load(this.file.path); + } +} \ No newline at end of file diff --git a/structures/Event.js b/structures/Event.js new file mode 100644 index 00000000..f253a25d --- /dev/null +++ b/structures/Event.js @@ -0,0 +1,18 @@ +module.exports = class Event { + constructor(client, name, options = {}) { + this.name = name; + this.partials = ['MESSAGE', 'CHANNEL', 'REACTION', 'GUILD_MEMBER', 'USER', 'GUILD_MESSAGE_REACTIONS'], + this.client = client; + this.type = options.once ? 'once' : 'on'; + this.emitter = (typeof options.emitter === 'string' ? this.client[options.emitter] : options.emitter) || this.client; + } + + // eslint-disable-next-line no-unused-vars + async run(message, args) { + throw new Error(`The run method has not been implemented in ${this.name}`); + } + + reload() { + return this.store.load(this.file.path); + } +}; \ No newline at end of file diff --git a/structures/Pogyembed.js b/structures/Pogyembed.js new file mode 100644 index 00000000..a8792a72 --- /dev/null +++ b/structures/Pogyembed.js @@ -0,0 +1,47 @@ +const { MessageEmbed } = require('discord.js'); + +const ZWS = ' \u200B'; + +module.exports = class PogyEmbed extends MessageEmbed { + + splitFields(contentOrTitle, rawContent) { + if (typeof contentOrTitle === 'undefined') return this; + + let title; + let content; + if (typeof rawContent === 'undefined') { + title = ZWS; + content = contentOrTitle; + } else { + title = contentOrTitle; + content = rawContent; + } + + if (Array.isArray(content)) content = content.join('\n'); + if (title === ZWS && !this.description&& content.length < 2048) { + this.description === content; + return this; + } + + // eslint-disable-next-line if-length + let x; + let slice; + while (content.length) { + if (content.length < 1024) { + this.fields.push({ name: title, value: content, inline: false }); + return this; + } + + slice = content.slice(0, 1024); + x = slice.lastIndexOf('\n'); + if (x === -1) x = slice.lastIndexOf(''); + if (x === -1) x = 1024; + + this.fields.push({ name: title, value: content.trim().slice(0, x), inline: false }); + content = content.slice(x + 1); + title = ZWS; + } + return this; + } + +}; \ No newline at end of file diff --git a/structures/Util.js b/structures/Util.js new file mode 100644 index 00000000..3b63b643 --- /dev/null +++ b/structures/Util.js @@ -0,0 +1,92 @@ +const fs = require('fs').promises; +const path = require('path'); +const Command = require('./Command.js'); +const Event = require('./Event.js'); +const fetch = require('node-fetch'); +const logger = require('../utils/logger'); + +module.exports = class Util { + + constructor(client) { + this.client = client; + } + + isClass(input) { + return typeof input === 'function' && + typeof input.prototype === 'object' && + input.toString().substring(0, 5) === 'class'; + } + + trimArray(arr, maxLen = 10) { + if (arr.length > maxLen) { + const len = arr.length - maxLen; + arr = arr.slice(0, maxLen); + arr.push(`${len} more...`); + } + return arr; + } + + get directory() { + return `${path.dirname(require.main.filename)}${path.sep}`; + } + + removeDuplicates(arr) { + return [...new Set(arr)]; + } + + capitalise(string) { + return string + .split(" ") + .map((str) => str.slice(0, 1).toUpperCase() + str.slice(1)) + .join(" "); + } + + async *loadFiles(dir) { + const files = await fs.readdir(dir); + for (const file of files) { + const pathToFile = path.join(dir, file); + const isDirectory = (await fs.stat(pathToFile)).isDirectory(); + if (isDirectory) { + yield* this.loadFiles(pathToFile); + } else { + yield pathToFile; + } + } + } + + async loadCommands() { + let success = 0 + let failed = 0 + + for await (const commandFile of this.loadFiles(`${this.directory}commands`)) { + delete require.cache[commandFile]; + const { name } = path.parse(commandFile); + const File = require(commandFile) + if (!this.isClass(File)) throw new TypeError(`Command ${name} doesn't export a class.`); + const command = new File(this.client, name.toLowerCase()); + if (!(command instanceof Command)) throw new TypeError(`Comamnd ${name} doesnt belong in Commands.`); + this.client.commands.set(command.name, command) + + if (command.aliases.length) { + for (const alias of command.aliases) { + this.client.aliases.set(alias, command.name); + } + } + } + } + + async loadEvents() { + for await (const eventFile of this.loadFiles(`${this.directory}events`)) { + delete require.cache[eventFile]; + const { name } = path.parse(eventFile); + const File = require(eventFile); + if (!this.isClass(File)) throw new TypeError(`Event ${name} doesn't export a class!`); + const event = new File(this.client, name); + if (!(event instanceof Event)) throw new TypeError(`Event ${name} doesn't belong in Events`); + this.client.events.set(event.name, event); + //logger.info(`✅ loaded: ${event.name}`, { label: 'Events' }) + event.emitter[event.type](name, (...args) => event.run(...args)); + } + } + +}; \ No newline at end of file diff --git a/structures/jointocreate.js b/structures/jointocreate.js new file mode 100644 index 00000000..d760a859 --- /dev/null +++ b/structures/jointocreate.js @@ -0,0 +1,152 @@ +const Vc = require('../database/schemas/tempvc'); +const Logging = require('../database/schemas/logging'); +const jointocreatemap = new Map(); +module.exports = function (client) { + + + client.on("voiceStateUpdate", async(oldState, newState) => { + + +if(!oldState || !newState) return; + + + + + + let oldparentname = "unknown" + let oldchannelname = "unknown" + let oldchanelid = "unknown" + if (oldState && oldState.channel && oldState.channel.parent && oldState.channel.parent.name) oldparentname = oldState.channel.parent.name + if (oldState && oldState.channel && oldState.channel.name) oldchannelname = oldState.channel.name + if (oldState && oldState.channelID) oldchanelid = oldState.channelID + let newparentname = "unknown" + let newchannelname = "unknown" + let newchanelid = "unknown" + if (newState && newState.channel && newState.channel.parent && newState.channel.parent.name) newparentname = newState.channel.parent.name + if (newState && newState.channel && newState.channel.name) newchannelname = newState.channel.name + if (newState && newState.channelID) newchanelid = newState.channelID + if (oldState.channelID && oldState.channel) { + if (typeof oldState.channel.parent !== "undefined") oldChannelName = `${oldparentname}\n\t**${oldchannelname}**\n*${oldchanelid}*` + else oldChannelName = `-\n\t**${oldparentname}**\n*${oldchanelid}*` + } + if (newState.channelID && newState.channel) { + if (typeof newState.channel.parent !== "undefined") newChannelName = `${newparentname}\n\t**${newchannelname}**\n*${newchanelid}*` + else newChannelName = `-\n\t**${newchannelname}**\n*${newchanelid}*` + } + + const vcDB = await Vc.findOne({ + guildId: oldState.guild.id || newState.guild.id + }) + + + if(!vcDB) return; + + + let voice = vcDB.channelID; + + let category = vcDB.categoryID; + + + + if(!voice || !category ) return; + + + + if (!oldState.channelID && newState.channelID) { + if(newState.channelID !== voice) return; + jointocreatechannel(newState); + } + + if (oldState.channelID && !newState.channelID) { + + if (jointocreatemap.get(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`)) { + + var vc = oldState.guild.channels.cache.get(jointocreatemap.get(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`)); + + if (vc.members.size < 1) { + + jointocreatemap.delete(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`); + + + + return vc.delete().catch(() => {}) + } + else { + } + } + } + + if (oldState.channelID && newState.channelID) { + + if (oldState.channelID !== newState.channelID) { + + if(newState.channelID=== voice) + + jointocreatechannel(oldState); + + if (jointocreatemap.get(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`)) { + + var vc = oldState.guild.channels.cache.get(jointocreatemap.get(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`)); + + if (vc.members.size < 1) { + + jointocreatemap.delete(`tempvoicechannel_${oldState.guild.id}_${oldState.channelID}`); + + + + return vc.delete().catch(() => {}) + } + else { + } + } + } +} + }) + async function jointocreatechannel(user) { + try { + const vcDB = await Vc.findOne({ + guildId: user.guild.id + }) + if(!vcDB) return; + + let category = vcDB.categoryID + if(!category ) return; + + + await user.guild.channels.create(`${user.member.user.username}'s Room`, { + type: 'voice', + parent: category, + }).then(async vc => { + + + + user.setChannel(vc).catch(() => {}) + + jointocreatemap.set(`tempvoicechannel_${vc.guild.id}_${vc.id}`, vc.id); + + await vc.overwritePermissions([ + { + id: user.id, + allow: ['MANAGE_CHANNELS'], + }, + { + id: user.guild.id, + allow: ['VIEW_CHANNEL'], + }, + ]); + }) + } catch (err) { + + let vcDB = await Vc.findOne({ + guildId: user.guild.id + }) + + vcDB.updateOne({ + channelID: null, + categoryID: null + }).catch(err => console.error(err)); + } + } +} + + diff --git a/utils/MiscUtils.js b/utils/MiscUtils.js new file mode 100644 index 00000000..607dd5ab --- /dev/null +++ b/utils/MiscUtils.js @@ -0,0 +1,26 @@ +const moment = require('moment') +const Intl = require('intl') +Intl.__disableRegExpRestore() + +module.exports = class MiscUtils { + static findArrayDuplicates (arr) { + return arr.filter((value, index) => { + return arr.indexOf(value) !== index + }) + } + + static formatNumber (value, language) { + const formatter = new Intl.NumberFormat(language) + return formatter.format(value) + } + + static formatDuration (duration) { + return moment.duration(duration).format('hh:mm:ss', { stopTrim: 'm' }) + } + + static capitalizeFirstLetter (string, everyWord = false) { + const capitalizeWord = w => w.charAt(0).toUpperCase() + w.slice(1) + if (everyWord) return string.split(' ').map(capitalizeWord).join(' ') + return capitalizeWord(string) + } +} \ No newline at end of file diff --git a/utils/Progress.js b/utils/Progress.js new file mode 100644 index 00000000..f5aa0a98 --- /dev/null +++ b/utils/Progress.js @@ -0,0 +1,254 @@ +/** + * @file node-progress + * @copyright 2011 TJ Holowaychuk + * @license GPL-3.0 + */ + +/** + * Expose `ProgressBar`. + */ + +exports = module.exports = ProgressBar; + +/** + * Initialize a `ProgressBar` with the given `fmt` string and `options` or + * `total`. + * + * Options: + * + * - `curr` current completed index + * - `total` total number of ticks to complete + * - `width` the displayed width of the progress bar defaulting to total + * - `stream` the output stream defaulting to stderr + * - `head` head character defaulting to complete character + * - `complete` completion character defaulting to "=" + * - `incomplete` incomplete character defaulting to "-" + * - `renderThrottle` minimum time between updates in milliseconds defaulting to 16 + * - `callback` optional function to call when the progress bar completes + * - `clear` will clear the progress bar upon termination + * + * Tokens: + * + * - `:bar` the progress bar itself + * - `:current` current tick number + * - `:total` total ticks + * - `:elapsed` time elapsed in seconds + * - `:percent` completion percentage + * - `:eta` eta in seconds + * - `:rate` rate of ticks per second + * + * @function ProgressBar + * @param {string} fmt the string with the formatting tokens + * @param {object|number} options the options for the progress bar + * @returns {void} + * @api public + */ +function ProgressBar(fmt, options) { + this.stream = options.stream || process.stderr; + + if (typeof(options) === 'number') { + let total = options; + options = {}; + options.total = total; + } + else { + options = options || {}; + if (typeof fmt !== 'string') { + throw new Error('format required'); + } + if (typeof options.total !== 'number') { + throw new Error('total required'); + } + } + + this.fmt = fmt; + this.curr = options.curr || 0; + this.total = options.total; + this.width = options.width || this.total; + this.clear = options.clear; + this.chars = { + complete : options.complete || '=', + incomplete : options.incomplete || '-', + head : options.head || (options.complete || '=') + }; + this.renderThrottle = options.renderThrottle !== 0 ? (options.renderThrottle || 16) : 0; + this.callback = options.callback || function () {}; + this.tokens = {}; + this.lastDraw = ''; +} + +/** + * "tick" the progress bar with optional `len` and optional `tokens`. + * + * @param {number|object} len or tokens + * @param {object} tokens + * @api public + */ + +ProgressBar.prototype.tick = function (len, tokens) { + if (len !== 0) { + len = len || 1; + } + + // swap tokens + if (typeof len === 'object') { + tokens = len, len = 1; + } + if (tokens) { + this.tokens = tokens; + } + + // start time for eta + if (this.curr === 0) { + this.start = new Date; + } + + this.curr += len; + + // schedule render + if (!this.renderThrottleTimeout) { + this.renderThrottleTimeout = setTimeout(this.render.bind(this), this.renderThrottle); + } + + // progress complete + if (this.curr >= this.total) { + if (this.renderThrottleTimeout) { + this.render(); + } + this.complete = true; + this.terminate(); + this.callback(this); + } +}; + +/** + * Method to render the progress bar with optional `tokens` to place in the + * progress bar's `fmt` field. + * + * @param {object} tokens + * @api public + */ + +ProgressBar.prototype.render = function (tokens) { + clearTimeout(this.renderThrottleTimeout); + this.renderThrottleTimeout = null; + + if (tokens) { + this.tokens = tokens; + } + + if (!this.stream.isTTY) { + return; + } + + let ratio = this.curr / this.total; + ratio = Math.min(Math.max(ratio, 0), 1); + + let percent = ratio * 100; + let incomplete, complete, completeLength; + let elapsed = new Date - this.start; + let eta = (percent === 100) ? 0 : elapsed * (this.total / this.curr - 1); + let rate = this.curr / (elapsed / 1000); + + /* populate the bar template with percentages and timestamps */ + let str = this.fmt. + replace(':current', this.curr). + replace(':total', this.total). + replace(':elapsed', isNaN(elapsed) ? '0.0' : (elapsed / 1000).toFixed(1)). + replace(':eta', (isNaN(eta) || !isFinite(eta)) ? '0.0' : (eta / 1000).toFixed(1)). + replace(':percent', `${percent.toFixed(0)}%`). + replace(':rate', Math.round(rate)); + + /* compute the available space (non-zero) for the bar */ + let availableSpace = Math.max(0, this.stream.columns - str.replace(':bar', '').length); + if (availableSpace && process.platform === 'win32'){ + availableSpace = availableSpace - 1; + } + + let width = Math.min(this.width, availableSpace); + + /* TODO: the following assumes the user has one ':bar' token */ + completeLength = Math.round(width * ratio); + complete = Array(Math.max(0, completeLength + 1)).join(this.chars.complete); + incomplete = Array(Math.max(0, width - completeLength + 1)).join(this.chars.incomplete); + + /* add head to the complete string */ + if (completeLength > 0) { + complete = complete.slice(0, -1) + this.chars.head; + } + + /* fill in the actual progress bar */ + str = str.replace(':bar', complete + incomplete); + + /* replace the extra tokens */ + if (this.tokens) { + for (let key in this.tokens) { + str = str.replace(`:${key}`, this.tokens[key]); + } + } + + if (this.lastDraw !== str) { + // this.stream.cursorTo(0); + // this.stream.write(str); + // this.stream.clearLine(1); + this.lastDraw = str; + } +}; + +/** + * "update" the progress bar to represent an exact percentage. + * The ratio (between 0 and 1) specified will be multiplied by `total` and + * floored, representing the closest available "tick." For example, if a + * progress bar has a length of 3 and `update(0.5)` is called, the progress + * will be set to 1. + * + * A ratio of 0.5 will attempt to set the progress to halfway. + * + * @param {number} ratio The ratio (between 0 and 1 inclusive) to set the + * overall completion to. + * @api public + */ + +ProgressBar.prototype.update = function (ratio, tokens) { + let goal = Math.floor(ratio * this.total); + let delta = goal - this.curr; + + this.tick(delta, tokens); +}; + +/** + * "interrupt" the progress bar and write a message above it. + * @param {string} message The message to write. + * @api public + */ + +ProgressBar.prototype.interrupt = function (message) { + // clear the current line + this.stream.clearLine(); + // move the cursor to the start of the line + this.stream.cursorTo(0); + // write the message text + this.stream.write(message); + // terminate the line after writing the message + this.stream.write('\n'); + // re-display the progress bar with its lastDraw + this.stream.write(this.lastDraw); +}; + +/** + * Terminates a progress bar. + * + * @api public + */ + +ProgressBar.prototype.terminate = function () { + if (this.clear) { + if (this.stream.clearLine) { + this.stream.clearLine(); + this.stream.cursorTo(0); + } + } + else { + // this.stream.write('\n'); + } +}; \ No newline at end of file diff --git a/utils/Reddit.js b/utils/Reddit.js new file mode 100644 index 00000000..2cb307e7 --- /dev/null +++ b/utils/Reddit.js @@ -0,0 +1,8 @@ +const fetch = require('node-fetch') + +module.exports = class Reddit { + static async getRandomPostFromSubreddit (subReddit) { + let body = await fetch(`https://reddit.com/r/${subReddit}/random.json`).then(res => res.json()) + return body[0] && body[0].data.children[0].data + } +} \ No newline at end of file diff --git a/utils/logger.js b/utils/logger.js new file mode 100644 index 00000000..615d38a9 --- /dev/null +++ b/utils/logger.js @@ -0,0 +1,38 @@ +const { createLogger, format, transports } = require('winston'); +const { combine, timestamp, label, printf } = format; +const Discord = require('discord.js'); +const webhookClient = new Discord.WebhookClient('', ''); +const chalk = require('chalk'); +const config = require('./../config.json'); + +const myFormat = printf(({ level, message, label, timestamp }) => { + webhookClient.send(`${timestamp} [${label}] ${message}`) + return `${timestamp} [${level}] [${chalk.cyan(label)}] ${message}`; +}); + +const myCustomLevels = { + levels: { + error: 0, + warn: 1, + info: 2, + http: 3, + verbose: 4, + debug: 5, + silly: 6 + } +}; + +const logger = createLogger({ + levels: myCustomLevels.levels, + format: combine( + format.colorize(), + format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), + myFormat + ), + transports: [ + new transports.Console(), + new transports.File({ filename: './assets/logs/Pogy.log' }), + ], +}); + +module.exports = logger; \ No newline at end of file diff --git a/utils/mongoose.js b/utils/mongoose.js new file mode 100644 index 00000000..5e460f77 --- /dev/null +++ b/utils/mongoose.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose'); +const config = require('./../config.json'); +const { mongodb } = require('./variables'); +const logger = require('../utils/logger'); + +module.exports = { + init: () => { + const dbOptions = { + keepAlive: true, + useNewUrlParser: true, + useUnifiedTopology: true, + useCreateIndex: true, + }; + + if (!config.mongodb_url) logger.error(`Database failed to load - Required environment variable "mongodb_url" is not set.`, { label: 'Database' }) + mongoose.connect(mongodb, dbOptions) + .catch(e => { + logger.error(e.message, { label: 'Database' }) + this.database = null + }) + + mongoose.set('useFindAndModify', false); + mongoose.Promise = global.Promise; + + mongoose.connection.on('err', err => { + logger.error(`Mongoose connection error: ${err.stack}`, { label: 'Database' }) + }); + + mongoose.connection.on('disconnected', () => { + logger.error(`Mongoose connection lost`, { label: 'Database' }) + }); + } +} \ No newline at end of file diff --git a/utils/utils.js b/utils/utils.js new file mode 100644 index 00000000..482a607f --- /dev/null +++ b/utils/utils.js @@ -0,0 +1,143 @@ +const { MessageEmbed } = require('discord.js'); +const { stripIndent } = require('common-tags'); + +/** + * Capitalizes a string + * @param {string} string + */ +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +/** + * Removes specifed array element + * @param {Array} arr + * @param {*} value + */ +function removeElement(arr, value) { + var index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + } + return arr; +} + +/** + * Trims array down to specified size + * @param {Array} arr + * @param {int} maxLen + */ +function trimArray(arr, maxLen = 10) { + if (arr.length > maxLen) { + const len = arr.length - maxLen; + arr = arr.slice(0, maxLen); + arr.push(`and **${len}** more...`); + } + return arr; +} + +/** + * Trims joined array to specified size + * @param {Array} arr + * @param {int} maxLen + * @param {string} joinChar + */ +function trimStringFromArray(arr, maxLen = 2048, joinChar = '\n') { + let string = arr.join(joinChar); + const diff = maxLen - 15; // Leave room for "And ___ more..." + if (string.length > maxLen) { + string = string.slice(0, string.length - (string.length - diff)); + string = string.slice(0, string.lastIndexOf(joinChar)); + string = string + `\nAnd **${arr.length - string.split('\n').length}** more...`; + } + return string; +} + +/** + * Gets current array window range + * @param {Array} arr + * @param {int} current + * @param {int} interval + */ +function getRange(arr, current, interval) { + const max = (arr.length > current + interval) ? current + interval : arr.length; + current = current + 1; + const range = (arr.length == 1 || arr.length == current || interval == 1) ? `[${current}]` : `[${current} - ${max}]`; + return range; +} + + +/** + * Gets the ordinal numeral of a number + * @param {int} number + */ +function getOrdinalNumeral(number) { + number = number.toString(); + if (number === '11' || number === '12' || number === '13') return number + 'th'; + if (number.endsWith(1)) return number + 'st'; + else if (number.endsWith(2)) return number + 'nd'; + else if (number.endsWith(3)) return number + 'rd'; + else return number + 'th'; +} + +/** + * Gets the next moderation case number + * @param {Client} client + * @param {Guild} guild + */ +async function getCaseNumber(client, guild, modLog) { + + const message = (await modLog.messages.fetch({ limit: 100 })).filter(m => m.member === guild.me && + m.embeds[0] && + m.embeds[0].type == 'rich' && + m.embeds[0].footer && + m.embeds[0].footer.text && + m.embeds[0].footer.text.startsWith('Case') + ).first(); + + if (message) { + const footer = message.embeds[0].footer.text; + const num = parseInt(footer.split('#').pop()); + if (!isNaN(num)) return num + 1; + } + + return 1; +} + +/** + * Gets current status + * @param {...*} args + */ +function getStatus(...args) { + for (const arg of args) { + if (!arg) return 'disabled'; + } + return 'enabled'; +} + +/** + * Surrounds welcome/farewell message keywords with backticks + * @param {string} message + */ +function replaceKeywords(message) { + if (!message) return message; + else return message + .replace(/\?member/g, '`?member`') + .replace(/\?username/g, '`?username`') + .replace(/\?tag/g, '`?tag`') + .replace(/\?size/g, '`?size`'); +} + + + + +module.exports = { + capitalize, + removeElement, + trimArray, + trimStringFromArray, + getRange, + getOrdinalNumeral, + getCaseNumber, + getStatus +}; \ No newline at end of file diff --git a/utils/variables.js b/utils/variables.js new file mode 100644 index 00000000..f582082f --- /dev/null +++ b/utils/variables.js @@ -0,0 +1,16 @@ +const config = require("./../config.json"); +let token; +let mongodb; + +if (config.dev) { + token = config.token; + mongodb = config.mongodb_url; +} if (!config.dev) { + token = config.token + mongodb = config.mongodb_url + +}; + + + +module.exports = { config, token, mongodb }; \ No newline at end of file