mirror of
https://github.com/evennia/evennia.git
synced 2026-03-30 12:37:16 +02:00
mail.py
In-game mail system.
This commit is contained in:
parent
744cf4dd08
commit
c2cc063a78
1 changed files with 194 additions and 0 deletions
194
evennia/contrib/mail.py
Normal file
194
evennia/contrib/mail.py
Normal file
|
|
@ -0,0 +1,194 @@
|
|||
"""
|
||||
In-Game Mail system
|
||||
|
||||
Evennia Contribution - grungies1138 2016
|
||||
|
||||
A simple Brandymail style @mail system that uses the Msg class from Evennia Core.
|
||||
|
||||
Installation:
|
||||
Import this module into the default Player or Character commandset.
|
||||
"""
|
||||
|
||||
from evennia import default_cmds, search_object
|
||||
from evennia.utils import create, utils, evtable, evform
|
||||
from evennia.comms.models import Msg
|
||||
|
||||
|
||||
HEAD_CHAR = "|015-|n"
|
||||
SUB_HEAD_CHAR = "-"
|
||||
|
||||
class MailCommand(default_cmds.MuxCommand):
|
||||
"""
|
||||
Commands that allow either IC or OOC communications
|
||||
|
||||
Usage:
|
||||
{w@mail{n
|
||||
- Displays all the mail a player has in their mailbox
|
||||
|
||||
{w@mail <#>{n
|
||||
- Displays a specific message
|
||||
|
||||
{w@mail <players>=<subject>/<message>{n
|
||||
- Sends a message to the comma separated list of players.
|
||||
|
||||
{w@mail/delete <#>{n
|
||||
- Deletes a specific message
|
||||
|
||||
{w@mail/forward <player list>=<#>[/<Message>]{n
|
||||
- Forwards an existing message to the specified list of players,
|
||||
original message is delivered with optional Message prepended.
|
||||
|
||||
{w@mail/reply <#>=<message>{n
|
||||
- Replies to a message #. Prepends message to the original
|
||||
message text.
|
||||
|
||||
|
||||
Status Legend:
|
||||
'{wU{n' = Unread/New message
|
||||
'{wO{n' = Read/Old message
|
||||
'{wR{n' = Replied to
|
||||
'{wF{n' = Forwarded
|
||||
"""
|
||||
key = "@mail"
|
||||
aliases = ["mail"]
|
||||
lock = "cmd:all()"
|
||||
help_category = "General"
|
||||
|
||||
def func(self):
|
||||
subject = ""
|
||||
body = ""
|
||||
if self.switches or self.args:
|
||||
if "delete" in self.switches:
|
||||
if not self.lhs:
|
||||
self.caller.msg("No Message ID given. Unable to delete.")
|
||||
return
|
||||
else:
|
||||
if self.get_all_mail()[int(self.lhs) - 1]:
|
||||
self.get_all_mail()[int(self.lhs) - 1].delete()
|
||||
self.caller.msg("Message %s deleted" % self.lhs)
|
||||
else:
|
||||
self.caller.msg("That message does not exist.")
|
||||
return
|
||||
elif "forward" in self.switches:
|
||||
if not self.rhs:
|
||||
self.caller.msg("Cannot forward a message without a player list. Please try again.")
|
||||
return
|
||||
elif not self.lhs:
|
||||
self.caller.msg("You must define a message to forward.")
|
||||
return
|
||||
else:
|
||||
if "/" in self.rhs:
|
||||
message_number, message = self.rhs.split("/")
|
||||
if self.get_all_mail()[int(message_number) - 1]:
|
||||
old_message = self.get_all_mail()[int(message_number) - 1]
|
||||
|
||||
self.send_mail(self.lhslist, "FWD: " + old_message.header,
|
||||
message + "\n---- Original Message ----\n" + old_message.message,
|
||||
self.caller)
|
||||
self.caller.msg("Message forwarded.")
|
||||
else:
|
||||
self.caller.msg("Message does not exist.")
|
||||
return
|
||||
else:
|
||||
if self.get_all_mail()[int(self.rhs) - 1]:
|
||||
old_message = self.get_all_mail()[int(self.rhs) - 1]
|
||||
self.send_mail(self.lhslist, "FWD: " + old_message.header,
|
||||
"\n---- Original Message ----\n" + old_message.message, self.caller)
|
||||
self.caller.msg("Message forwarded.")
|
||||
old_message.tags.remove("u", category="mail")
|
||||
old_message.tags.add("f", category="mail")
|
||||
else:
|
||||
self.caller.msg("Message does not exist.")
|
||||
return
|
||||
elif "reply" in self.switches:
|
||||
if not self.rhs:
|
||||
self.caller.msg("You must define a message to reply to.")
|
||||
return
|
||||
elif not self.lhs:
|
||||
self.caller.msg("You must supply a reply message")
|
||||
return
|
||||
else:
|
||||
if self.get_all_mail()[int(self.lhs) - 1]:
|
||||
old_message = self.get_all_mail()[int(self.lhs) - 1]
|
||||
self.send_mail(old_message.senders, "RE: " + old_message.header,
|
||||
self.rhs + "\n---- Original Message ----\n" + old_message.message, self.caller)
|
||||
old_message.tags.remove("u", category="mail")
|
||||
old_message.tags.add("r", category="mail")
|
||||
return
|
||||
else:
|
||||
self.caller.msg("Message does not exist.")
|
||||
return
|
||||
|
||||
else:
|
||||
if self.rhs:
|
||||
if "/" in self.rhs:
|
||||
subject, body = self.rhs.split("/", 1)
|
||||
else:
|
||||
body = self.rhs
|
||||
self.send_mail(self.lhslist, subject, body, self.caller)
|
||||
else:
|
||||
message = self.get_all_mail()[int(self.lhs) - 1]
|
||||
|
||||
messageForm = []
|
||||
if message:
|
||||
messageForm.append(HEAD_CHAR * 78)
|
||||
messageForm.append("{wFrom:{n %s" % (message.senders[0].key))
|
||||
messageForm.append("{wSent:{n %s" % message.db_date_created.strftime("%m/%d/%Y %H:%M:%S"))
|
||||
messageForm.append("{wSubject:{n %s" % message.header)
|
||||
messageForm.append(SUB_HEAD_CHAR * 78)
|
||||
messageForm.append(message.message)
|
||||
messageForm.append(HEAD_CHAR * 78)
|
||||
self.caller.msg("\n".join(messageForm))
|
||||
message.tags.remove("u", category="mail")
|
||||
message.tags.add("o", category="mail")
|
||||
|
||||
else:
|
||||
messages = self.get_all_mail()
|
||||
|
||||
if messages:
|
||||
table = evtable.EvTable("{wID:", "{wFrom:", "{wSubject:", "{wDate:{n", "{wSta:{n",
|
||||
table=None, border="header", header_line_char=SUB_HEAD_CHAR, width=78)
|
||||
index = 1
|
||||
for message in messages:
|
||||
table.add_row(index, message.senders[0], message.header,
|
||||
message.db_date_created.strftime("%m/%d/%Y"),
|
||||
str(message.db_tags.last().db_key.upper()))
|
||||
index += 1
|
||||
|
||||
table.reformat_column(0, width=6)
|
||||
table.reformat_column(1, width=17)
|
||||
table.reformat_column(2, width=34)
|
||||
table.reformat_column(3, width=13)
|
||||
table.reformat_column(4, width=7)
|
||||
|
||||
self.caller.msg(HEAD_CHAR * 78)
|
||||
self.caller.msg(table)
|
||||
self.caller.msg(HEAD_CHAR * 78)
|
||||
else:
|
||||
self.caller.msg("Sorry, you don't have any messages. What a pathetic loser!")
|
||||
|
||||
def get_all_mail(self):
|
||||
mail_messages = Msg.objects.get_by_tag(category="mail")
|
||||
messages = []
|
||||
messages = [m for m in mail_messages if self.caller.player in m.receivers]
|
||||
return messages
|
||||
|
||||
def send_mail(self, recipients, subject, message, caller):
|
||||
recobjs = []
|
||||
for char in recipients:
|
||||
|
||||
if self.caller.player.search(char) is not None:
|
||||
recobjs.append(self.caller.player.search(char))
|
||||
if recobjs:
|
||||
lock_string = ""
|
||||
for recipient in recobjs:
|
||||
recipient.msg("You have received a new @mail from %s" % caller)
|
||||
|
||||
new_message = create.create_message(self.caller, message, receivers=recipient, header=subject)
|
||||
new_message.tags.add("U", category="mail")
|
||||
|
||||
caller.msg("You sent a your message.")
|
||||
return
|
||||
else:
|
||||
caller.msg("No valid players found. Cannot send message.")
|
||||
return
|
||||
Loading…
Add table
Add a link
Reference in a new issue