Skip to content
This repository has been archived by the owner on Oct 19, 2019. It is now read-only.

Commit

Permalink
Implement intra-zone messages.
Browse files Browse the repository at this point in the history
This is the first half of #9 and #10.

Also adds support to clientlib for intra-zone messages.
  • Loading branch information
cnelsonsic committed Aug 3, 2012
1 parent 66a7f1d commit 5953637
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 2 deletions.
27 changes: 27 additions & 0 deletions clientlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ def __init__(self, username=None, password=None):
self.last_object_update = datetime.datetime(2010, 1, 1)
self.objects = {}

self.last_message_update = datetime.datetime(2010, 1, 1)
self.messages = {}

self.last_user = None
self.cookies = {}
if username and password:
Expand Down Expand Up @@ -324,6 +327,30 @@ def get_objects(self, zone=None):
self.last_object_update = datetime.datetime.now()
return objects

def get_messages(self, zone=None):
'''Get messages from the zone only.
In the future, get game-wide messages.'''
if zone is None:
zone = self.get_zone_url()

if "http://" not in zone:
# zone is probably a zoneid
zone = self.zones.get(zone)

data = {"since": self.last_message_update.strftime(settings.DATETIME_FORMAT)}
r = self.get(zone, '/messages', cookies=self.cookies, params=data)

if r.status_code == 200:
messages = json.loads(r.content)
for msg in messages:
msgid = msg.get('_id', {}).get('$oid')
self.messages[msgid] = msg
else:
raise UnexpectedHTTPStatus("ZoneServer %s" % zone, r.status_code, r.content)

self.last_message_update = datetime.datetime.now()
return messages

def set_character_status(self, character, status='online'):
char = self.get_char_obj(character_name=character)

Expand Down
17 changes: 17 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,23 @@ def test_scriptserver(self):
matches = any([linnea['loc'][attr] != updated_linnea['loc'][attr] for attr in ('x', 'y', 'z')])
self.assertTrue(matches)

def test_get_messages(self):
c = clientlib.Client(username=settings.DEFAULT_USERNAME, password=settings.DEFAULT_PASSWORD)
character = self.character
# Override the character's zone:
zone = 'playerinstance-AdventureDungeon-%s' % character
c.characters[character].zone = zone
c.set_online(character)
c.get_objects()

# Poke Linnea to make her talk
linnea = self.get_linnea(c.objects)
c.activate(linnea['id'])

c.get_messages()
self.assertTrue(c.messages)



if __name__ == '__main__':
unittest.main()
28 changes: 26 additions & 2 deletions zoneserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@

import mongoengine as me

from mongoengine_models import Character, Object, IntVector, ScriptedObject
from mongoengine_models import Character, Object, IntVector, ScriptedObject, Message
from games.objects.basescript import Script


Expand Down Expand Up @@ -287,7 +287,30 @@ def post(self):
raise tornado.web.HTTPError(403)

class MessageHandler(BaseHandler):
pass
'''MessageHandler returns a list of messages.'''

@tornado.web.authenticated
def get(self):
since = datetime.datetime.strptime(self.get_argument('since', '2010-01-01 00:00:00:000000'), DATETIME_FORMAT)
if since.year == 2010:
since = None
msgs = [m.to_mongo() for m in self.get_messages(since)]
retval = json.dumps(msgs, default=json_util.default)
self.content_type = 'application/json'
self.write(retval)

def get_messages(self, since=None):
'''Gets a list of messages in the zone.
Should not be called without an argument except when
a client connects to the zone initially.'''

# Query the mongo messages database
if since is not None:
messages = Message.objects(last_modified__gte=since)
else:
messages = Message.objects

return messages

class ScriptedObjectHandler(BaseHandler):
@tornado.web.authenticated
Expand Down Expand Up @@ -365,6 +388,7 @@ def main():
handlers.append((r"/setstatus", CharStatusHandler))
handlers.append((r"/movement", MovementHandler))
handlers.append((r"/admin", AdminHandler))
handlers.append((r"/messages", MessageHandler))
handlers.append((r"/activate/(.*)", ScriptedObjectHandler))

server = BaseServer(handlers)
Expand Down

0 comments on commit 5953637

Please sign in to comment.