def return_appearance(self, looker, **kwargs):
     """
     This formats a description. It is the hook a 'look' command
     should call.
     
     The Stash will not have any objects stored inside it. We collect all
     the objects the Player currently has in it's Stash by pulling the tag
     and presents it as the Stash's contents.
     
     Args:
         looker (Object): Object doing the looking.
         **kwargs (dict): Arbitrary, optional arguments for users
             overriding the call (unused by default).
     """
     if not looker:
         return ""
     # get and identify all objects
     tagged_objs = evennia.search_tag(looker.dbref, category="stash")
                
     string = "|c%s|n\n" % self.get_display_name(looker)
     desc = self.db.desc
     if desc:
         string += "%s" % desc
     if tagged_objs:
         string += "\n|wContents:|n "
         for obj in tagged_objs:
             string += "%s - %s" % (obj.name, obj.db.desc.strip('\n')[0:80-(len(obj.name)+6)] + "...")
Exemple #2
0
    def goto_next_room(self):
        if hasattr(self, 'db.hometown'):
            hometown = self.db.hometown

        location = self.location
        exits = [
            o for o in location.contents
            if o.location is location and o.destination
        ]
        options = len(exits) + 1
        direction = random.randint(1, options)
        if direction <= len(exits):
            new_room = random.choice(exits)
            hometown = ''
            if hasattr(self.db, 'hometown'):
                hometown = self.db.hometown
                possible_rooms = evennia.search_tag(hometown, category="zone")

                can_go = False
                for pr in possible_rooms:
                    if new_room.destination.dbref == pr.dbref:
                        can_go = True
                if not can_go:
                    return

            self.move_to(new_room)
Exemple #3
0
    def func(self):
        """Execute the command."""
        screen = self.screen
        sender = screen.app.phone_number
        recipients = list(screen.db.get("recipients", []))
        if not recipients:
            self.msg("You haven't specified at least one recipient.")
            screen.display()
            return

        content = screen.db.get("content")
        if not content:
            self.msg("This text is empty, write something before sending it.")
            screen.display()
            return

        # Send the new text
        text = Text.objects.send(sender, recipients, content)
        thread = text.thread
        self.msg("Thanks, your message has been sent successfully.")
        if screen.db.get("go_back", True):
            screen.back()
        else:
            del screen.db["content"]

        # Notify the recipients
        for number in text.recipients:
            devices = search_tag(number, category="phone number")
            for device in devices:
                NewTextScreen.notify(device, text)
    def func(self):
        """implements the command."""

        caller = self.caller
        # If no args
        if not self.args:
            caller.msg("Get what?")
            return

        # 1. lhs = "wooden sword"; rhs = ""
        # 2. lhs = "Big book"; rhs = "old bookshelf"
        if self.rhs:
            location = caller.search(self.rhs)
        else:
            location = caller.location
        if not location:
            return
        
        # TO DO Add some sort of check that you can get objects from target

        # Get Object. We have to allow for Player Stash
        if isinstance(location, Stash):
            obj = caller.search(self.lhs,
                                candidates=evennia.search_tag(caller.dbref,
                                                              category="stash"))
        else:
            obj = caller.search(self.lhs, location=location)
        if not obj:
            return
        if caller == obj:
            caller.msg("You can't get yourself.")
            return
        if not obj.access(caller, 'get'):
            if obj.db.get_err_msg:
                caller.msg(obj.db.get_err_msg)
            else:
                caller.msg("You can't get that.")
            return

        # calling at_before_get hook method
        if not obj.at_before_get(caller):
            return

        obj.move_to(caller, quiet=True)
        if self.rhs:
            caller.msg("You pick up %s from %s." % (obj.name, location.name))
            caller.location.msg_contents("%s picks up %s from %s." % 
                                         (caller.name, obj.name, location.name),
                                         exclude=caller)
        else:
            caller.msg("You pick up %s." % obj.name)
            caller.location.msg_contents("%s picks up %s." %
                                         (caller.name, obj.name),
                                         exclude=caller)

        # calling at_get hook method
        obj.at_get(caller)
Exemple #5
0
def prīmā_lūce():
    """ When the sun rises, display a message in every room. """
    # Browse all rooms
    for locus in Locus.objects.all():
        locus.msg_contents("|ySōl orītur.|n")

    # Set "dark" = False for external rooms
    externa = evennia.search_tag("forīs", category="zōna")
    for e in externa:
        e.db.āter=False
Exemple #6
0
def occāsū():
    """ When the sun sets, display a message in every room. """
    # Browse all rooms
    for locus in Locus.objects.all():
        locus.msg_contents("|rSōl occidit.|n")

    # Set "dark" = True for external rooms
    externa = evennia.search_tag("forīs", category="zōnā")
    for e in externa:
        e.db.āter=True
Exemple #7
0
    def message_occupants(self, msg, exclude=[]):
        """
        Called to message all occupants of 'place'
        
        Checks occupants are still at location and sends message.
        """
        occupants = evennia.search_tag(self.dbref, category="places")

        # Remove stale occupants and exclude specified.
        for occupant in occupants:
            if not occupant.location == self.location:
                self.leave_occupants(occupant)
                continue
            if occupant not in exclude:
                occupant.msg(msg)
Exemple #8
0
    def at_after_move(self, source_location, **kwargs):
        """
        Overload this in order to update other players' maps.

        """
        self.update_map()

        for i in search_tag("sees_%i" % self.id):
            i.tags.remove("sees_%i" % self.id)
            i.update_map()

        # needed for <vai>
        def move_callback():
            self.execute_cmd(self.db.travel_direction)

        if self.db.travel_direction:
            deferred = utils.delay(0.2, move_callback)
            self.ndb.currently_moving = deferred

        super().at_after_move(source_location, **kwargs)
Exemple #9
0
 def associated(self):
     """search for and return any jobs associated with this bucket"""
     jobs = []
     for job in ev.search_tag(self.key, category="jobs"):
         jobs.append(job)
     return jobs
Exemple #10
0
    def func(self):
        """Performs the summon, accounting for in-world conditions."""

        char = self.character
        loc = char.location
        account = self.account
        args = self.args
        lhs, rhs = self.lhs, self.rhs
        # opt = self.switches  # TODO - add code to make the switches work.

        if char and char.ndb.currently_moving:
            account.msg("You can not summon while moving. (|rstop|n, then try again.)")
            return
        if not args:
            char.msg("Could not find target to summon. Usage: summon <character or NPC>")
            return
        session_list = SESSIONS.get_sessions()
        target = []
        for session in session_list:
            if not (session.logged_in and session.get_puppet()):
                continue
            puppet = session.get_puppet()
            if lhs.lower() in puppet.get_display_name(char, plain=True).lower():
                target.append(puppet)
        if len(target) < 1:
            char.msg("Error: character not found.")
            return
        if len(target) > 1:  # Too many partial matches, try exact matching.
            char.msg("Error: character not found.")
            return
        else:
            target[0].msg("You are being summoned to %s " % loc.get_display_name(target[0]) +
                          "by %s" % char.get_display_name(target[0]) +
                          ". A portal should appear soon that will take you to " +
                          "%s." % char.get_display_name(target[0]))
            char.msg("You begin to summon a portal between %s" % target[0].get_display_name(char) +
                     " and your location.")
        # Check the pool for objects to use.  Filter a list of objects tagged "pool" by those located in None.
        obj_pool = [each for each in evennia.search_tag('pool', category='portal') if not each.location]
        print('Object pool total: %i' % len(obj_pool))
        if len(obj_pool) < 2:
            char.msg('Portals are currently out of stock or in use elsewhere.')
            return
        portal_enter, portal_exit = obj_pool[-2:]

        def open_portal():
            """Move inflatable portals into place."""
            portal_enter.move_to(target[0].location)
            portal_exit.move_to(loc)

        delay(10, callback=open_portal)  # 10 seconds later, the portal (exit pair) appears.

        def close_portal():
            """Remove and store inflatable portals in Nothingness."""
            for each in portal_enter.contents:
                each.move_to(target[0].location)
            for each in portal_exit.contents:
                each.move_to(loc)
            portal_enter.location.msg_contents("|r%s|n vanishes into |222Nothingness|n." % portal_enter)
            portal_exit.location.msg_contents("|r%s|n vanishes into |222Nothingness|n." % portal_exit)
            portal_enter.move_to(None, to_none=True)
            portal_exit.move_to(None, to_none=True)

        delay(180, callback=close_portal)  # Wait, then move portal objects to the portal pool in Nothingness
