Merge branch 'bjcscat-master'
This commit is contained in:
		
						commit
						e211ddf5b9
					
				
					 4 changed files with 80 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -40,6 +40,8 @@ OUTPUT=
 | 
			
		|||
TEMPDIR=
 | 
			
		||||
# Put temporary image web server domain
 | 
			
		||||
TMP_DOMAIN=
 | 
			
		||||
# Threshold where optional space saving methods will be performed
 | 
			
		||||
THRESHOLD=
 | 
			
		||||
# Port for serving metrics. Metrics served are compatible with Prometheus.
 | 
			
		||||
METRICS=
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										31
									
								
								app.js
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								app.js
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -22,10 +22,11 @@ import Shard from "./shard.js";
 | 
			
		|||
import ImageWorker from "./utils/services/image.js";
 | 
			
		||||
import PrometheusWorker from "./utils/services/prometheus.js";
 | 
			
		||||
// some utils
 | 
			
		||||
import { readFileSync } from "fs";
 | 
			
		||||
import { promises, readFileSync } from "fs";
 | 
			
		||||
import winston from "winston";
 | 
			
		||||
import { exec as baseExec } from "child_process";
 | 
			
		||||
import { promisify } from "util";
 | 
			
		||||
 | 
			
		||||
const exec = promisify(baseExec);
 | 
			
		||||
// database stuff
 | 
			
		||||
import database from "./utils/database.js";
 | 
			
		||||
| 
						 | 
				
			
			@ -172,4 +173,32 @@ if (isMaster) {
 | 
			
		|||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // process the threshold into bytes early
 | 
			
		||||
  if (process.env.TEMPDIR && process.env.THRESHOLD) {
 | 
			
		||||
    const matched = process.env.THRESHOLD.match(/(\d+)([KMGT])/);
 | 
			
		||||
    const sizes = {
 | 
			
		||||
      K: 1024,
 | 
			
		||||
      M: 1048576,
 | 
			
		||||
      G: 1073741824,
 | 
			
		||||
      T: 1099511627776
 | 
			
		||||
    };
 | 
			
		||||
    if (matched && matched[1] && matched[2]) {
 | 
			
		||||
      process.env.THRESHOLD = matched[1] * sizes[matched[2]];
 | 
			
		||||
    } else {
 | 
			
		||||
      logger.error("Invalid THRESHOLD config.");
 | 
			
		||||
      process.env.THRESHOLD = undefined;
 | 
			
		||||
    }
 | 
			
		||||
    const dirstat = (await promises.readdir(process.env.TEMPDIR)).map(async (file) => {
 | 
			
		||||
      return new Promise((resolve) => {
 | 
			
		||||
        promises.stat(`${process.env.TEMPDIR}/${file}`).then((stats) => {
 | 
			
		||||
          resolve(stats.size);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
    const size = await Promise.all(dirstat);
 | 
			
		||||
    process.env.DIRSIZECACHE = size.reduce((a, b)=>{
 | 
			
		||||
      return a + b;
 | 
			
		||||
    }, 0);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,6 +55,30 @@ export default async (client, cluster, worker, ipc, interaction) => {
 | 
			
		|||
              },
 | 
			
		||||
            }]
 | 
			
		||||
          });
 | 
			
		||||
          if (process.env.THRESHOLD) {
 | 
			
		||||
            process.env.DIRSIZECACHE += result.file.length;
 | 
			
		||||
            if (process.env.DIRSIZECACHE > process.env.THRESHOLD) {
 | 
			
		||||
              const files = (await promises.readdir(process.env.TEMPDIR)).map((file) => {
 | 
			
		||||
                return new Promise((resolve, reject) => {
 | 
			
		||||
                  promises.stat(`${process.env.TEMPDIR}/${file}`).then((fstats)=>{
 | 
			
		||||
                    resolve({
 | 
			
		||||
                      name: file,
 | 
			
		||||
                      size: fstats.size,
 | 
			
		||||
                      ctime: fstats.ctime
 | 
			
		||||
                    });
 | 
			
		||||
                  }).catch(reject);
 | 
			
		||||
                });
 | 
			
		||||
              });
 | 
			
		||||
              Promise.all(files).then((files) => {
 | 
			
		||||
                process.env.DIRSIZECACHE = files.reduce((a, b)=>{
 | 
			
		||||
                  return a+b.size;
 | 
			
		||||
                }, 0);
 | 
			
		||||
                const oldestFile = files.sort((a, b) => a.ctime - b.ctime)[0].name;
 | 
			
		||||
                promises.rm(`${process.env.TEMPDIR}/${oldestFile}`);
 | 
			
		||||
                logger.log(`Removed oldest image file: ${oldestFile}`);
 | 
			
		||||
              });
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          await interaction[interaction.acknowledged ? "editOriginalMessage" : "createMessage"]("The resulting image was more than 8MB in size, so I can't upload it.");
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -142,6 +142,30 @@ export default async (client, cluster, worker, ipc, message) => {
 | 
			
		|||
              },
 | 
			
		||||
            }]
 | 
			
		||||
          }, reference));
 | 
			
		||||
          if (process.env.THRESHOLD) {
 | 
			
		||||
            process.env.DIRSIZECACHE += result.file.length;
 | 
			
		||||
            if (process.env.DIRSIZECACHE > process.env.THRESHOLD) {
 | 
			
		||||
              const files = (await promises.readdir(process.env.TEMPDIR)).map((file) => {
 | 
			
		||||
                return new Promise((resolve, reject) => {
 | 
			
		||||
                  promises.stat(`${process.env.TEMPDIR}/${file}`).then((fstats)=>{
 | 
			
		||||
                    resolve({
 | 
			
		||||
                      name: file,
 | 
			
		||||
                      size: fstats.size,
 | 
			
		||||
                      ctime: fstats.ctime
 | 
			
		||||
                    });
 | 
			
		||||
                  }).catch(reject);
 | 
			
		||||
                });
 | 
			
		||||
              });
 | 
			
		||||
              Promise.all(files).then((files) => {
 | 
			
		||||
                process.env.DIRSIZECACHE = files.reduce((a, b)=>{
 | 
			
		||||
                  return a+b.size;
 | 
			
		||||
                }, 0);
 | 
			
		||||
                const oldestFile = files.sort((a, b) => a.ctime - b.ctime)[0].name;
 | 
			
		||||
                promises.rm(`${process.env.TEMPDIR}/${oldestFile}`);
 | 
			
		||||
                log(`Removed oldest image file: ${oldestFile}`);
 | 
			
		||||
              });
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          await client.createMessage(message.channel.id, "The resulting image was more than 8MB in size, so I can't upload it.");
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue