aboutsummaryrefslogtreecommitdiff
path: root/commands/mod/ticket.js
blob: ba3c99ec2ede462c7db8ce8a03a6917523f3365b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
const Discord = require("discord.js")
const { EmbedBuilder } = require("discord.js");
const { PermissionsBitField, MessageAttachment } = require('discord.js');
const {upload_limit} = require("../../src/util")
const settings = require("../../src/settings")
const fs = require('fs');
let db = require("../../src/db")
let config_loc = __filename+".json"
let config = JSON.parse(fs.readFileSync(config_loc))
module.exports = {
  name: "ticket",
  command: ["ticket"],
  mod_only:true,
  config:config,
  config_loc:config_loc,
  async main(client,Discord,message,args) {
    let matt = Array.from(message.attachments, ([name, value]) => ({ name, value }))
    
    let action = args[0];
    let ticket_id = args[1];
    args.shift();args.shift();
    let r_message = args.join(' ')
    
    this.exec(client,{att:matt,action:action,ticket_id:ticket_id,r_message:r_message,message:message})
  },
  s_options:[{type:"string",name:"ticket",desc:"ticket id",required:true,autocomplete: async function(){ let tik = await db.Tickets.findAll({attributes:['ticket'],where:{status:'open'}}); let out = []; for(let t of tik) out.push(t.ticket); return out; }},
            {type:"string",name:"action",desc:"operation to perform",required:true,autocomplete:false,choices:["reply","close","dump"]},
            {type:"string",name:"message",desc:"message to reply with",required:false,autocomplete:false},
            {type:"attachment",name:"attachment",desc:"attachment to reply with",required:false,autocomplete:false}],
  async s_main(client,Discord,interaction){
    this.exec(client,{message:interaction,att:[interaction.options.getAttachment("attachment")] ?? [],action:interaction.options.getString("action"),
                    ticket_id:interaction.options.getString("ticket"),r_message:interaction.options.getString("message")})
  },
  async exec(client,param){
    let tickets;
    let date = new Date().toLocaleString()
    switch(param.action){
        case 'reply':
        case 'respond':
        case 'r':
            if(param.r_message==null&&param.att==null)
                return param.message.reply("you must provide a message or attachment")
            tickets = await db.Tickets.findAll({where:{status:'open',ticket:param.ticket_id}})
            if(tickets.length==0){
                tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
                if(tickets.length==0)
                    return param.message.reply("ticket not found:c")
                return param.message.reply("ticket is not open")
            }
            let ticket = tickets[0]
            let messages = JSON.parse(ticket.messages)
            messages.push({message:param.r_message,attachments:param.att,mod:true})
            db.Tickets.update({'messages':JSON.stringify(messages)},{where:{id:ticket.id}})
            
            const embed = new EmbedBuilder()
                .setTitle("Updated Ticket | "+ticket.ticket)
                .setColor(settings.defaultColor)
                .setDescription("Message: '"+param.r_message+"'")
                .setFooter({text:"Created: "+date})
            let smatt = []
            for(let att of param.att){
                if(att!=null)
                    smatt.push({attachment:att?.value?.url ?? att?.url})
            }
            param.message.client.users.cache.get(ticket.author).send({embeds:[embed],files:smatt})
            param.message.reply("updated ticket "+ticket.ticket);
            break;
        case 'close':
            tickets = await db.Tickets.findAll({where:{status:'open',ticket:param.ticket_id}})
            if(tickets.length==0){
                tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
                if(ticket.length==0)
                    return param.message.reply("ticket not found:c")
                return param.message.reply("ticket is already closed")
            }
            db.Tickets.update({'status':'closed'},{where:{id:tickets[0].id}})
            param.message.reply("closed ticket "+tickets[0].ticket);
            break;
        case 'dump':
        case 'list':
            if(param.ticket_id==null) return param.message.reply("you must provide a ticket id")
            tickets = await db.Tickets.findAll({where:{ticket:param.ticket_id}})
            if(tickets.length==0){
                return param.message.reply("ticket not found:c")
            }
            let filename = "/tmp/"+tickets[0].ticket+".json"
            fs.writeFileSync(filename,tickets[0].messages)
            let stats = fs.statSync(filename)
            if(stats.size / (1024*1024) > upload_limit(param.message.guild))
                return param.message.reply("file too large:( file is "+stats.size / (1024*1024)+"mb")
            param.message.reply({files:[filename]})
            break;
        default:
            param.message.reply("unknown action, try `sns help ticket`")
    }
  }
};