This repository has been archived by the owner on Jul 1, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bot.js
337 lines (282 loc) · 10.8 KB
/
bot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
// dependencies
const { Client } = require("discord.js");
const dotenv = require("dotenv");
const axios = require('axios');
const { JsonDB } = require("node-json-db")
const { Config } = require("node-json-db/dist/lib/JsonDBConfig");
const { CronJob } = require("cron");
//konstanter
const cmdPrefix = ".";
// cron jobber
let dagenFor = new CronJob('00 55 07 * * *', backupDag);
dagenFor.start();
let databaseOppdater = new CronJob('0 */10 * * * *', oppdaterPris);
databaseOppdater.start();
// let storsteVinner = new CronJob('00 00 08 * * *', annonserStorsteVinner);
// storsteVinner.start();
// load environment variables
dotenv.config();
// Create bot instance
const bot = new Client();
var db = new JsonDB(new Config("myDataBase", true, false, '/'));
//emojier
// const arneL = bot.client.emojis.find(emoji => emoji.name === "arneL");
// console.log(db.getData("/priser/").ethereum);
// Log in bot
bot.login(process.env.DISCORD_BOT_TOKEN)
bot.on('ready', () => {
console.log(`${bot.user.username} is up and running!`);
});
bot.on('message', async (message) => {
// Do not reply if messages was sent by bot
if (message.author.bot) return;
if (message.content.startsWith(cmdPrefix + "ping")) {
return message.reply("I am working!");
}
if (message.content.startsWith(cmdPrefix + "pris")) {
// Get the parameters
const [command, ...args] = message.content.split(" ");
// check for number of arguments
if (args.length === 1) {
args.push("usd");
}
const [coin, vsCurrency] = args;
if (args.length === 2) {
try {
var pris = db.getData(`/priser/${coin}`);
var prisFor;
try {
prisFor = db.getData(`/forrigeDogn/${coin}`)
} catch (error) {
prisFor = pris;
}
var forskjell = (pris/prisFor*100-100).toFixed(2);
return message.reply(`Prisen på 1 ${coin} er nå ${pris} ${vsCurrency} og status: ${forskjell}%`);
} catch (error) {
try {
await leggTilKrypto(coin);
var pris = db.getData(`/priser/${coin}`);
return message.reply(`Prisen på 1 ${coin} er nå ${pris} ${vsCurrency}`);
} catch (error) {
return message.reply("Ser ikke ut som valuta det der tjommi, sjekk igjen");
}
}
}
else {
return message.reply(
"Ett argument for dollar, TO for alle andre valuta you donkey"
);
}
}
if (message.content.startsWith(cmdPrefix + "overvåk")) {
const [command, ...args] = message.content.split(" ");
[args].forEach(async (valuta) => {
try {
await leggTilKrypto(valuta);
message.reply(`Lagt til og oppdatert ${valuta} i databasen`);
} catch (error) {
message.reply(`Fant ikke ${valuta} som en valuta, har du en liten skriveleif?`);
}
});
};
if (message.content.startsWith(cmdPrefix + "database")) {
var melding = "Pris på kryptoen i databasen er:\n";
var priser = Object.entries(await db.getData("/priser"));
priser.forEach(([krypto, pris]) => {
melding += `${krypto} : ${pris} USD\n`;
});
return message.reply(melding);
}
if (message.content.startsWith(cmdPrefix + "portefølje")) {
const [command, ...args] = message.content.split(" ");
var bruker = message.member.id;
if (args[0] == "list") {
try {
var kryptoer = Object.entries(db.getData(`/portefolio/${bruker}`));
var melding = "\nDu har registrert:\n";
if (!kryptoer) throw Error();
kryptoer.forEach((krypto) => {
melding += `${krypto[0]} : ${krypto[1]}\n`
});
return message.reply(melding);
} catch (err) {
return message.reply("Registrer noe krypto før du lister opp med + eller -");
}
} else if (args[0] == "+" || args[0] == "-") {
try {
var krypto = args[1].toLowerCase();
var antall = args[2];
if (args.length !== 3 || await sjekkPris(krypto, "usd") === -1 || isNaN(antall)) throw Error();
if (!(krypto in db.getData("/priser/"))) {
leggTilKrypto(krypto);
}
antall = Number(antall);
try {
var antallFor = db.getData(`/portefolio/${bruker}/${krypto}/`);
if (args[0] == "+") {
db.push(`/portefolio/${bruker}/${krypto}`, antall + antallFor);
return message.reply(`Du har nå ${antall + antallFor} ${krypto} i databasen`);
} else {
db.push(`/portefolio/${bruker}/${krypto}`, antallFor - antall);
return message.reply(`Du har nå ${antallFor - antall} ${krypto} i databasen`);
}
} catch (error) {
db.push(`/portefolio/${bruker}/${krypto}/`, antall);
return message.reply(`Du har nå ${antall} ${krypto} i databasen`);
}
} catch (err) {
return message.reply("Du har enten skrevet navnet til kryptoen feil eller ikke lagt til noen");
}
}
}
if (message.content.startsWith(cmdPrefix + "bal")) {
const [command, ...args] = message.content.split(" ");
var bruker;
if (args.length === 0) {
bruker = message.member.id;
} else if (args.length === 1) {
bruker = args[0].substring(3, args[0].length - 1);
} else {
return message.reply("Du må ha skrevet noe feil. .bal brukes enten uten en bruker eller ved å tagge en bruker etter kommandoen");
}
var melding = "Kryptoer og deres verdi i USD:\n";
try {
var kryptoer = Object.entries(db.getData(`/portefolio/${bruker}`));
} catch (error) {
return message.reply("Denne brukeren har ingen portefølje i databasen");
}
var total = 0;
kryptoer.forEach(([krypto, antall]) => {
var pris = db.getData(`/priser/${krypto}/`);
var totalPris = Math.round(pris * antall);
melding += `${antall} ${krypto} er verdt ${totalPris} USD\n`;
total += totalPris;
});
melding += `Totalt samlet: ${total} USD`;
return message.reply(melding);
}
if (message.content.startsWith(cmdPrefix + "gainz")) {
const [command, ...args] = message.content.split(" ");
var bruker;
if (args.length > 0) {
bruker = args[0].substring(3, args[0].length - 1);
} else {
bruker = message.member.id;
}
var totalGainz = gainz(bruker);
return message.reply(`Siden i går er statusen for porteføljen: ${totalGainz}%`);
}
if (message.content.startsWith(cmdPrefix + "ranking")) {
const [command, ...args] = message.content.split(" ");
return message.reply(annonserStorsteVinner());
}
if (message.content.startsWith(cmdPrefix + "top")) {
var melding = "Brukere med mest spænn i krypto:\n"
var alleTop = [];
Object.keys(db.getData("/portefolio/")).forEach((id) => {
alleTop.push([id, totalBal(id)]);
});
alleTop.sort(function (first, second) {
return second[1] - first[1];
});
alleTop.forEach(([id, top]) => {
melding += `<@${id}> : ${top} USD\n`;
})
return message.reply(melding);
}
if (message.content.startsWith(cmdPrefix + "reload")) {
await oppdaterPris();
return message.reply("Prisene i databasen er nå oppdatert");
}
if (message.content.startsWith(cmdPrefix + "help")) {
return message.reply(`\nHjelp for dumme folk:\n
${cmdPrefix}ping - sjekk om botten er oppe
${cmdPrefix}pris <valuta> [sammenligningsValuta] - Få den siste prisen på din shitcoin!
${cmdPrefix}overvåk <valuta> - Legg kryptovalutan på overvåkingslisten og inn i databasen.
${cmdPrefix}portefølje <+ eller - eller list> <valuta> <antall> - List tar og lister all kryptoen du har i øyeblikket eller så kan du legge til krypto med + eller -.
${cmdPrefix}database - lister opp alle valutaene og prisene på dem.
${cmdPrefix}bal [tag til bruker] - Viser alle valutaene i din portefølje og deres nåværende pris, kan også tagge en bruker og se på deres balanse.
`);
}
});
// console.log(checkPrice("ethereum","usd"));
async function sjekkPris(coin, vsCurrency) {
try {
const { data } = await axios.get(
`https://api.coingecko.com/api/v3/simple/price?ids=${coin}&vs_currencies=${vsCurrency}`
);
// console.log(data);
// console.log(`https://api.coingecko.com/api/v3/simple/price?ids=${coin}&vs_currencies=${vsCurrency}`);
if (!data[coin][vsCurrency]) throw Error();
// console.log(`Prisen på 1 ${coin} er nå ${data[coin][vsCurrency]} ${vsCurrency}`);
return data[coin][vsCurrency];
} catch (err) {
return -1;
};
}
async function leggTilKrypto(valuta) {
var pris = await sjekkPris(valuta, "usd");
if (pris === -1) {
throw Error();
} else {
db.push(`/priser/${valuta}`, pris);
return 1;
}
}
async function oppdaterPris() {
console.log("oppdaterer priser");
var priser = Object.entries(await db.getData("/priser"));
for (let [krypto, pris] of priser) {
db.push(`/priser/${krypto}`, await sjekkPris(krypto, "usd"));
}
}
async function backupDag() {
await oppdaterPris();
console.log("Siste time backet up!");
db.push("/forrigeDogn/", db.getData("/priser/"));
}
function gainz(id) {
try {
var kryptoer = Object.entries(db.getData(`/portefolio/${id}`));
} catch (error) {
return "Denne brukeren har ingen portefølje i databasen";
}
var totalNaa = 0;
var totalFor = 0;
kryptoer.forEach(([krypto, antall]) => {
var pris = db.getData(`/priser/${krypto}/`);
try {
var prisFor = db.getData(`/forrigeDogn/${krypto}/`);
} catch (error) {
var prisFor = pris;
}
var totalPrisFor = Math.round(prisFor * antall);
var totalPris = Math.round(pris * antall);
totalNaa += totalPris;
totalFor += totalPrisFor;
});
return ((totalNaa / totalFor * 100) - 100).toFixed(2);
}
function totalBal(id) {
var sum = 0;
var portefolio = Object.entries(db.getData(`/portefolio/${id}/`));
portefolio.forEach(([krypto, antall]) => {
var pris = db.getData(`/priser/${krypto}`);
sum += pris * antall;
});
return sum.toFixed(1);
}
function annonserStorsteVinner() {
var melding = "Gainza til boysa sortert fra størst til minst iløpet av den siste timen:\n";
var alleGainz = [];
Object.keys(db.getData("/portefolio/")).forEach((id) => {
alleGainz.push([id, gainz(id)]);
});
alleGainz.sort(function (first, second) {
return second[1] - first[1];
});
alleGainz.forEach(([id, gain]) => {
melding += `<@${id}> : ${gain}%\n`;
})
return melding;
}