· 6 years ago · Aug 13, 2019, 03:44 PM
1const { Database } = require('sqlite3');
2var lodash = require('lodash'); //eslint-disable-line no-unused-vars
3const makeError = require('makeerror'); //eslint-disable-line
4const InputError = makeError('InputError'); //eslint-disable-line no-unused-vars
5
6/**
7 * Create new DiscordEconomy Client
8 */
9module.exports = class DiscordEconomy {
10 /**
11 * Client Option
12 * @param {String} opt Default Balance (Default : 0);
13 */
14 constructor(opt) {
15 if (opt) {
16 var defaultBalance = lodash.toNumber(opt); //eslint-disable-line
17 } else {
18 var defaultBalance = 0; //eslint-disable-line
19 }
20 var db = new Database('economy.sqlite');
21 db.run("CREATE TABLE IF NOT EXISTS economy (userID TEXT, money INTEGER)");
22
23 //begin of functions
24
25 /**
26 * Fetches a balance from userID
27 * @param {String} ID UserID from Discord User
28 * @returns {Promise} A promise that contains user balance / money
29 */
30 this.fetchBalance = (ID) => { //eslint-disable-line no-unused-vars
31 if (!ID) return new InputError('Please input user ID to fetch the balance');
32 if (isNaN(ID)) return new InputError('Invalid ID');
33 const fetchBalance = new Promise((resolve) => {
34 function getBalance(ID) {
35 db.get(`SELECT * FROM economy WHERE userID = '${ID}'`, (err, row) => { //eslint-disable-line
36 if (!row) {
37 insertFirstMoney(ID); //eslint-disable-line
38 } else {
39 resolveDB(row);
40 }
41 });
42 }
43 getBalance(ID);
44
45 function resolveDB(data) {
46 return resolve(lodash.toNumber(data.money)) //eslint-disable-line
47 }
48
49 function insertFirstMoney(userID) {
50 var stmt = db.prepare(`INSERT INTO economy (userID, money) VALUES (?,?)`);
51 stmt.run(userID, defaultBalance);
52 return getBalance(ID);
53 }
54 });
55 return fetchBalance;
56 };
57
58 /**
59 * Update user balance
60 * @param {String} ID userID from an user in Discord
61 * @param {Number} money How much money to add to this ID
62 * @returns {Promise} A promise that contains user balance / money
63 */
64 this.updateBalance = (ID, money) => { //eslint-disable-line no-unused-vars
65 if (!ID) return new InputError('Please input user ID to fetch the balance');
66 if (isNaN(ID)) return new InputError('Invalid ID');
67 if (!money) return new InputError('Please input a valid money');
68 if (isNaN(ID)) return new InputError('Money should be a number');
69 const updateBalance = new Promise((resolve, error) => { //eslint-disable-line
70 function checkIfCreated(ID, money) {
71 db.get(`SELECT * FROM economy WHERE userID = '${ID}'`, (err, row) => {
72 if (!row) {
73 insertFirstMoney(ID);
74 } else {
75 var moneyBefore = lodash.toNumber(row.money);
76 var moneyAfter = lodash.toNumber(money);
77 var moneyUpdate = moneyBefore + moneyAfter;
78 //console.log(moneyUpdate);
79 db.run(`UPDATE economy SET money = '${moneyUpdate}' WHERE userID = '${ID}'`);
80 db.get(`SELECT * FROM economy WHERE userID = '${ID}'`, (err, row) => {
81 resolveDB(row);
82 });
83 }
84 });
85 }
86
87 function insertFirstMoney(ID) {
88 var stmt = db.prepare('INSERT INTO economy (userID, money) VALUES (?,?)');
89
90 stmt.run(ID, defaultBalance);
91 }
92
93 function resolveDB(data) {
94 return resolve(lodash.toNumber(data.money)) //eslint-disable-line
95 }
96
97 checkIfCreated(ID, money);
98
99 });
100 return updateBalance;
101 };
102
103 /** Set user balance (NOTE: THIS WILL OVERWRITE LAST USER BALANCE)
104 * @param {String} ID userID from an user in Discord
105 * @param {String} money How much money to set to this ID
106 * @returns {Promise} A promise that contains user balance / money
107 */
108 this.setBalance = (ID, money) => { //eslint-disable-line
109 if (!ID) return new InputError('Please input user ID to fetch the balance');
110 if (isNaN(ID)) return new InputError('Invalid ID');
111 if (!money) return new InputError('Please input a valid money');
112 if (isNaN(ID)) return new InputError('Money should be a number');
113 const setBalance = new Promise((resolve, error) => { //eslint-disable-line
114 function checkIfCreated(ID, money) {
115 db.get(`SELECT * FROM economy WHERE userID = '${ID}'`, (err, row) => {
116 if (!row) {
117 insertFirstMoney(ID);
118 } else {
119 db.run(`UPDATE economy SET money = '${money}' WHERE userID = '${ID}'`);
120 db.get(`SELECT * FROM economy WHERE userID = '${ID}'`, (err, row) => {
121 resolveDB(row);
122 });
123 }
124 });
125 }
126
127 function insertFirstMoney(ID) {
128 var stmt = db.prepare('INSERT INTO economy (userID, money) VALUES (?,?)');
129
130 stmt.run(ID, defaultBalance);
131 }
132
133 function resolveDB(data) {
134 return resolve(lodash.toNumber(data.money)) //eslint-disable-line
135 }
136
137 checkIfCreated(ID, money);
138
139 });
140 return setBalance;
141 };
142
143 //end of functions
144 }
145};