· 6 years ago · Jun 08, 2019, 05:04 AM
1const Discord = require('discord.js')
2const client = new Discord.Client()
3const firebase = require("firebase");
4const config = require("./config.json");
5const AuthorID = '414622975598395398';
6const invites = {};
7const Canvas = require("canvas") // Contains the prefix, and token!
8const SQLite = require("better-sqlite3");
9const sql = new SQLite('./scores.sqlite');
10
11client.on("ready", () => {
12 // Check if the table "points" exists.
13 const table = sql.prepare("SELECT count(*) FROM sqlite_master WHERE type='table' AND name = 'scores';").get();
14 if (!table['count(*)']) {
15 // If the table isn't there, create it and setup the database correctly.
16 sql.prepare("CREATE TABLE scores (id TEXT PRIMARY KEY, user TEXT, guild TEXT, points INTEGER, level INTEGER);").run();
17 // Ensure that the "id" row is always unique and indexed.
18 sql.prepare("CREATE UNIQUE INDEX idx_scores_id ON scores (id);").run();
19 sql.pragma("synchronous = 1");
20 sql.pragma("journal_mode = wal");
21 }
22
23 // And then we have two prepared statements to get and set the score data.
24 client.getScore = sql.prepare("SELECT * FROM scores WHERE user = ? AND guild = ?");
25 client.setScore = sql.prepare("INSERT OR REPLACE INTO scores (id, user, guild, points, level) VALUES (@id, @user, @guild, @points, @level);");
26});
27
28
29client.on('message', async message => {
30 if (message.author.bot) return;
31 let score;
32 if (message.guild) {
33 score = client.getScore.get(message.author.id, message.guild.id);
34 if (!score) {
35 score = { id: `${message.guild.id}-${message.author.id}`, user: message.author.id, guild: message.guild.id, points: 0, level: 1 }
36 }
37 score.points++;
38 const curLevel = Math.floor(0.1 * Math.sqrt(score.points));
39 if(score.level < curLevel) {
40 score.level++;
41 message.reply(`You've leveled up to level **${curLevel}**! Ain't that dandy?`);
42 }
43 client.setScore.run(score);
44 }
45 if (message.content.indexOf(config.prefix) !== 0) return;
46
47 const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
48 const command = args.shift().toLowerCase();
49
50 if(command === "points") {
51 return message.reply(`You currently have ${score.points} points and are level ${score.level}!`);
52}
53
54 if(command === "give") {
55 // Limited to guild owner - adjust to your own preference!
56 if(!message.author.id === message.guild.owner) return message.reply("You're not the boss of me, you can't do that!");
57
58 const user = message.mentions.users.first() || client.users.get(args[0]);
59 if(!user) return message.reply("You must mention someone or give their ID!");
60
61 const pointsToAdd = parseInt(args[1], 10);
62 if(!pointsToAdd) return message.reply("You didn't tell me how many points to give...")
63
64 // Get their current points.
65 let userscore = client.getScore.get(user.id, message.guild.id);
66 // It's possible to give points to a user we haven't seen, so we need to initiate defaults here too!
67 if (!userscore) {
68 userscore = { id: `${message.guild.id}-${user.id}`, user: user.id, guild: message.guild.id, points: 0, level: 1 }
69 }
70 userscore.points += pointsToAdd;
71
72 // We also want to update their level (but we won't notify them if it changes)
73 let userLevel = Math.floor(0.1 * Math.sqrt(score.points));
74 userscore.level = userLevel;
75
76 // And we save it!
77 client.setScore.run(userscore);
78
79 return message.channel.send(`${user.tag} has received ${pointsToAdd} points and now stands at ${userscore.points} points.`);
80}
81
82if(command === "leaderboard") {
83 const top10 = sql.prepare("SELECT * FROM scores WHERE guild = ? ORDER BY points DESC LIMIT 10;").all(message.guild.id);
84
85 // Now shake it and show it! (as a nice embed, too!)
86 const embed = new Discord.RichEmbed()
87 .setTitle("Leaderboard")
88 .setAuthor(client.user.username, client.user.avatarURL)
89 .setDescription("Our top 10 points leaders!")
90 .setColor(0x00AE86);
91
92 for(const data of top10) {
93 embed.addField(client.users.get(data.user).tag, `${data.points} points (level ${data.level})`);
94 }
95 return message.channel.send({embed});
96}
97
98 // Command-specific code here!
99});
100
101
102// A pretty useful method to create a delay without blocking the whole script.
103const wait = require('util').promisify(setTimeout);
104
105client.on('ready', () => {
106 // "ready" isn't really ready. We need to wait a spell.
107 wait(1000);
108
109 // Load all invites for all guilds and save them to the cache.
110 client.guilds.forEach(g => {
111 g.fetchInvites().then(guildInvites => {
112 invites[g.id] = guildInvites;
113 });
114 });
115});
116
117firebase.initializeApp(config.firebaseConfig);
118
119client.on("ready", () => {
120 console.log(`Bot has started, with ${client.users.size} users, in ${client.channels.size} channels of ${client.guilds.size} servers.`);
121 client.user.setActivity('YouTube', { type: 'WATCHING' });
122
123})
124
125const applyText = (canvas, text) => {
126 const ctx = canvas.getContext('2d');
127
128 //LJ Declare a base size of the font
129 let fontSize = 70;
130
131 do {
132 // Assign the font to the context and decrement it so it can be measured again
133 ctx.font = `${fontSize -= 10}px sans-serif`;
134 // Compare pixel width of the text to the canvas minus the approximate avatar size
135 } while (ctx.measureText(text).width > canvas.width - 300);
136
137 // Return the result to use in the actual canvas
138 return ctx.font;
139};
140
141client.on('guildMemberAdd', async member => {
142 const channel = member.guild.channels.find(ch => ch.name === 'member-log');
143 if (!channel) return;
144
145 const canvas = Canvas.createCanvas(700, 250);
146 const ctx = canvas.getContext('2d');
147
148 const background = await Canvas.loadImage('https://cdn.glitch.com/3b1e98ec-ec80-4540-9202-74751f7a9f54%2Flololololol.png?v=1559824192569');
149 ctx.drawImage(background, 0, 0, canvas.width, canvas.height);
150
151 ctx.strokeStyle = '#74037b';
152 ctx.strokeRect(0, 0, canvas.width, canvas.height);
153
154 // Slightly smaller text placed above the member's display name
155 ctx.font = '28px sans-serif';
156 ctx.fillStyle = '#ffffff';
157 ctx.fillText('Welcome to the server,', canvas.width / 2.5, canvas.height / 3.5);
158
159 // Add an exclamation point here and below
160 ctx.font = applyText(canvas, `${member.displayName}!`);
161 ctx.fillStyle = '#ffffff';
162 ctx.fillText(`${member.displayName}!`, canvas.width / 2.5, canvas.height / 1.8);
163
164 ctx.beginPath();
165 ctx.arc(125, 125, 100, 0, Math.PI * 2, true);
166 ctx.closePath();
167 ctx.clip();
168
169 const avatar = await Canvas.loadImage(member.user.displayAvatarURL);
170 ctx.drawImage(avatar, 25, 25, 200, 200);
171
172 const attachment = new Discord.Attachment(canvas.toBuffer(), 'welcome-image.png');
173
174 channel.send(`Welcome to the server, ${member}!`, attachment);
175});
176
177client.on('guildMemberAdd', member => { //when someone join
178});
179
180client.on("message", async message => {
181 if(message.author.bot) return; //bot don't repeate itself!!
182 return firebase.database().ref("data").once('value').then(function(snapshot) {
183 var serverdata = snapshot.val() || 'error';
184 if(serverdata == 'error'){
185 message.channel.send("something got fuckup with database");
186 return;
187 }
188
189
190
191 if(message.content.indexOf(serverdata.prefix)!==0) return;
192 const args = message.content.slice(serverdata.prefix.length).trim().split(/ +/g);
193 const command = args.shift().toLowerCase();
194
195 if(command=="account"){
196 return firebase.database().ref("admin").once('value').then(function(snapshot) {
197 var admin = snapshot.val() || 'error';
198 var id = message.mentions.users.first().id;
199 for(let i = 0; i < admin.length; i++){
200 if(admin[i]==message.author.id){
201 if(args[0]!="set"){
202 return firebase.database().ref("userdata").once('value').then(function(snapshot) {
203 var userdata = snapshot.val() || 'error';
204 if(userdata=='error'){
205 message.channel.send("pls set userdata first!");
206 }
207 message.channel.send("**Number of "+client.users.get(id)+" is** `"+ userdata[id].number+"`");
208 });
209 }
210 if(args[0]=="set"){
211 firebase.database().ref("userdata/"+id).update({number:args[2]});
212 message.channel.send("**Number have been set!!!**");
213 }
214 return;
215 }
216 }
217 message.channel.send("you're idiot be admin first");
218 return;
219 });
220 }
221
222 if(command=="test"){
223 message.channel.send('dont fear GOD is here..'+'**MIND IT**')
224 }
225
226
227 if(command == "setid"){
228 firebase.database().ref("/").update({membercountid : args[0]});
229 message.channel.send("update ->"+args[0]);
230 }
231
232
233 if(command == "update"){
234 return firebase.database().ref("membercountid").once('value').then(function(snapshot) {
235 var serverdata = snapshot.val() || 'error';
236 var guildmember = (message.guild.members.filter(member => !member.user.bot).size);
237 message.channel.send("update with"+serverdata);
238 var interval = setInterval (function () {
239 client.channels.get(serverdata).setName(`Member Count : ${guildmember}`, `voice`)
240 }, 1 * 5000);
241 message.channel.send("membercount have been update!! //"+serverdata);
242 return;
243
244 });
245 }
246
247 if(command=="eval"){
248 if (message.author.id !== AuthorID) return message.channel.send('Cette commandes est seulement pour le Créateur du bot !')
249
250 function clean(text) {
251 if (typeof (text) === "string")
252 return text.replace(/`/g, "`" + String.fromCharCode(8203)).replace(/@/g, "@" + String.fromCharCode(8203));
253 else
254 return text;
255 }
256
257 try {
258 message.delete(5)
259 const code = args.join(" ");
260 let evaled = eval(code);
261
262 if (typeof evaled !== "string")
263 evaled = require("util").inspect(evaled);
264
265 message.channel.send(clean(evaled), {
266 code: "xl"
267 }).then(msg => {
268 msg.react('❌')
269 });
270 } catch (err) {
271 message.channel.send(`\`ERROR\` \`\`\`xl\n${clean(err)}\n\`\`\``);
272 }
273
274 }
275
276
277 if(command=="invitelist"){
278 if(args[0]=="update"){
279 message.guild.fetchInvites()
280 .then(invites => {
281 let inviteArr = invites.array();
282 firebase.database().ref("data/"+"inviterank/invitelist/").set({});
283 for (let i = 0; i < inviteArr.length; i++) {
284 firebase.database().ref("data/"+"inviterank/invitelist/"+i).set({code : inviteArr[i].code,name : inviteArr[i].inviter.id, uses : inviteArr[i].uses});
285 }
286 message.channel.send("**Server's invite data have been updated!!!**");
287 })
288 .catch(console.error);
289 }
290 if(args[0]=="rank"){
291 var onlyusesarray = [];
292 var invitelistarray = serverdata.inviterank.invitelist;
293 for(let i = 0; i < invitelistarray.length; i++){
294 var listdata = { uses: invitelistarray[i].uses , number: i}
295 onlyusesarray.push(listdata);
296 }
297 onlyusesarray.sort(function(a, b){
298 return b.uses-a.uses
299 });
300 for(let i = 0; i < 10; i++){
301 let shownum = i + 1;
302 let numnumnum = onlyusesarray[i].number;
303 let whodafuck = client.users.get(invitelistarray[numnumnum].name);
304 message.channel.send(shownum+". "+invitelistarray[numnumnum].code + " By "+ whodafuck + " with "+invitelistarray[numnumnum].uses+" uses");
305 }
306 }
307
308 }
309
310 });
311});
312
313client.on('message', async message => {
314
315 if (message.content === 'ID'){
316 const canvas = Canvas.createCanvas(1280, 364);
317 const ctx = canvas.getContext('2d');
318
319 const background = await Canvas.loadImage('https://cdn.glitch.com/3b1e98ec-ec80-4540-9202-74751f7a9f54%2F20190607_150853.jpg?v=1559900405317');
320 ctx.drawImage(background, 0, 0, canvas.width, canvas.height);
321
322
323 ctx.strokeStyle = '#74037b';
324
325 ctx.strokeRect(0, 0, canvas.width, canvas.height);
326
327 const avatar = await Canvas.loadImage(message.author.displayAvatarURL);
328 // Move the image downwards vertically and constrain its height to 200, so it's a square
329 ctx.drawImage(avatar, 135, 53, 255, 260);
330
331 ctx.font = '50px Impact'
332 ctx.fillStyle = '#696969';
333 ctx.fillText(`${message.author.username}`, canvas.width / 1.8, canvas.height / 4.8);
334
335 ctx.font = applyText(canvas, `LEVEL`);
336 ctx.fillStyle = '#696969';
337 ctx.fillText(`LEVEL`, canvas.width / 2.8, canvas.height / 2.1);
338
339
340 const attachment = new Discord.Attachment(canvas.toBuffer(), 'welcome-image.png');
341
342 message.channel.send('your id card is here!', attachment);
343 }
344});
345
346
347client.login(config.token);