Turned comms into typeclassed objects.

This commit is contained in:
Kelketek 2013-09-28 22:23:30 -05:00
parent 39b69dcdc2
commit 851e6d00cc
28 changed files with 1000 additions and 291 deletions

View file

@ -6,11 +6,12 @@ import itertools
from django.db import models
from django.db.models import Q
from django.contrib.contenttypes.models import ContentType
from src.typeclasses.managers import returns_typeclass_list, returns_typeclass
_GA = object.__getattribute__
_PlayerDB = None
_ObjectDB = None
_Channel = None
_ChannelDB = None
_SESSIONS = None
_ExternalConnection = None
_User = None
@ -45,13 +46,13 @@ def dbref(dbref, reqhash=True):
def identify_object(inp):
"identify if an object is a player or an object; return its database model"
# load global stores
global _PlayerDB, _ObjectDB, _Channel, _ExternalConnection, _User
global _PlayerDB, _ObjectDB, _ChannelDB, _ExternalConnection, _User
if not _PlayerDB:
from src.players.models import PlayerDB as _PlayerDB
if not _ObjectDB:
from src.objects.models import ObjectDB as _ObjectDB
if not _Channel:
from src.comms.models import Channel as _Channel
if not _ChannelDB:
from src.comms.models import ChannelDB as _ChannelDB
if not _ExternalConnection:
from src.comms.models import ExternalChannelConnection as _ExternalConnection
if not _User:
@ -66,7 +67,7 @@ def identify_object(inp):
typ = type(obj)
if typ == _PlayerDB: return obj, "player"
elif typ == _ObjectDB: return obj, "object"
elif typ == _Channel: return obj, "channel"
elif typ == _ChannelDB: return obj, "channel"
elif dbref(obj): return dbref(obj), "dbref"
elif typ == basestring: return obj, "string"
elif typ == _ExternalConnection: return obj, "external"
@ -96,8 +97,8 @@ def to_object(inp, objtype='player'):
print objtype, inp, obj, typ, type(inp)
raise CommError()
elif objtype == 'channel':
if typ == 'string': return _Channel.objects.get(db_key__iexact=obj)
if typ == 'dbref': return _Channel.objects.get(id=obj)
if typ == 'string': return _ChannelDB.objects.get(db_key__iexact=obj)
if typ == 'dbref': return _ChannelDB.objects.get(id=obj)
print objtype, inp, obj, typ, type(inp)
raise CommError()
elif objtype == 'external':
@ -262,13 +263,14 @@ class ChannelManager(models.Manager):
channel_search (equivalent to ev.search_channel)
"""
@returns_typeclass_list
def get_all_channels(self):
"""
Returns all channels in game.
"""
return self.all()
@returns_typeclass
def get_channel(self, channelkey):
"""
Return the channel object if given its key.
@ -279,7 +281,7 @@ class ChannelManager(models.Manager):
if not channels:
# also check aliases
channels = [channel for channel in self.all()
if channelkey in channel.aliases]
if channelkey in channel.aliases.all()]
if channels:
return channels[0]
return None
@ -319,7 +321,7 @@ class ChannelManager(models.Manager):
unique_online_users = set(sess.uid for sess in session_list if sess.logged_in)
online_players = (sess.get_player() for sess in session_list if sess.uid in unique_online_users)
for player in online_players:
players.extend(PlayerChannelConnection.objects.filter(db_player=player, db_channel=channel))
players.extend(PlayerChannelConnection.objects.filter(db_player=player.dbobj, db_channel=channel))
else:
players.extend(PlayerChannelConnection.objects.get_all_connections(channel))
@ -327,6 +329,7 @@ class ChannelManager(models.Manager):
return itertools.chain(players, external_connections)
@returns_typeclass_list
def channel_search(self, ostring):
"""
Search the channel database for a particular channel.
@ -345,7 +348,7 @@ class ChannelManager(models.Manager):
channels = self.filter(db_key__iexact=ostring)
if not channels:
# still no match. Search by alias.
channels = [channel for channel in self.all() if ostring.lower() in [a.lower for a in channel.aliases]]
channels = [channel for channel in self.all() if ostring.lower() in [a.lower for a in channel.aliases.all()]]
return channels
#
@ -371,7 +374,7 @@ class PlayerChannelConnectionManager(models.Manager):
break_connection
"""
@returns_typeclass_list
def get_all_player_connections(self, player):
"Get all connections that the given player has."
player = to_object(player)
@ -380,7 +383,8 @@ class PlayerChannelConnectionManager(models.Manager):
def has_player_connection(self, player, channel):
"Checks so a connection exists player<->channel"
if player and channel:
return self.filter(db_player=player).filter(db_channel=channel).count() > 0
return self.filter(db_player=player.dbobj).filter(
db_channel=channel.dbobj).count() > 0
return False
def get_all_connections(self, channel):