index.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. const Discord = require('discord.js');
  2. const client = new Discord.Client({ partials: ['MESSAGE', 'CHANNEL', 'REACTION'] });
  3. const config = require('./config.json');
  4. var mysql = require('mysql');
  5. var emoji = require('node-emoji');
  6. var urlRegex = /^(ftp|http|https):\/\/[^ "]+$/;
  7. client.on('ready', () => {
  8. if (config.playing !== "") {
  9. client.user.setPresence({ status: 'online', game: { name: config.playing } });
  10. }
  11. console.log(getTimestamp(), `Logged in as ${client.user.tag}!`);
  12. console.log(getTimestamp(), `To send missing messages run ${config.prefix}dump [quantity(default and limited to 99)]`);
  13. });
  14. client.on('message', message => {
  15. if (message.author.bot==true) return;
  16. var serverData = undefined;
  17. config.servers.forEach(function(server) {
  18. if (message.channel.id==server.channel) serverData = server;
  19. });
  20. if (serverData==undefined) return;
  21. //console.log(message.mentions.roles);
  22. if (message.content.startsWith(`${serverData.prefix||config.prefix}ping`)) {
  23. message.channel.send('Pong! :ping_pong:');
  24. return;
  25. } else if (message.content.startsWith(`${serverData.prefix||config.prefix}dump`) && serverData.allowDump == true) {
  26. console.log(getTimestamp(), 'Warning, dump in progress! May cause slowdows.');
  27. number = message.content.slice(6);
  28. if (number=='') number = 99;
  29. //console.log(number);
  30. message.delete(2);
  31. var channel = message.channel;
  32. async function run() {
  33. var fetched = await channel.fetchMessages({limit: number});
  34. //console.log(fetched);
  35. var connection = mysql.createConnection({
  36. host : serverData.dbHost,
  37. user : serverData.dbUser,
  38. password : serverData.dbPassword,
  39. database : serverData.db
  40. });
  41. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  42. connection.connect();
  43. connection.query(sql, function (error, results, fields) {
  44. if (error) throw error;
  45. //console.log('Data recived from db. Result: ', results);
  46. var messages = [];
  47. fetched.forEach(messageNow => {
  48. var found = false;
  49. var edited = true;
  50. results.forEach(function (msg){
  51. if (messageNow.id == msg.id || messageNow.id == message.id ) {
  52. found = true;
  53. }
  54. //console.log('message:' + ((messageNow.editedTimestamp == null) ? "nope" : messageNow.editedTimestamp) + ' db: ' + msg.timeEdit);
  55. if (found == true && (messageNow.editedTimestamp || "") == msg.timeEdit) {
  56. edited = false;
  57. }
  58. });
  59. if (found==true && edited==true) {
  60. messages.push({"message":messageNow, "action":1});
  61. } else if (found==false) {
  62. messages.push({"message":messageNow, "action":0});
  63. }
  64. });
  65. //console.log(messages);
  66. results.forEach(function (msg){
  67. var id = msg.id;
  68. var found = false;
  69. fetched.forEach(messageNow => {
  70. if (id == messageNow.id) {
  71. found = true;
  72. }
  73. });
  74. if (found == false) {
  75. messages.push({"message":msg, "action":2});
  76. }
  77. });
  78. sendLoop(messages, serverData, 1000);
  79. });
  80. connection.end();
  81. }
  82. run();
  83. } else {
  84. sendToDB(message, serverData);
  85. }
  86. });
  87. client.on('messageUpdate', async (messageOld, messageNew) => {
  88. console.log("woop");
  89. if (messageOld.partial) {
  90. // If the message was removed the fetching might result in an API error, which we need to handle
  91. try {
  92. await messageOld.fetch();
  93. } catch (error) {
  94. console.log(getTimestamp(), 'Something went wrong when fetching the message: ', error);
  95. }
  96. }
  97. if (messageNew.partial) {
  98. // If the message was removed the fetching might result in an API error, which we need to handle
  99. try {
  100. await messageNew.fetch();
  101. } catch (error) {
  102. console.log(getTimestamp(), 'Something went wrong when fetching the message: ', error);
  103. }
  104. }
  105. if (messageNew.author.bot==true) return;
  106. var serverData = undefined;
  107. config.servers.forEach(function(server) {
  108. if (messageNew.channel.id==server.channel) serverData = server;
  109. });
  110. if (serverData==undefined) return;
  111. var channel = messageNew.channel;
  112. var connection = mysql.createConnection({
  113. host : serverData.dbHost,
  114. user : serverData.dbUser,
  115. password : serverData.dbPassword,
  116. database : serverData.db
  117. });
  118. var sql = 'SELECT * FROM `'+serverData.dbTable+'`';
  119. connection.connect();
  120. connection.query(sql, function (error, results, fields) {
  121. if (error) throw error;
  122. //console.log('Data recived from db. Result: ', results);
  123. var messages = [];
  124. results.forEach(messageNow => {
  125. if (messageNow.id == messageNew.id) {
  126. messages.push({"message":messageNew, "action":1});
  127. }
  128. });
  129. sendLoop(messages, serverData, 1000);
  130. });
  131. connection.end();
  132. });
  133. client.on('messageDelete', message => {
  134. if (message.author.bot==true) return;
  135. var serverData = undefined;
  136. config.servers.forEach(function(server) {
  137. if (message.channel.id==server.channel) serverData = server;
  138. });
  139. if (serverData==undefined) return;
  140. deleteFromDB(message, serverData);
  141. });
  142. client.login(config.token);
  143. function sendLoop(messages, serverData, delay) {
  144. if (messages.length == 0) {
  145. return;
  146. }
  147. if (messages[0].action == 0) {
  148. sendToDB(messages[0].message, serverData);
  149. } else if (messages[0].action == 1) {
  150. updateDB(messages[0].message, serverData);
  151. } else if (messages[0].maction == 2) {
  152. deleteFromDB(messages[0].message, serverData);
  153. }
  154. messages.shift();
  155. setTimeout(sendLoop, delay, messages, serverData, delay);
  156. }
  157. function updateDB(message, serverData) {
  158. var connection = mysql.createConnection({
  159. host : serverData.dbHost,
  160. user : serverData.dbUser,
  161. password : serverData.dbPassword,
  162. database : serverData.db
  163. });
  164. var post = prepareMessage(message, serverData);
  165. var sql = 'UPDATE '+serverData.dbTable+' SET ? WHERE id='+message.id;
  166. connection.connect();
  167. connection.query(sql, post, function (error, results, fields) {
  168. if (error) throw error;
  169. console.log(getTimestamp(), 'Data updated in db. Result: ', results);
  170. });
  171. connection.end();
  172. }
  173. function sendToDB(message, serverData) {
  174. var connection = mysql.createConnection({
  175. host : serverData.dbHost,
  176. user : serverData.dbUser,
  177. password : serverData.dbPassword,
  178. database : serverData.db
  179. });
  180. var post = prepareMessage(message, serverData);
  181. var sql = 'INSERT INTO '+serverData.dbTable+' SET ?';
  182. connection.connect();
  183. connection.query(sql, post, function (error, results, fields) {
  184. if (error) throw error;
  185. console.log(getTimestamp(), 'Data sent to db. Result: ', results);
  186. });
  187. connection.end();
  188. }
  189. function deleteFromDB(message, serverData) {
  190. var connection = mysql.createConnection({
  191. host : serverData.dbHost,
  192. user : serverData.dbUser,
  193. password : serverData.dbPassword,
  194. database : serverData.db
  195. });
  196. var sql = 'DELETE FROM '+serverData.dbTable+' WHERE id='+message.id;
  197. connection.connect();
  198. connection.query(sql, function (error, results, fields) {
  199. if (error) throw error;
  200. console.log(getTimestamp(), 'Data deleted in db. Result: ', results);
  201. });
  202. connection.end();
  203. }
  204. function prepareMessage(message, serverData) {
  205. var l = [];
  206. var msgCopy = message.content;
  207. msgCopy.replace(urlRegex, function(url) {
  208. l.push(url);
  209. });
  210. var i = [];
  211. message.attachments.forEach(attachment => {
  212. i.push(attachment.url);
  213. });
  214. var mentions = [];
  215. message.mentions.users.forEach(user => {
  216. mentions.push({"userId": user.id, "username": user.username, "discriminator": user.discriminator});
  217. });
  218. var messageContent = message.content;
  219. for (mention of mentions) {
  220. if(messageContent.includes(mention.userId)) {
  221. if (serverData.userMentionsMode == 0) {
  222. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.userId);
  223. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.userId);
  224. } else if (serverData.userMentionsMode == 1) {
  225. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username);
  226. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username);
  227. } else {
  228. messageContent = messageContent.replace(new RegExp("<@"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  229. messageContent = messageContent.replace(new RegExp("<@!"+mention.userId+">", 'g'), "@"+mention.username+"#"+mention.discriminator);
  230. }
  231. }
  232. }
  233. var mentions = [];
  234. message.mentions.channels.forEach(channel => {
  235. mentions.push({"channelId": channel.id, "name": channel.name});
  236. });
  237. for (mention of mentions) {
  238. if(messageContent.includes(mention.channelId)) {
  239. if (serverData.channelMentionsMode == 0) {
  240. messageContent = messageContent.replace(new RegExp("<#"+mention.channelId+">", 'g'), "#"+mention.channelId);
  241. messageContent = messageContent.replace(new RegExp("<#!"+mention.channelId+">", 'g'), "#"+mention.channelId);
  242. } else if (serverData.channelMentionsMode == 1) {
  243. messageContent = messageContent.replace(new RegExp("<#"+mention.channelId+">", 'g'), "#"+mention.name);
  244. messageContent = messageContent.replace(new RegExp("<#!"+mention.channelId+">", 'g'), "#"+mention.name);
  245. } else if (serverData.channelMentionsMode == 2) {
  246. messageContent = messageContent.replace(new RegExp("<#"+mention.channelId+">", 'g'), "#"+mention.channelId+"#");
  247. messageContent = messageContent.replace(new RegExp("<#!"+mention.channelId+">", 'g'), "#"+mention.channelId+"#");
  248. } else {
  249. messageContent = messageContent.replace(new RegExp("<#"+mention.channelId+">", 'g'), "#"+mention.name+"#");
  250. messageContent = messageContent.replace(new RegExp("<#!"+mention.channelId+">", 'g'), "#"+mention.name+"#");
  251. }
  252. }
  253. }
  254. var mentions = [];
  255. message.mentions.roles.forEach(role => {
  256. mentions.push({"roleId": role.id, "name": role.name, "color": role.color.toString(16)});
  257. });
  258. for (mention of mentions) {
  259. if(messageContent.includes(mention.roleId)) {
  260. if (serverData.roleMentionsMode == 0) {
  261. messageContent = messageContent.replace(new RegExp("<@&"+mention.roleId+">", 'g'), "&"+mention.roleId);
  262. messageContent = messageContent.replace(new RegExp("<@&!"+mention.roleId+">", 'g'), "&"+mention.roleId);
  263. } else if (serverData.roleMentionsMode == 1) {
  264. messageContent = messageContent.replace(new RegExp("<@&"+mention.roleId+">", 'g'), "&"+mention.name);
  265. messageContent = messageContent.replace(new RegExp("<@&!"+mention.roleId+">", 'g'), "&"+mention.name);
  266. } else {
  267. messageContent = messageContent.replace(new RegExp("<@&"+mention.roleId+">", 'g'), "&"+mention.name+"#"+mention.color);
  268. messageContent = messageContent.replace(new RegExp("<@&!"+mention.roleId+">", 'g'), "&"+mention.name+"#"+mention.color);
  269. }
  270. }
  271. }
  272. if (serverData.authorMode == 0) {
  273. var author = message.author.id;
  274. } else if (serverData.authorMode == 1) {
  275. var author = message.author.username;
  276. } else {
  277. var author = message.author.tag;
  278. }
  279. return {message:emoji.unemojify(messageContent), id:message.id, time:message.createdTimestamp, timeEdit:(message.editedTimestamp || ""), user:author, links:JSON.stringify(l), images:JSON.stringify(i)};
  280. }
  281. function getTimestamp() {
  282. var d = new Date();
  283. return "["+d.getDate()+"/"+(d.getMonth()+1)+"/"+d.getFullYear()+" - "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+"."+d.getMilliseconds()+"]";
  284. }