index.js 13 KB

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