mirror of https://github.com/jesopo/irctokens
45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
from typing import Dict, List, Optional
|
|
from .const import TAG_ESCAPED, TAG_UNESCAPED
|
|
|
|
def _escape_tag(value: str):
|
|
for i, char in enumerate(TAG_UNESCAPED):
|
|
value = value.replace(char, TAG_ESCAPED[i])
|
|
return value
|
|
|
|
def format(
|
|
tags: Optional[Dict[str, str]],
|
|
source: Optional[str],
|
|
command: str,
|
|
params: List[str]):
|
|
outs: List[str] = []
|
|
if tags:
|
|
tags_str = []
|
|
for key in sorted(tags.keys()):
|
|
if tags[key]:
|
|
value = tags[key]
|
|
tags_str.append(f"{key}={_escape_tag(value)}")
|
|
else:
|
|
tags_str.append(key)
|
|
outs.append(f"@{';'.join(tags_str)}")
|
|
|
|
if source is not None:
|
|
outs.append(f":{source}")
|
|
outs.append(command)
|
|
|
|
params = params.copy()
|
|
if params:
|
|
last = params.pop(-1)
|
|
for param in params:
|
|
if " " in param:
|
|
raise ValueError("non last params cannot have spaces")
|
|
elif param.startswith(":"):
|
|
raise ValueError("non last params cannot start with colon")
|
|
outs.extend(params)
|
|
|
|
if (not last or
|
|
" " in last or
|
|
last.startswith(":")):
|
|
last = f":{last}"
|
|
outs.append(last)
|
|
return " ".join(outs)
|