mirror of
https://github.com/meshcore-dev/meshcore-cli.git
synced 2026-04-20 22:13:48 +00:00
manage a root
This commit is contained in:
parent
4a64a594d0
commit
707aa0c504
1 changed files with 84 additions and 93 deletions
|
|
@ -174,11 +174,16 @@ handle_message.above=True
|
||||||
|
|
||||||
def make_completion_dict(contacts):
|
def make_completion_dict(contacts):
|
||||||
contact_list = {}
|
contact_list = {}
|
||||||
|
|
||||||
|
contact_list["~"] = None
|
||||||
|
contact_list["/"] = None
|
||||||
|
contact_list[".."] = None
|
||||||
|
contact_list["public"] = None
|
||||||
|
|
||||||
it = iter(contacts.items())
|
it = iter(contacts.items())
|
||||||
for c in it :
|
for c in it :
|
||||||
contact_list[c[1]['adv_name']] = None
|
contact_list[c[1]['adv_name']] = None
|
||||||
|
|
||||||
contact_list["public"] = None
|
|
||||||
contact_list["ch"] = None
|
contact_list["ch"] = None
|
||||||
contact_list["ch0"] = None
|
contact_list["ch0"] = None
|
||||||
|
|
||||||
|
|
@ -248,16 +253,11 @@ Use \"to\" to select recipient, use Tab to complete name ...
|
||||||
Line starting with \"$\" or \".\" will issue a meshcli command.
|
Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
\"quit\", \"q\", CTRL+D will end interactive mode""")
|
\"quit\", \"q\", CTRL+D will end interactive mode""")
|
||||||
|
|
||||||
|
contact = to
|
||||||
|
|
||||||
await mc.ensure_contacts()
|
await mc.ensure_contacts()
|
||||||
handle_message.above = True
|
handle_message.above = True
|
||||||
await subscribe_to_msgs(mc)
|
await subscribe_to_msgs(mc)
|
||||||
if not to is None:
|
|
||||||
contact = to
|
|
||||||
elif len(mc.contacts.items()) == 0 :
|
|
||||||
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
|
||||||
else: # defaults to public chanel
|
|
||||||
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
|
||||||
# contact = next(iter(mc.contacts.items()))[1]
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
while True: # purge msgs
|
while True: # purge msgs
|
||||||
|
|
@ -265,15 +265,13 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
if res.type == EventType.NO_MORE_MSGS:
|
if res.type == EventType.NO_MORE_MSGS:
|
||||||
break
|
break
|
||||||
|
|
||||||
completer = NestedCompleter.from_nested_dict(make_completion_dict(mc.contacts))
|
|
||||||
if os.path.isdir(MCCLI_CONFIG_DIR) :
|
if os.path.isdir(MCCLI_CONFIG_DIR) :
|
||||||
our_history = FileHistory(MCCLI_HISTORY_FILE)
|
our_history = FileHistory(MCCLI_HISTORY_FILE)
|
||||||
else:
|
else:
|
||||||
our_history = None
|
our_history = None
|
||||||
|
|
||||||
# beware, mouse support breaks mouse scroll ...
|
# beware, mouse support breaks mouse scroll ...
|
||||||
session = PromptSession(completer=completer,
|
session = PromptSession(history=our_history,
|
||||||
history=our_history,
|
|
||||||
wrap_lines=False,
|
wrap_lines=False,
|
||||||
mouse_support=False,
|
mouse_support=False,
|
||||||
complete_style=CompleteStyle.MULTI_COLUMN)
|
complete_style=CompleteStyle.MULTI_COLUMN)
|
||||||
|
|
@ -297,7 +295,7 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
prompt = f"{ANSI_INVERT}"
|
prompt = f"{ANSI_INVERT}"
|
||||||
|
|
||||||
# some possible symbols for prompts 🭬🬛🬗🭬🬛🬃🬗🭬🬛🬃🬗🬏🭀🭋🭨🮋
|
# some possible symbols for prompts 🭬🬛🬗🭬🬛🬃🬗🭬🬛🬃🬗🬏🭀🭋🭨🮋
|
||||||
if print_name :
|
if print_name or contact is None :
|
||||||
prompt = prompt + f"{ANSI_BGRAY}"
|
prompt = prompt + f"{ANSI_BGRAY}"
|
||||||
prompt = prompt + f"{mc.self_info['name']}"
|
prompt = prompt + f"{mc.self_info['name']}"
|
||||||
if classic :
|
if classic :
|
||||||
|
|
@ -305,39 +303,44 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
else :
|
else :
|
||||||
prompt = prompt + "🭨"
|
prompt = prompt + "🭨"
|
||||||
|
|
||||||
if not last_ack:
|
if not contact is None :
|
||||||
prompt = prompt + f"{ANSI_BRED}"
|
if not last_ack:
|
||||||
|
prompt = prompt + f"{ANSI_BRED}"
|
||||||
|
if classic :
|
||||||
|
prompt = prompt + "!"
|
||||||
|
elif contact["type"] == 3 : # room server
|
||||||
|
prompt = prompt + f"{ANSI_BCYAN}"
|
||||||
|
elif contact["type"] == 2 :
|
||||||
|
prompt = prompt + f"{ANSI_BMAGENTA}"
|
||||||
|
elif contact["type"] == 0 : # public channel
|
||||||
|
prompt = prompt + f"{ANSI_BGREEN}"
|
||||||
|
else :
|
||||||
|
prompt = prompt + f"{ANSI_BBLUE}"
|
||||||
|
if not classic:
|
||||||
|
prompt = prompt + f"{ANSI_INVERT}"
|
||||||
|
|
||||||
|
if print_name and not classic :
|
||||||
|
prompt = prompt + "🭬"
|
||||||
|
|
||||||
|
prompt = prompt + f"{contact['adv_name']}"
|
||||||
if classic :
|
if classic :
|
||||||
prompt = prompt + "!"
|
prompt = prompt + f"{ANSI_NORMAL} > "
|
||||||
elif contact["type"] == 3 : # room server
|
else:
|
||||||
prompt = prompt + f"{ANSI_BCYAN}"
|
prompt = prompt + f"{ANSI_NORMAL}🭬"
|
||||||
elif contact["type"] == 2 :
|
|
||||||
prompt = prompt + f"{ANSI_BMAGENTA}"
|
|
||||||
elif contact["type"] == 0 : # public channel
|
|
||||||
prompt = prompt + f"{ANSI_BGREEN}"
|
|
||||||
else :
|
|
||||||
prompt = prompt + f"{ANSI_BBLUE}"
|
|
||||||
if not classic:
|
|
||||||
prompt = prompt + f"{ANSI_INVERT}"
|
|
||||||
|
|
||||||
if print_name and not classic :
|
prompt = prompt + f"{ANSI_END}"
|
||||||
prompt = prompt + "🭬"
|
|
||||||
|
|
||||||
prompt = prompt + f"{contact['adv_name']}"
|
if not color :
|
||||||
if classic :
|
prompt=escape_ansi(prompt)
|
||||||
prompt = prompt + f"{ANSI_NORMAL}> "
|
|
||||||
else:
|
|
||||||
prompt = prompt + f" {ANSI_NORMAL}🭬"
|
|
||||||
|
|
||||||
prompt = prompt + f"{ANSI_END}"
|
|
||||||
|
|
||||||
if not color :
|
|
||||||
prompt=escape_ansi(prompt)
|
|
||||||
|
|
||||||
session.app.ttimeoutlen = 0.2
|
session.app.ttimeoutlen = 0.2
|
||||||
session.app.timeoutlen = 0.2
|
session.app.timeoutlen = 0.2
|
||||||
|
|
||||||
line = await session.prompt_async(ANSI(prompt), complete_while_typing=False,
|
completer = NestedCompleter.from_nested_dict(make_completion_dict(mc.contacts))
|
||||||
|
|
||||||
|
line = await session.prompt_async(ANSI(prompt),
|
||||||
|
complete_while_typing=False,
|
||||||
|
completer=completer,
|
||||||
key_bindings=bindings)
|
key_bindings=bindings)
|
||||||
|
|
||||||
if line == "" : # blank line
|
if line == "" : # blank line
|
||||||
|
|
@ -348,31 +351,55 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
args = shlex.split(line[1:])
|
args = shlex.split(line[1:])
|
||||||
await process_cmds(mc, args)
|
await process_cmds(mc, args)
|
||||||
|
|
||||||
# commands that are passed through
|
elif line.startswith("@") : # send a cli command that won't need quotes !
|
||||||
elif line.startswith(".") or\
|
args=["cli", line[1:]]
|
||||||
line.startswith("set ") or\
|
|
||||||
line.startswith("get ") or\
|
|
||||||
line.startswith("clock") or\
|
|
||||||
line.startswith("time") or\
|
|
||||||
line.startswith("ver") or\
|
|
||||||
line.startswith("reboot") or\
|
|
||||||
line.startswith("advert") or\
|
|
||||||
line.startswith("floodadv") or\
|
|
||||||
line.startswith("chan") or\
|
|
||||||
line.startswith("card") or \
|
|
||||||
line.startswith("lc") or \
|
|
||||||
line.startswith("script") or \
|
|
||||||
line.startswith("upload_card") or \
|
|
||||||
line == "infos" or line == "i" :
|
|
||||||
args = shlex.split(line)
|
|
||||||
await process_cmds(mc, args)
|
await process_cmds(mc, args)
|
||||||
|
|
||||||
# commands that take one parameter (don't need for quotes)
|
elif line.startswith("to ") : # dest
|
||||||
|
last_ack = True
|
||||||
|
dest = line[3:]
|
||||||
|
nc = mc.get_contact_by_name(dest)
|
||||||
|
if nc is None:
|
||||||
|
if dest == "public" :
|
||||||
|
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
||||||
|
elif dest.startswith("ch"):
|
||||||
|
dest = int(dest[2:])
|
||||||
|
contact = {"adv_name" : "chan" + str(dest), "type" : 0, "chan_nb" : dest}
|
||||||
|
elif dest == ".." or dest == "~" or dest == "/":
|
||||||
|
contact = None
|
||||||
|
else :
|
||||||
|
print(f"Contact '{dest}' not found in contacts.")
|
||||||
|
else :
|
||||||
|
contact = nc
|
||||||
|
|
||||||
|
elif line.startswith("to_ch") :
|
||||||
|
last_ack = True
|
||||||
|
dest = int(line.split(" ")[1])
|
||||||
|
if dest == 0:
|
||||||
|
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
||||||
|
else :
|
||||||
|
contact = {"adv_name" : "chan" + str(dest), "type" : 0, "chan_nb" : dest}
|
||||||
|
|
||||||
|
elif line == "to_public" or line == "to_pub" :
|
||||||
|
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
||||||
|
|
||||||
|
elif line == "to" :
|
||||||
|
print(contact["adv_name"])
|
||||||
|
|
||||||
|
elif line == "quit" or line == "q" :
|
||||||
|
break
|
||||||
|
|
||||||
|
# commands that take one parameter (don't need quotes)
|
||||||
elif line.startswith("public ") or line.startswith("cli ") :
|
elif line.startswith("public ") or line.startswith("cli ") :
|
||||||
cmds = line.split(" ", 1)
|
cmds = line.split(" ", 1)
|
||||||
args = [cmds[0], cmds[1]]
|
args = [cmds[0], cmds[1]]
|
||||||
await process_cmds(mc, args)
|
await process_cmds(mc, args)
|
||||||
|
|
||||||
|
# commands are passed through if at root
|
||||||
|
elif contact is None or line.startswith(".") :
|
||||||
|
args = shlex.split(line)
|
||||||
|
await process_cmds(mc, args)
|
||||||
|
|
||||||
# commands that take contact as second arg will be sent to recipient
|
# commands that take contact as second arg will be sent to recipient
|
||||||
elif contact["type"] > 0 and (line == "sc" or line == "share_contact" or\
|
elif contact["type"] > 0 and (line == "sc" or line == "share_contact" or\
|
||||||
line == "ec" or line == "export_contact" or\
|
line == "ec" or line == "export_contact" or\
|
||||||
|
|
@ -408,40 +435,7 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
args=["cmd", contact['adv_name'], line[1:]]
|
args=["cmd", contact['adv_name'], line[1:]]
|
||||||
await process_cmds(mc, args)
|
await process_cmds(mc, args)
|
||||||
|
|
||||||
elif line.startswith("@") : # send a cli command that won't need quotes !
|
elif line == "reset path" : # reset path for compat with terminal chat
|
||||||
args=["cli", line[1:]]
|
|
||||||
await process_cmds(mc, args)
|
|
||||||
|
|
||||||
elif line.startswith("to ") : # dest
|
|
||||||
last_ack = True
|
|
||||||
dest = line[3:]
|
|
||||||
nc = mc.get_contact_by_name(dest)
|
|
||||||
if nc is None:
|
|
||||||
if dest == "public" :
|
|
||||||
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
|
||||||
elif dest.startswith("ch"):
|
|
||||||
dest = int(dest[2:])
|
|
||||||
contact = {"adv_name" : "chan" + str(dest), "type" : 0, "chan_nb" : dest}
|
|
||||||
else :
|
|
||||||
print(f"Contact '{dest}' not found in contacts.")
|
|
||||||
else :
|
|
||||||
contact = nc
|
|
||||||
|
|
||||||
elif line.startswith("to_ch") :
|
|
||||||
last_ack = True
|
|
||||||
dest = int(line.split(" ")[1])
|
|
||||||
if dest == 0:
|
|
||||||
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
|
||||||
else :
|
|
||||||
contact = {"adv_name" : "chan" + str(dest), "type" : 0, "chan_nb" : dest}
|
|
||||||
|
|
||||||
elif line == "to_public" or line == "to_pub" :
|
|
||||||
contact = {"adv_name" : "public", "type" : 0, "chan_nb" : 0}
|
|
||||||
|
|
||||||
elif line == "to" :
|
|
||||||
print(contact["adv_name"])
|
|
||||||
|
|
||||||
elif line == "reset path" : # reset path from terminal chat
|
|
||||||
res = await mc.commands.reset_path(contact)
|
res = await mc.commands.reset_path(contact)
|
||||||
logger.debug(res)
|
logger.debug(res)
|
||||||
if res.type == EventType.ERROR:
|
if res.type == EventType.ERROR:
|
||||||
|
|
@ -450,9 +444,6 @@ Line starting with \"$\" or \".\" will issue a meshcli command.
|
||||||
print(f"Path to contact['adv_name'] has been reset")
|
print(f"Path to contact['adv_name'] has been reset")
|
||||||
await mc.commands.get_contacts()
|
await mc.commands.get_contacts()
|
||||||
|
|
||||||
elif line == "quit" or line == "q" :
|
|
||||||
break
|
|
||||||
|
|
||||||
elif line == "list" : # list command from chat displays contacts on a line
|
elif line == "list" : # list command from chat displays contacts on a line
|
||||||
it = iter(mc.contacts.items())
|
it = iter(mc.contacts.items())
|
||||||
first = True
|
first = True
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue