Files
drsingh dc4217b498 modified process scheduler, 510 compatibility, explosions moved to process
this is all very alpha please don't hate me too much if i fucked it up
2016-03-12 16:36:00 -08:00

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