195 lines
12 KiB
TypeScript
195 lines
12 KiB
TypeScript
///////////////////////////////////////
|
|
//TRANSCRIPT CREATION SYSTEM
|
|
///////////////////////////////////////
|
|
import {opendiscord, api, utilities} from "../index.js"
|
|
import * as discord from "discord.js"
|
|
|
|
const transcriptConfig = opendiscord.configs.get("opendiscord:transcripts")
|
|
|
|
export const registerActions = async () => {
|
|
opendiscord.actions.add(new api.ODAction("opendiscord:create-transcript"))
|
|
opendiscord.actions.get("opendiscord:create-transcript").workers.add([
|
|
new api.ODWorker("opendiscord:select-compiler",4,async (instance,params,source,cancel) => {
|
|
const {channel,user,ticket} = params
|
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
|
if (!transcriptConfig.data.general.enabled) return cancel()
|
|
|
|
await opendiscord.events.get("onTranscriptCreate").emit([opendiscord.transcripts,ticket,channel,user])
|
|
|
|
instance.errorReason = null
|
|
const participants = await opendiscord.tickets.getAllTicketParticipants(params.ticket)
|
|
if (!participants){
|
|
instance.pendingMessage = null
|
|
instance.errorReason = "Unable to fetch ticket channel participants!"
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Unable to fetch ticket channel participants!")
|
|
}
|
|
instance.participants = participants
|
|
|
|
//select transcript compiler
|
|
if (transcriptConfig.data.general.mode == "text") instance.compiler = opendiscord.transcripts.get("opendiscord:text-compiler")
|
|
else if (transcriptConfig.data.general.mode == "html") instance.compiler = opendiscord.transcripts.get("opendiscord:html-compiler")
|
|
}),
|
|
new api.ODWorker("opendiscord:init-transcript",3,async (instance,params,source,cancel) => {
|
|
const {channel,user,ticket} = params
|
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
|
if (!transcriptConfig.data.general.enabled) return cancel()
|
|
if (!instance.compiler){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:init-transcript) => Instance is missing transcript compiler!")
|
|
}
|
|
|
|
//run transcript compiler init()
|
|
await opendiscord.events.get("onTranscriptInit").emit([opendiscord.transcripts,ticket,channel,user])
|
|
if (instance.compiler.init){
|
|
try{
|
|
instance.initData = null
|
|
const result = await instance.compiler.init(ticket,channel,user)
|
|
instance.initData = result.initData
|
|
if (result.success && result.pendingMessage && transcriptConfig.data.general.enableChannel){
|
|
//send init message to channel
|
|
const post = opendiscord.posts.get("opendiscord:transcripts")
|
|
if (post){
|
|
instance.pendingMessage = await post.send(result.pendingMessage)
|
|
}
|
|
}else if (!result.success){
|
|
instance.pendingMessage = null
|
|
instance.errorReason = result.errorReason
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Init Error => "+result.errorReason)
|
|
}else{
|
|
instance.pendingMessage = null
|
|
}
|
|
}catch(err){
|
|
instance.success = false
|
|
cancel()
|
|
process.emit("uncaughtException",err)
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler init()! (see error above)")
|
|
}
|
|
}
|
|
await opendiscord.events.get("afterTranscriptInitiated").emit([opendiscord.transcripts,ticket,channel,user])
|
|
}),
|
|
new api.ODWorker("opendiscord:compile-transcript",2,async (instance,params,source,cancel) => {
|
|
const {channel,user,ticket} = params
|
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
|
if (!instance.compiler){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:compile-transcript) => Instance is missing transcript compiler!")
|
|
}
|
|
if (typeof instance.initData == "undefined"){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:compile-transcript) => Instance is missing transcript initData!")
|
|
}
|
|
|
|
//run transcript compiler compile()
|
|
await opendiscord.events.get("onTranscriptCompile").emit([opendiscord.transcripts,ticket,channel,user])
|
|
if (instance.compiler.compile){
|
|
try{
|
|
const result = await instance.compiler.compile(ticket,channel,user,instance.initData)
|
|
if (!result.success){
|
|
instance.errorReason = result.errorReason
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Compiler Error => "+result.errorReason)
|
|
}else{
|
|
instance.result = result
|
|
instance.success = true
|
|
}
|
|
}catch(err){
|
|
instance.success = false
|
|
cancel()
|
|
process.emit("uncaughtException",err)
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler compile()! (see error above)")
|
|
}
|
|
}
|
|
await opendiscord.events.get("afterTranscriptCompiled").emit([opendiscord.transcripts,ticket,channel,user])
|
|
}),
|
|
new api.ODWorker("opendiscord:ready-transcript",1,async (instance,params,source,cancel) => {
|
|
if (!instance.compiler){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:ready-transcript) => Instance is missing transcript compiler! (1)")
|
|
}
|
|
if (!instance.result){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:ready-transcript) => Instance is missing transcript result! (1)")
|
|
}
|
|
|
|
//run transcript compiler ready()
|
|
utilities.runAsync(async () => {
|
|
if (!instance.compiler){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:ready-transcript) => Instance is missing transcript compiler! (2)")
|
|
}
|
|
if (!instance.result){
|
|
instance.success = false
|
|
cancel()
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:ready-transcript) => Instance is missing transcript result! (2)")
|
|
}
|
|
|
|
await opendiscord.events.get("onTranscriptReady").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
|
if (instance.compiler.ready){
|
|
try{
|
|
const {channelMessage,creatorDmMessage,participantDmMessage,activeAdminDmMessage,everyAdminDmMessage} = await instance.compiler.ready(instance.result)
|
|
|
|
//send channel message
|
|
if (transcriptConfig.data.general.enableChannel && channelMessage){
|
|
if (instance.pendingMessage && instance.pendingMessage.message && instance.pendingMessage.success){
|
|
//edit "pending" message to be the "ready" message
|
|
instance.pendingMessage.message.edit(channelMessage.message)
|
|
}else{
|
|
//send ready message to channel
|
|
const post = opendiscord.posts.get("opendiscord:transcripts")
|
|
if (post) await post.send(channelMessage)
|
|
}
|
|
}
|
|
|
|
//send dm mesages
|
|
if (instance.participants){
|
|
for (const p of instance.participants){
|
|
if (p.role == "creator" && transcriptConfig.data.general.enableCreatorDM && creatorDmMessage){
|
|
//send creator dm message
|
|
await opendiscord.client.sendUserDm(p.user,creatorDmMessage)
|
|
}else if (p.role == "participant" && transcriptConfig.data.general.enableParticipantDM && participantDmMessage){
|
|
//send participant dm message
|
|
await opendiscord.client.sendUserDm(p.user,participantDmMessage)
|
|
}else if (p.role == "admin" && transcriptConfig.data.general.enableActiveAdminDM && instance.result.success && instance.result.messages && instance.result.messages.some((msg) => msg.author.id == p.user.id) && activeAdminDmMessage){
|
|
//send active admin dm message
|
|
await opendiscord.client.sendUserDm(p.user,activeAdminDmMessage)
|
|
}else if (p.role == "admin" && transcriptConfig.data.general.enableEveryAdminDM && everyAdminDmMessage){
|
|
//send every admin dm message
|
|
await opendiscord.client.sendUserDm(p.user,everyAdminDmMessage)
|
|
}
|
|
}
|
|
}
|
|
|
|
}catch(err){
|
|
instance.success = false
|
|
cancel()
|
|
process.emit("uncaughtException",err)
|
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler ready()! (see error above)")
|
|
}
|
|
}
|
|
await opendiscord.events.get("afterTranscriptReady").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
|
})
|
|
|
|
//update stats
|
|
await opendiscord.statistics.get("opendiscord:global").setStat("opendiscord:transcripts-created",1,"increase")
|
|
await opendiscord.statistics.get("opendiscord:user").setStat("opendiscord:transcripts-created",params.user.id,1,"increase")
|
|
await opendiscord.events.get("afterTranscriptCreated").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
|
}),
|
|
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
|
|
const {user,channel,ticket} = params
|
|
opendiscord.log(user.displayName+" created a transcript!","info",[
|
|
{key:"user",value:user.username},
|
|
{key:"userid",value:user.id,hidden:true},
|
|
{key:"channel",value:"#"+channel.name},
|
|
{key:"channelid",value:channel.id,hidden:true},
|
|
{key:"option",value:ticket.option.id.value},
|
|
{key:"method",value:source,hidden:true},
|
|
{key:"compiler",value:instance.compiler?.id.value ?? "<unknown-compiler>"},
|
|
])
|
|
})
|
|
])
|
|
} |