Ejemplo n.º 1
0
 def __init__(self, leader):
     leader.group = self
     self.leader = leader
     self.members = []
     self.invites = set()
     self.instance = None
     self.channel = Channel('gchat', 'next', aliases=('g', 'gc', 'gt', 'gtell', 'gsay', 'gs'))
     ev.register('player_connect', self._player_connect)
Ejemplo n.º 2
0
class Group(ActionProvider, Attachable):
    target_keys = TargetKeys('group')

    def __init__(self, leader):
        leader.group = self
        self.leader = leader
        self.members = []
        self.invites = set()
        self.instance = None
        self.channel = Channel('gchat', 'next', aliases=('g', 'gc', 'gt', 'gtell', 'gsay', 'gs'))
        ev.register('player_connect', self._player_connect)

    def join(self, member):
        if not self.members:
            self._add_member(self.leader)
        self.msg("{} has joined the group".format(member.name))
        self._add_member(member)
        self.invites.remove(member)

    def _add_member(self, member):
        member.group = self
        self.channel.add_sub(member)
        self.members.append(member)
        member.enhance_soul(self)

    def decline(self, member):
        self.leader.display_line("{} has declined your group invitation.".format(member.name))
        self.invites.remove(member)
        self._check_empty()

    @obj_action()
    def leave(self, source, **_):
        self._remove_member(source)
        if len(self.members) > 1 and source == self.leader:
            self.leader = self.members[0]
            self.msg("{} is now the leader of the group.".format(self.leader.name))
        else:
            self._check_empty()

    def _remove_member(self, member):
        self.msg("{} has left the group.".format(member.name))
        member.group = None
        member.diminish_soul(self)
        self.channel.remove_sub(member)
        self.members.remove(member)

    def msg(self, msg):
        self.channel.send_msg(msg)

    def _check_empty(self):
        if self.invites:
            return
        if len(self.members) == 1:
            self._remove_member(self.members[0])
        self.channel.disband()
        self.detach()

    def _player_connect(self, player, *_):
        if player in self.members:
            self.msg("{} has reconnected.".format(player.name))

    def detach_shared(self, member):
        self.leave(member)