mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-09 16:12:21 +01:00
dc4217b498
this is all very alpha please don't hate me too much if i fucked it up
251 lines
8.4 KiB
Plaintext
251 lines
8.4 KiB
Plaintext
//CONTENTS
|
|
//Email daemon thing
|
|
|
|
/datum/computer/file/mainframe_program/srv/email
|
|
name = "mail"
|
|
size = 1
|
|
|
|
var/setup_email_folder = "/etc/mail"
|
|
var/setup_mailgroup_table = "groups"
|
|
var/defaultDomain = "NT13"
|
|
|
|
initialize(var/initparams)
|
|
if (..() || !useracc)
|
|
mainframe_prog_exit
|
|
return
|
|
//todo: all of this. All of this forever.
|
|
|
|
//boutput(world, "[initparams]")
|
|
|
|
var/command = null
|
|
var/list/initlist = splittext(initparams, " ")
|
|
if (!initparams || !initlist.len)
|
|
command = "index"
|
|
else
|
|
command = ckey(initlist[1])
|
|
|
|
var/user_name = dd_hasprefix(useracc.user_name, "SRV") ? copytext(useracc.user_name, 4, length(useracc.user_name)) : copytext(useracc.user_name, 1, length(useracc.user_name))
|
|
|
|
//boutput(world, "Username: \"[useracc.user_name]\" -> \"[user_name]\"")
|
|
|
|
switch (command)
|
|
if ("index")
|
|
var/group = null
|
|
if (initlist.len > 1)
|
|
group = initlist[2]
|
|
var/list/mail_subjects = list_mail_subjects(user_name, group)
|
|
var/message = "mail_index"
|
|
if (mail_subjects.len)
|
|
message += "|n" + jointext(mail_subjects, "|n")
|
|
message_user(message, "record")
|
|
|
|
if ("get")
|
|
var/index = 0
|
|
var/group = null
|
|
if (initlist.len > 1)
|
|
index = max( round(text2num(initlist[2])), 1)
|
|
|
|
if (initlist.len > 2)
|
|
group = initlist[3]
|
|
|
|
var/list/mailList = list_mail_for(user_name, group)
|
|
if (!istype(mailList) || mailList.len < index)
|
|
mainframe_prog_exit
|
|
return
|
|
|
|
var/datum/computer/file/record/targetMail = mailList[index]
|
|
if (istype(targetMail) && parent_task)
|
|
targetMail = format_outgoing_mail(targetMail)
|
|
message_user("mail_entry",null,targetMail)
|
|
|
|
if ("send")
|
|
if (initlist.len > 1)
|
|
var/sentMailPath = initlist[2]
|
|
if (!dd_hasprefix(sentMailPath, "/"))
|
|
sentMailPath = "/[sentMailPath]"
|
|
|
|
var/datum/computer/file/record/sentMail = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[sentMailPath]"))
|
|
if (istype(sentMail))
|
|
sentMail = sentMail.copy_file()
|
|
sentMail.fields = sentMail.fields.Copy()
|
|
if (send_mail_to(sentMail) == 0)
|
|
message_user("ack")
|
|
else
|
|
message_user("nack")
|
|
|
|
if ("delete")
|
|
var/index = 0
|
|
var/group = null
|
|
if (initlist.len > 1)
|
|
index = max( round(text2num(initlist[2])), 1)
|
|
|
|
if (initlist.len > 2)
|
|
group = initlist[3]
|
|
|
|
var/list/mailList = list_mail_for(user_name, group)
|
|
if (!istype(mailList) || mailList.len < index)
|
|
mainframe_prog_exit
|
|
return
|
|
|
|
var/datum/computer/file/record/targetMail = mailList[index]
|
|
if (istype(targetMail) && dd_hassuffix(targetMail.name, user_name))
|
|
if (signal_program(1, list("command"=DWAINE_COMMAND_FKILL, "path"="[setup_email_folder]/[targetMail.name]")) == ESIG_SUCCESS)
|
|
message_user("ack")
|
|
else
|
|
message_user("nack")
|
|
else
|
|
message_user("nack")
|
|
|
|
mainframe_prog_exit
|
|
return
|
|
|
|
proc
|
|
format_outgoing_mail(var/datum/computer/file/record/mail)
|
|
if (!istype(mail) || !mail.fields || (mail.fields.len < 6))
|
|
return null
|
|
|
|
var/datum/computer/file/record/newMail = mail.copy_file()
|
|
newMail.fields = newMail.fields.Copy()
|
|
var/compactHeader = "mailnet=[mail.fields[1] ? mail.fields[1] : "???"]&group=[mail.fields[2] ? mail.fields[2] : "???"]"
|
|
compactHeader += "&sender=[mail.fields[3] ? mail.fields[3] : "???"]&target=[mail.fields[4] ? mail.fields[4] : "???"]"
|
|
compactHeader += "&priority=[mail.fields[5] ? mail.fields[5] : "LOW"]&subj=[mail.fields[6] ? mail.fields[6] : "???"]"
|
|
|
|
newMail.fields[1] = compactHeader
|
|
newMail.fields.Cut(2, 7)
|
|
|
|
return newMail
|
|
|
|
send_mail_to(var/datum/computer/file/record/mail)
|
|
if (!istype(mail) || !mail.fields.len)
|
|
return 1
|
|
|
|
var/list/mailHeader = params2list(mail.fields[1])
|
|
if (!mailHeader)
|
|
return 2
|
|
|
|
var/target = mailHeader["target"]
|
|
var/target_name = target
|
|
var/atLocation = findtext(target, "@")
|
|
if (atLocation)
|
|
target_name = copytext(target,1, atLocation)
|
|
|
|
var/mailgroup = ckey(mailHeader["group"]) ? mailHeader["group"] : "*NONE"
|
|
|
|
if (!target && !mailgroup)
|
|
return 3
|
|
|
|
var/datum/computer/folder/mailgroupTable = null
|
|
if (mailgroup && lowertext(mailgroup) != "*all" && lowertext(mailgroup) != "*none")
|
|
mailgroupTable = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[setup_email_folder]/[setup_mailgroup_table]"))
|
|
if (!istype(mailgroupTable))
|
|
return 4
|
|
|
|
mail.fields.Cut(1,2)
|
|
mail.name = "[copytext("\ref[mail]", 4, 12)][target_name ? lowertext(target_name) : "all"]"
|
|
mail.fields.Insert(1, "PUBLIC_NT", "[uppertext(mailgroup)]","[ckeyEx(mailHeader["sender"]) ? copytext(uppertext(ckeyEx(mailHeader["sender"])), 1, 33) : "???"][dd_hassuffix(mailHeader["sender"], "@[defaultDomain]") ? null : "@[defaultDomain]"]",\
|
|
"[target ? target : "ALL"]",\
|
|
"[ckeyEx(mailHeader["priority"]) ? copytext(uppertext(ckeyEx(mailHeader["priority"])), 1, 9) : "LOW"]",\
|
|
"[ckeyEx(mailHeader["subj"]) ? copytext(uppertext(mailHeader["subj"]), 1, 33) : "???"]")
|
|
|
|
if (signal_program(1, list("command"=DWAINE_COMMAND_FWRITE, "path"="[setup_email_folder]", "mkdir"=1), mail) == ESIG_SUCCESS)
|
|
return 0
|
|
|
|
return 5
|
|
|
|
list_mail_for(var/target, var/mailgroup=null)//"*all")
|
|
if (!target && !mailgroup)
|
|
return
|
|
|
|
var/list/mailList = list()
|
|
var/datum/computer/folder/mailFolder = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[setup_email_folder]"))
|
|
if (!istype(mailFolder))
|
|
return mailList
|
|
|
|
var/datum/computer/file/record/mailgroupTable = null
|
|
var/list/groupTargets = null
|
|
if (!(mailgroup && lowertext(mailgroup) != "*all"))
|
|
groupTargets = list()
|
|
mailgroupTable = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[setup_email_folder]/[setup_mailgroup_table]"))
|
|
if (istype(mailgroupTable))
|
|
for (var/groupDef in mailgroupTable.fields)
|
|
if (findtext(groupDef, "[target],"))
|
|
groupTargets += "[copytext(groupDef, 1, findtext(groupDef, ":"))]"
|
|
break
|
|
|
|
for(var/datum/computer/file/record/emailRec in mailFolder.contents)
|
|
if (!check_read_permission(emailRec, useracc))
|
|
continue
|
|
|
|
if ((emailRec.fields.len >= 2) && lowertext(emailRec.fields[2]) == "*all")
|
|
mailList += emailRec
|
|
continue
|
|
|
|
if (groupTargets && groupTargets.len)
|
|
var/success = 0
|
|
for (var/groupMember in groupTargets)
|
|
if (emailRec.fields.len >= 2 && (lowertext(groupMember) == lowertext(emailRec.fields[2])))
|
|
mailList += emailRec
|
|
success = 1
|
|
break
|
|
|
|
if (success)
|
|
continue
|
|
|
|
if (target && dd_hassuffix(emailRec.name, target))
|
|
mailList += emailRec
|
|
continue
|
|
|
|
return mailList
|
|
|
|
|
|
list_mail_subjects(var/target, var/mailgroup=null)//"*all")
|
|
if (!target && !mailgroup)
|
|
return
|
|
|
|
var/list/mailSubjs = list()
|
|
var/datum/computer/folder/mailFolder = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[setup_email_folder]"))
|
|
if (!istype(mailFolder))
|
|
return mailSubjs
|
|
|
|
var/datum/computer/file/record/mailgroupTable = null
|
|
var/list/groupTargets = null
|
|
if (!(mailgroup && lowertext(mailgroup) != "*all"))
|
|
groupTargets = list()
|
|
mailgroupTable = signal_program(1, list("command"=DWAINE_COMMAND_FGET, "path"="[setup_email_folder]/[setup_mailgroup_table]"))
|
|
if (istype(mailgroupTable))
|
|
for (var/groupDef in mailgroupTable.fields)
|
|
if (findtext(groupDef, "[target],"))
|
|
groupTargets += "[copytext(groupDef, 1, findtext(groupDef, ":"))]"
|
|
break
|
|
|
|
for(var/datum/computer/file/record/emailRec in mailFolder.contents)
|
|
if (!check_read_permission(emailRec, useracc))
|
|
continue
|
|
|
|
if (!emailRec.fields || emailRec.fields.len < 6)
|
|
continue
|
|
|
|
if (lowertext(emailRec.fields[2]) == "*all")
|
|
mailSubjs.len++
|
|
mailSubjs[mailSubjs.len] = copytext(emailRec.fields[6], 1, 33)
|
|
continue
|
|
|
|
if (groupTargets && groupTargets.len)
|
|
var/success = 0
|
|
for (var/groupMember in groupTargets)
|
|
if (lowertext(groupMember) == lowertext(emailRec.fields[2]))
|
|
mailSubjs.len++
|
|
mailSubjs[mailSubjs.len] = copytext(emailRec.fields[6], 1, 33)
|
|
success = 1
|
|
break
|
|
|
|
if (success)
|
|
continue
|
|
|
|
if (target && dd_hassuffix(emailRec.name, target))
|
|
mailSubjs.len++
|
|
mailSubjs[mailSubjs.len] = copytext(emailRec.fields[6], 1, 33)
|
|
continue
|
|
|
|
return mailSubjs
|