Exemple #11
0
 def jobids(self):
     return ev.search_tag(self.db.key, category="jobs")
Exemple #12
0
def delete_tagged(tag):
    for obj in search_tag(tag):
        try:
            obj.delete()
        except ObjectDoesNotExist:
            pass
Exemple #13
0
    def func(self):
        """
            Performs the summon, accounting for in-world conditions.
            join: Implies one way portal to target
            summon: Implies one way portal to summoner
            meet: Implies two-way portal, both can meet.
        """

        char = self.character
        cmd = self.cmdstring
        loc = char.location
        account = self.account
        args = self.args
        lhs, rhs = self.lhs, self.rhs
        opt = self.switches

        message_private = ' in a private room that does not allow portals to form.'

        if char and char.ndb.currently_moving:
            account.msg(
                "You can not open a portal while moving. (|lcstop|lt|rStop|n|le, then try again.)"
            )
            return
        if not args and 'vanish' not in opt:
            char.msg('Usage: {} <character or NPC>'.format(cmd))
            return
        session_list = SESSIONS.get_sessions()
        target = []
        # Check for private flag on source room. It must be controlled by summoner if private.
        if loc.tags.get('private',
                        category='flags') and not loc.access(char, 'control'):
            char.msg('You are' + message_private)
            return
        # Check object pool filtered by tagged "pool" and located in None.
        obj_pool = [
            each for each in evennia.search_tag('pool', category='portal')
            if not each.location
        ]
        print('Object pool total: %i' % len(obj_pool))
        if len(obj_pool) < 2:
            char.msg('Portals are currently out of stock or in use elsewhere.')
            return
        portal_enter, portal_exit = obj_pool[-2:]
        for session in session_list:
            if not (session.logged_in and session.get_puppet()):
                continue
            puppet = session.get_puppet()
            if lhs.lower() in puppet.get_display_name(char,
                                                      plain=True).lower():
                target.append(puppet)
        if len(target) < 1:
            char.msg("Specific character name not found.")
            return
        elif len(target) > 1:  # Too many partial matches, try exact matching.
            char.msg("Unique character name not found.")
            return
        first_target = target[0]
        target = list(set(target))  # Remove duplicate character sessions
        target = first_target
        # Check for private flag on destination room. If so, check for in/out locks.
        there = target.location
        if there and there.tags.get(
                'private',
                category='flags') and not there.access(char, 'control'):
            char.msg('Destination of portal is' + message_private)
            return
        # Check if A can walk to B, or B to A depending on meet or summon,
        # because sometimes a portal might not be needed.
        meet_message = 'You are being invited to meet {summoner} in {loc}.'
        join_message = 'You are being joined by {summoner} from {loc}.'
        summon_message = 'You are being summoned to {loc} by {summoner}.'
        message = meet_message if 'meet' in cmd else (
            summon_message if 'summon' in cmd else join_message)
        loc_name = loc.get_display_name(target)
        target_name = target.get_display_name(char)
        char_name = char.get_display_name(target)
        target.msg(message.format(summoner=char_name, loc=loc_name))
        target.msg('A portal should appear soon.')
        char.msg("You begin to open a portal connecting %s" % target_name +
                 " and your location.")

        def open_portal():
            """Move inflatable portals into place."""
            # If in or out, join or summon, lock portals, depending.
            enter_lock, exit_lock = 'all()', 'all()'
            if 'only' in opt:
                enter_lock = 'id({}) OR id({})'.format(target.id, char.id)
                exit_lock = 'id({}) OR id({})'.format(target.id, char.id)
            if 'in' in opt or 'join' in cmd:
                enter_lock = 'none()'
            if 'out' in opt or 'summon' in cmd:
                exit_lock = 'none()'
            portal_enter.locks.add('enter:' + enter_lock)
            portal_exit.locks.add('enter:' + exit_lock)
            quiet = True if ('quiet' in opt or 'silent' in opt) else False
            portal_enter.move_to(target.location, quiet=quiet)
            if quiet:
                target.msg('{} quietly appears in {}.'.format(
                    portal_enter.get_display_name(target), loc_name))
                char.msg('{} quietly appears in {}.'.format(
                    portal_exit.get_display_name(char),
                    loc.get_display_name(char)))
            portal_exit.move_to(loc, quiet=quiet)

        delay(10, callback=open_portal
              )  # 10 seconds later, the portal (exit pair) appears.

        def close_portal():
            """Remove and store inflatable portals in Nothingness."""
            vanish_message = '|r{}|n vanishes into ' + settings.NOTHINGNESS + '.'
            for every in portal_enter.contents:
                every.move_to(target.location)
            for every in portal_exit.contents:
                every.move_to(loc)
            # if not quiet:
            if portal_enter.location:
                portal_enter.location.msg_contents(
                    vanish_message.format(portal_enter))
                portal_enter.move_to(None, to_none=True)  # , quiet=quiet)
            if portal_exit.location:
                portal_exit.location.msg_contents(
                    vanish_message.format(portal_exit))
                portal_exit.move_to(None, to_none=True)  # , quiet=quiet)

        delay(
            180, callback=close_portal
        )  # Wait, then move portal objects to the portal pool in Nothingness
