The official leaked source code of the Dyno Discord Bot.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
2.3 KiB

4 years ago
  1. const { collection, connection, models } = require('../src/core/database');
  2. const config = require('../src/core/config');
  3. async function createClusters(options) {
  4. try {
  5. const { clientId, shardCount } = options;
  6. const globalConfig = await models.Dyno.findOne().lean();
  7. let { clusterCount, serverMap } = globalConfig;
  8. let firstShardId = 0;
  9. let lastShardId = shardCount - 1;
  10. clusterCount = options.clusterCount || clusterCount;
  11. const shardIds = [...Array(1 + lastShardId - firstShardId).keys()].map(v => firstShardId + v);
  12. let clusters = chunkArray(shardIds, clusterCount);
  13. let servers = chunkArray(clusters, serverMap[clientId].length);
  14. clusters = servers.flatMap((s, i) => {
  15. const server = serverMap[clientId][i];
  16. return s.map((c, i) => ({
  17. host: {
  18. name: server.name,
  19. hostname: server.host || `${server.name}.dyno.lan`,
  20. state: server.state,
  21. },
  22. clientId,
  23. clusterCount,
  24. shardCount,
  25. firstShardId: c[0],
  26. lastShardId: c[c.length-1],
  27. env: options.env || 'dev',
  28. }));
  29. }).map((c, i) => ({ id: i, ...c }));
  30. const coll = collection('clusters');
  31. const states = serverMap[clientId].map(s => s.state);
  32. await coll.deleteMany({ 'host.state': { $in: states } });
  33. await coll.insertMany(clusters);
  34. connection.close();
  35. } catch (err) {
  36. throw err;
  37. }
  38. }
  39. function chunkArray(arr, chunkCount) {
  40. const arrLength = arr.length;
  41. const tempArray = [];
  42. let chunk = [];
  43. const chunkSize = Math.floor(arr.length / chunkCount);
  44. let mod = arr.length % chunkCount;
  45. let tempChunkSize = chunkSize;
  46. for (let i = 0; i < arrLength; i += tempChunkSize) {
  47. tempChunkSize = chunkSize;
  48. if (mod > 0) {
  49. tempChunkSize = chunkSize + 1;
  50. mod--;
  51. }
  52. chunk = arr.slice(i, i + tempChunkSize);
  53. tempArray.push(chunk);
  54. }
  55. return tempArray;
  56. }
  57. createClusters({
  58. clientId: '174603832993513472',
  59. shardCount: 2,
  60. clusterCount: 2,
  61. env: 'dev',
  62. });
  63. createClusters({
  64. clientId: '161660517914509312',
  65. shardCount: 1152,
  66. env: 'prod',
  67. });
  68. createClusters({
  69. clientId: '168274214858653696',
  70. shardCount: 16,
  71. clusterCount: 16,
  72. env: 'premium',
  73. });
  74. createClusters({
  75. clientId: '347378090399236096',
  76. shardCount: 2,
  77. clusterCount: 2,
  78. env: 'alpha',
  79. });
  80. // createClusters({
  81. // clientId: '161660517914509312',
  82. // shardCount: 1440,
  83. // });
  84. // clusters.forEach(c => console.log(JSON.stringify(c)));