Mission = {} // type : enum [academic_record] // is_completed : boolean // info : map Mission.attrs = ["type", "is_completed"] Mission.init = function(mail) self.mail = mail self.inbox = mail.inbox self.meta_mail = mail.inbox.meta_mail self.is_completed = false if self.mail.content.indexOf("customer is satisfied") then self.is_completed = true end if self.set_type end function Mission.set_type = function // also code smell if self.mail.content.indexOf("academic record") then self.type = "academic_record" else if self.mail.content.indexOf("police record") then self.type = "police_record" end if end function Mission.info = function // code smell if self.type == "academic_record" then return self.get_academic_record_info else if self.type == "police_record" then return self.get_police_record_info end if end function Mission.get_academic_record_info = function info = {} info.remote_ip = self.mail.content[self.mail.content.indexOf("remote ip of the victim is"):][27:].split(char(10))[0][3:-4] info.database_ip = self.mail.content[self.mail.content.indexOf("database is located is"):][23:].split(char(10))[0][3:-4] info.student = self.mail.content[self.mail.content.indexOf("modify belongs to"):][19:].split(char(10))[0][3:-5] info.subject = self.mail.content[self.mail.content.indexOf("modify the subject"):][19:].split(" ")[0][3:-4] info.skip = false info.database_port = null router = get_router(info.remote_ip) for port in router.used_ports if router.port_info(port).indexOf("students") != null then info.database_port = port.port_number if port.is_closed == true then info.skip = true end if end if end for if info.database_port == null then info.skip = true end if return info end function Mission.get_police_record_info = function info = {} info.remote_ip = self.mail.content[self.mail.content.indexOf("remote ip of the victim is"):][27:].split(char(10))[0][3:-4] info.convicted = self.mail.content[self.mail.content.indexOf("modify belongs to"):][19:].split(char(10))[0][3:-5] info.skip = false info.database_port = null if self.mail.content.indexOf("client wants to delete the charge") then info.type = "delete" info.charge = self.mail.content[self.mail.content.indexOf("delete the charge of"):][21:].split(" ")[0][3:-5] else if self.mail.content.indexOf("client wants to add the charge") then info.type = "add" info.charge = self.mail.content[self.mail.content.indexOf("add the charge of"):][18:].split(" ")[0][3:-4] info.year = self.mail.content[self.mail.content.indexOf("in the year"):][12:].split(" ")[0][:-1] else info.type = "edit" info.charge = self.mail.content[self.mail.content.indexOf("modify the charge of"):][21:].split(" ")[0][3:-4] info.change = self.mail.content[self.mail.content.indexOf("date of the crime is"):][21:].split(char(10))[0] end if router = get_router(info.remote_ip) for port in router.used_ports if router.port_info(port).indexOf("criminals") != null then info.database_port = port.port_number if port.is_closed == true then info.skip = true end if end if end for if info.database_port == null then info.skip = true end if return info end function Mail = {} // id : string // from : string // subject : string // content : string Mail.attrs = ["id", "from", "subject"] Mail.init = function(inbox, str) self.inbox = inbox self.meta_mail = inbox.meta_mail self.id = str[str.indexOf("MailID: "):][8:].split(char(10))[0] self.from = str[str.indexOf("From: "):][6:].split(char(10))[0] self.subject = str[str.indexOf("Subject: "):][9:].split(char(10))[0] self.content = self.meta_mail.read(self.id) self.content = self.content[self.content.indexOf("Subject: "):].split(char(10))[1:].join(char(10)) if self.is_mission == true then self.mission = new Mission self.mission.init(self) end if end function Mail.is_mission = function return self.subject == "Mission Contract" end function Inbox = {} Inbox.init = function(email, password) self.meta_mail = mail_login(email, password) if self.meta_mail isa string then exit(self.meta_mail) end function Inbox.list = function mails = self.meta_mail.fetch() for i in mails.indexes m = new Mail m.init(self, mails[i]) mails[i] = m end for return mails end function Inbox.missions = function f = function(o) return o.is_mission == true end function missions = self.list.select(@f) f = function(o) return o.mission end function missions = missions.map(@f) f = function(o) return o.type end function missions = missions.lsort(@f) return missions end function Inbox.grouped_missions = function() missions = {} for m in self.missions if missions.hasIndex(m.type) == false then missions[m.type] = [] end if missions[m.type].push m end for return missions end function