Exemple #14
0
    def func(self):
        """Performs the summon, accounting for in-world conditions."""

        char = self.character
        loc = char.location
        account = self.account
        args = self.args
        lhs, rhs = self.lhs, self.rhs
        # opt = self.switches  # TODO - add code to make the switches work.

        if char and char.ndb.currently_moving:
            account.msg(
                "You can not summon while moving. (|rstop|n, then try again.)")
            return
        if not args:
            char.msg(
                "Could not find target to summon. Usage: summon <character or NPC>"
            )
            return
        session_list = SESSIONS.get_sessions()
        target = []
        for session in session_list:
            if not (session.logged_in and session.get_puppet()):
                continue
            puppet = session.get_puppet()
            if lhs.lower() in puppet.get_display_name(char,
                                                      plain=True).lower():
                target.append(puppet)
        if len(target) < 1:
            char.msg("Error: character not found.")
            return
        if len(target) > 1:  # Too many partial matches, try exact matching.
            char.msg("Error: character not found.")
            return
        else:
            target[0].msg(
                "You are being summoned to %s " %
                loc.get_display_name(target[0]) +
                "by %s" % char.get_display_name(target[0]) +
                ". A portal should appear soon that will take you to " +
                "%s." % char.get_display_name(target[0]))
            char.msg("You begin to summon a portal between %s" %
                     target[0].get_display_name(char) + " and your location.")
        # Check the pool for objects to use.  Filter a list of objects tagged "pool" by those located in None.
        obj_pool = [
            each for each in evennia.search_tag('pool', category='portal')
            if not each.location
        ]
        print('Object pool total: %i' % len(obj_pool))
        if len(obj_pool) < 2:
            char.msg('Portals are currently out of stock or in use elsewhere.')
            return
        portal_enter, portal_exit = obj_pool[-2:]

        def open_portal():
            """Move inflatable portals into place."""
            portal_enter.move_to(target[0].location)
            portal_exit.move_to(loc)

        delay(10, callback=open_portal
              )  # 10 seconds later, the portal (exit pair) appears.

        def close_portal():
            """Remove and store inflatable portals in Nothingness."""
            for each in portal_enter.contents:
                each.move_to(target[0].location)
            for each in portal_exit.contents:
                each.move_to(loc)
            portal_enter.location.msg_contents(
                "|r%s|n vanishes into |222Nothingness|n." % portal_enter)
            portal_exit.location.msg_contents(
                "|r%s|n vanishes into |222Nothingness|n." % portal_exit)
            portal_enter.move_to(None, to_none=True)
            portal_exit.move_to(None, to_none=True)

        delay(
            180, callback=close_portal
        )  # Wait, then move portal objects to the portal pool in Nothingness