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&¶m.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`")
}
}
};
|