Exemplo n.º 1
0
def receive_message(inter_ob, data, txt):
    global call_catch_tell

    if call_catch_tell is None:
        symbol_ob = ldmud.Symbol('ob')
        symbol_txt = ldmud.Symbol('txt')
        call_catch_tell = ldmud.efuns.unbound_lambda(
            ldmud.Array((
                symbol_ob,
                symbol_txt,
            )),
            ldmud.Array(
                (ldmud.Closure(ldmud.get_master(), "efun::call_resolved"),
                 ldmud.Array((ldmud.Closure(ldmud.get_master(),
                                            '&'), ldmud.Symbol('result'))),
                 symbol_ob, "catch_tell", symbol_txt)))

    current_ob = ldmud.efuns.this_object()
    if current_ob == inter_ob or not ldmud.efuns.bind_lambda(
            call_catch_tell, current_ob)(inter_ob, txt):
        data.call_control_ob("receive_message", inter_ob, txt)

    if data.snooper is not None:
        try:
            ldmud.efuns.tell_object(data.snooper, "%" + txt)
        except:
            pass
Exemplo n.º 2
0
def efun_say(msg: (str, ldmud.Array, ldmud.Object, ldmud.Mapping,
                   ldmud.Struct),
             excludes: (
                 ldmud.Object,
                 ldmud.Array,
             ) = None) -> None:
    def base_efun():
        if excludes is None:
            ldmud.efuns.say(msg)
        else:
            ldmud.efuns.say(msg, excludes)

    if not isinstance(msg, str):
        return base_efun()

    # Determine the recipients
    current_ob = ldmud.efuns.this_object()
    if ldmud.efuns.living(current_ob):
        initiator = current_ob
    else:
        initiator = ldmud.efuns.this_player()
        if not initiator:
            initiator = current_ob

    recipients = set()
    env = ldmud.efuns.environment(initiator)
    if env:
        recipients.add(env)
        recipients.update(ldmud.efuns.all_inventory(env))
    recipients.update(ldmud.efuns.all_inventory(initiator))

    if isinstance(excludes, ldmud.Object):
        recipients.discard(excludes)
        recipients.discard(initiator)
    elif isinstance(excludes, ldmud.Array):
        recipients.difference_update(excludes)
    else:
        recipients.discard(initiator)

    # Check if there are any of us in there
    inter_obs = recipients.intersection(control.interactives)
    if not len(inter_obs):
        return base_efun()

    # Send to the remaining...
    if len(inter_obs) < len(recipients):
        if isinstance(excludes, ldmud.Object):
            excludes = ldmud.Array((excludes, initiator, *inter_obs))
        elif isinstance(excludes, ldmud.Array):
            excludes += ldmud.Array(inter_obs)
        else:
            excludes = ldmud.Array((initiator, *inter_obs))
        ldmud.efuns.say(msg, excludes)

    # And now send to all our interactives
    for inter_ob in inter_obs:
        data = control.interactives.get(inter_ob, None)
        if data:
            receive_message(inter_ob, data, msg)
Exemplo n.º 3
0
def efun_input_to_info(inter_ob: ldmud.Object) -> ldmud.Array:
    data = control.interactives.get(inter_ob, None)

    if data is None:
        return ldmud.efuns.input_to_info(inter_ob)
    else:
        result = []
        for it in reversed(data.inputto):
            result.append(ldmud.Array((it.cb_ob, it.cb_fun, *it.args)))
        return ldmud.Array(result)
Exemplo n.º 4
0
def efun_tell_room(room: (ldmud.Object, str),
                   msg: (str, ldmud.Array, ldmud.Object, ldmud.Mapping,
                         ldmud.Struct),
                   excludes: (
                       ldmud.Object,
                       ldmud.Array,
                   ) = None) -> None:
    def base_efun():
        if excludes is None:
            ldmud.efuns.tell_room(room, msg)
        else:
            ldmud.efuns.tell_room(room, msg, excludes)

    if not isinstance(msg, str):
        return base_efun()

    # Determine the recipients
    if isinstance(room, str):
        env = ldmud.efuns.find_object(room)
        if not env:
            # If the room does not exist, there isn't one of ours in it.
            return base_efun()
    else:
        env = room

    recipients = set()
    recipients.add(env)
    recipients.update(ldmud.efuns.all_inventory(env))

    if isinstance(excludes, ldmud.Object):
        recipients.discard(excludes)
    elif isinstance(excludes, ldmud.Array):
        recipients.difference_update(excludes)

    # Check if there are any of us in there
    inter_obs = recipients.intersection(control.interactives)
    if not len(inter_obs):
        return base_efun()

    # Send to the remaining...
    if len(inter_obs) < len(recipients):
        if isinstance(excludes, ldmud.Object):
            excludes = ldmud.Array((excludes, *inter_obs))
        elif isinstance(excludes, ldmud.Array):
            excludes += ldmud.Array(inter_obs)
        else:
            excludes = ldmud.Array(inter_obs)
        ldmud.efuns.tell_room(room, msg, excludes)

    # And now send to all our interactives
    for inter_ob in inter_obs:
        data = control.interactives.get(inter_ob, None)
        if data:
            receive_message(inter_ob, data, msg)
Exemplo n.º 5
0
    def testSlice(self):
        arr = ldmud.Array(range(8))
        self.assertEqual(list(arr[3:5]), [3, 4])
        self.assertEqual(list(arr[5:3:-1]), [5, 4])
        self.assertEqual(list(arr[::-2]), list(range(7, 0, -2)))

        arr[::-1] = arr
        self.assertEqual(list(arr), list(range(7, -1, -1)))

        arr[5:10] = ldmud.Array([10])
        self.assertEqual(list(arr), [7, 6, 5, 4, 3, 10])

        arr[4:2:-1] = ldmud.Array([100, 101, 102, 103, 104])
        self.assertEqual(list(arr), [7, 6, 5, 104, 103, 102, 101, 100, 10])
Exemplo n.º 6
0
    def testDeletion(self):
        parr = list(range(20))
        arr = ldmud.Array(range(20))

        del arr[5]
        del parr[5]
        self.assertEqual(list(arr), parr)

        del arr[1:3]
        del parr[1:3]
        self.assertEqual(list(arr), parr)

        del arr[3:1]
        del parr[3:1]
        self.assertEqual(list(arr), parr)

        del arr[4:2:-1]
        del parr[4:2:-1]
        self.assertEqual(list(arr), parr)

        del arr[0:10:3]
        del parr[0:10:3]
        self.assertEqual(list(arr), parr)

        del arr[10:0:-3]
        del parr[10:0:-3]
        self.assertEqual(list(arr), parr)
Exemplo n.º 7
0
 def testLvalueArrayItem(self):
     arr = ldmud.Array([10, 11, 12])
     lv = ldmud.Lvalue(arr)
     lv[2].value = 42
     self.assertEqual(arr[2], 42)
     arr[0] = 100
     self.assertEqual(lv[0].value, 100)
Exemplo n.º 8
0
 def testQuotedArrayInitQuotes(self):
     qa = ldmud.QuotedArray(ldmud.Array([2, 1]), quotes=5)
     self.assertIsNotNone(qa)
     self.assertEqual(len(qa.array), 2)
     self.assertEqual(qa.array[0], 2)
     self.assertEqual(qa.array[1], 1)
     self.assertEqual(qa.quotes, 5)
Exemplo n.º 9
0
 def testInitIter(self):
     arr = ldmud.Array(range(10))
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 10)
     self.assertTrue(0 in arr)
     self.assertTrue(9 in arr)
     self.assertFalse(10 in arr)
Exemplo n.º 10
0
def efun_caller_stack(add_inter: int = None) -> ldmud.Array:
    if current_interactive is None:
        return ldmud.efuns.caller_stack(add_inter or 0)[1:]
    elif add_inter:
        return ldmud.efuns.caller_stack()[1:] + ldmud.Array((current_interactive,))
    else:
        return ldmud.efuns.caller_stack()[1:]
Exemplo n.º 11
0
 def testQuotedArrayInitQuotedArray(self):
     qa1 = ldmud.QuotedArray(ldmud.Array([4, 3]), quotes=2)
     qa2 = ldmud.QuotedArray(qa1, quotes=3)
     self.assertIsNotNone(qa2)
     self.assertEqual(len(qa2.array), 2)
     self.assertEqual(qa2.array[0], 4)
     self.assertEqual(qa2.array[1], 3)
     self.assertEqual(qa2.quotes, 5)
Exemplo n.º 12
0
 def testInitValues(self):
     arr = ldmud.Array([42, 1.5, "Hi"])
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 3)
     self.assertFalse(0 in arr)
     self.assertTrue(42 in arr)
     self.assertTrue(1.5 in arr)
     self.assertTrue("Hi" in arr)
Exemplo n.º 13
0
 def testItemGetSet(self):
     arr = ldmud.Array(size=4)
     arr[0] = 10
     arr[1] = 21
     arr[2] = 52
     arr[3] = "Me"
     self.assertEqual(arr[0], 10)
     self.assertEqual(arr[1], 21)
     self.assertEqual(arr[2], 52)
     self.assertEqual(arr[3], "Me")
Exemplo n.º 14
0
def efun_spell_suggest(text: str) -> ldmud.Array:
    """
    SYNOPSIS
            string* spell_suggest(string word)

    DESCRIPTION
            Returns correctly spelled suggestions for the given word.

    SEE ALSO
            spell_check(E)
    """
    if not speller:
        raise RuntimeError("Spellchecker is not initialized.")
    return ldmud.Array(speller.suggest(text))
Exemplo n.º 15
0
def console(line=""):
    ob = ldmud.efuns.this_object()
    obname = ldmud.efuns.object_name(ob)

    if obname in consoles:
        console = consoles[obname]
    else:
        console = LDMudConsole(len(line) == 0)
        consoles[obname] = console

    (output, prompt) = console.input(line)
    if prompt is None:
        del consoles[obname]
    return ldmud.Array((
        output,
        prompt,
    ))
Exemplo n.º 16
0
    def get_sockaddr(self):
        info = socket.getaddrinfo(self.hostaddr,
                                  self.hostport,
                                  type=socket.SOCK_STREAM)
        if not len(info):
            return None

        info = info[0]

        raw = struct.pack("<H", info[0]) + struct.pack(">H", info[4][1])

        if family == socket.AF_INET6:
            raw += 4 * b"\x00"
        raw += socket.inet_pton(info[0], info[4][0])
        if family == socket.AF_INET:
            raw += 8 * b"\x00"
        elif family == socket.AF_INET6:
            raw += 4 * b"\x00"

        return ldmud.Array(raw)
Exemplo n.º 17
0
 def parse_array(self, *args, **kwargs):
     (val, end) = self.orig_parse_array(*args, **kwargs)
     return (ldmud.Array(val), end)
Exemplo n.º 18
0
def efun_interactive_info(inter_ob: ldmud.Object, what: int):
    data = control.interactives.get(inter_ob, None)

    if data is None:
        return ldmud.efuns.interactive_info(inter_ob, what)
    else:
        if what >= 0 and what in data.options:
            return data.options[what]

        def error():
            raise ValueError("Illegal value for interactive_into()")

        def query_snooper():
            master = ldmud.get_master()
            if master != ldmud.efuns.this_object():
                result = util.lfun_call(master, "valid_query_snoop", inter_ob)
                if not isinstance(result, int) or result == 0:
                    return 0
            return data.snooper

        def query_snoopers():
            snooper = query_snooper()
            if snooper:
                return ldmud.Array((snooper, ))
            else:
                return ldmud.Array()

        return {
            IC_MAX_WRITE_BUFFER_SIZE:
            lambda: ldmud.efuns.interactive_info(0, what),
            IC_SOCKET_BUFFER_SIZE:
            lambda: 0,
            IC_COMBINE_CHARSET_AS_STRING:
            lambda: "",
            IC_COMBINE_CHARSET_AS_ARRAY:
            lambda: ldmud.Array(
                (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)),
            IC_CONNECTION_CHARSET_AS_STRING:
            lambda: ''.join(map(chr, range(1, 128))),
            IC_CONNECTION_CHARSET_AS_ARRAY:
            lambda: ldmud.Array((254, 255, 255, 255, 255, 255, 255, 255, 255,
                                 255, 255, 255, 255, 255, 255, 255)),
            IC_QUOTE_IAC:
            lambda: 1,
            IC_TELNET_ENABLED:
            lambda: 1,
            IC_MCCP:
            lambda: 0,
            IC_PROMPT:
            lambda: 0,
            IC_MAX_COMMANDS:
            lambda: -1,
            IC_MODIFY_COMMAND:
            lambda: 0,
            IC_ENCODING:
            lambda: ldmud.efuns.interactive_info(0, what),
            II_IP_NAME:
            lambda: data.hostname,
            II_IP_NUMBER:
            lambda: data.hostaddr,
            II_IP_PORT:
            lambda: data.hostport,
            II_IP_ADDRESS:
            lambda: data.get_sockaddr(),
            II_MUD_PORT:
            lambda: data.mudport,
            II_MCCP_STATS:
            lambda: 0,
            II_INPUT_PENDING:
            lambda: len(data.inputto) and data.inputto[0].cb_ob,
            II_EDITING:
            lambda: 0,
            II_IDLE:
            lambda: data.get_idle(),
            II_SNOOP_NEXT:
            query_snooper,
            II_SNOOP_PREV:
            lambda: 0,
            II_SNOOP_ALL:
            query_snoopers,
        }.get(what, error)()
Exemplo n.º 19
0
 def testRepeat(self):
     arr = ldmud.Array([1, 2, 3]) * 10
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 30)
     self.assertTrue(1 in arr)
     self.assertTrue(3 in arr)
Exemplo n.º 20
0
 def testConcat(self):
     arr = ldmud.Array([1, 2, 3]) + ldmud.Array([4, 5, 6])
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 6)
     self.assertTrue(1 in arr)
     self.assertTrue(6 in arr)
Exemplo n.º 21
0
 def query_snoopers():
     snooper = query_snooper()
     if snooper:
         return ldmud.Array((snooper, ))
     else:
         return ldmud.Array()
Exemplo n.º 22
0
def get_hook_info():
    return ldmud.Array((
        num_hb,
        ldmud.Array(ob_list),
    ))
Exemplo n.º 23
0
 def testInitSize(self):
     arr = ldmud.Array(size=10)
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 10)
     self.assertTrue(0 in arr)
     self.assertFalse(1 in arr)
Exemplo n.º 24
0
def efun_users() -> ldmud.Array:
    return ldmud.efuns.users() + ldmud.Array(interactives.keys())
Exemplo n.º 25
0
 def testInitEmpty(self):
     arr = ldmud.Array()
     self.assertIsNotNone(arr)
     self.assertEqual(len(arr), 0)
Exemplo n.º 26
0
 def testLvalueArrayRange(self):
     arr = ldmud.Array([10, 11, 12])
     lv = ldmud.Lvalue(arr)
     lv[1:2].value = ldmud.Array([111, 112])
     self.assertEqual(list(lv.value), [10, 111, 112, 12])