0.3.0 add colors + multi triwat posts
This commit is contained in:
parent
939c3e8919
commit
212e415ead
5 changed files with 63 additions and 21 deletions
|
|
@ -1,3 +1,8 @@
|
||||||
|
# 0.3.0
|
||||||
|
|
||||||
|
+ Added colors
|
||||||
|
+ Added multiple Tríwat post input
|
||||||
|
|
||||||
# 0.2.0
|
# 0.2.0
|
||||||
|
|
||||||
+ Added Tríwat post parsing utilities
|
+ Added Tríwat post parsing utilities
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,12 @@
|
||||||
name = "sakuragasaki46_micorail"
|
name = "sakuragasaki46_micorail"
|
||||||
authors = [ { name = "Sakuragasaki46" } ]
|
authors = [ { name = "Sakuragasaki46" } ]
|
||||||
dynamic = [ "version" ]
|
dynamic = [ "version" ]
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.12"
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Private :: X"
|
"Private :: X"
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"suou>=0.12.4"
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.setuptools.dynamic]
|
[tool.setuptools.dynamic]
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ from .utils import HourMin
|
||||||
from .rails import main_rails
|
from .rails import main_rails
|
||||||
from .triwat import main_triwat
|
from .triwat import main_triwat
|
||||||
|
|
||||||
__version__ = "0.2.0"
|
__version__ = "0.3.0"
|
||||||
|
|
||||||
def build_parser():
|
def build_parser():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
|
@ -22,7 +22,8 @@ def build_parser():
|
||||||
parser_r.add_argument('-q', '--search', help='search a station by its name')
|
parser_r.add_argument('-q', '--search', help='search a station by its name')
|
||||||
|
|
||||||
parser_t = parsers.add_parser('triwat', aliases=('t',))
|
parser_t = parsers.add_parser('triwat', aliases=('t',))
|
||||||
parser_t.add_argument('id', help="post ID (copy from discord)")
|
parser_t.add_argument('--multi', help="multiple posts", action='store_true')
|
||||||
|
parser_t.add_argument('id', help="post ID (copy from discord)", nargs='?', default = None)
|
||||||
parser_t.add_argument('parent', help="parent ID (copy from discord)", nargs='?', default=None)
|
parser_t.add_argument('parent', help="parent ID (copy from discord)", nargs='?', default=None)
|
||||||
|
|
||||||
return parser
|
return parser
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,9 @@ from functools import lru_cache
|
||||||
import json
|
import json
|
||||||
from math import ceil
|
from math import ceil
|
||||||
from heapq import heapify, heappush, heappop
|
from heapq import heapify, heappush, heappop
|
||||||
|
from suou import chalk
|
||||||
|
|
||||||
|
from .utils import HourMin
|
||||||
|
|
||||||
ALL_DATA = json.load(open('data/network.json'))
|
ALL_DATA = json.load(open('data/network.json'))
|
||||||
LEGACY_DATA = json.load(open('data/network.1.json'))
|
LEGACY_DATA = json.load(open('data/network.1.json'))
|
||||||
|
|
@ -156,7 +159,7 @@ def main_rails(args):
|
||||||
query = args.search.lower()
|
query = args.search.lower()
|
||||||
for st_code, st_name in ALL_DATA['stations'].items():
|
for st_code, st_name in ALL_DATA['stations'].items():
|
||||||
if query in take_first(st_name).lower():
|
if query in take_first(st_name).lower():
|
||||||
print('*', st_code, st_name)
|
print(f'{chalk.blue('*')}', chalk.bold(st_code), st_name)
|
||||||
return
|
return
|
||||||
|
|
||||||
st_start = find_station(args.start)
|
st_start = find_station(args.start)
|
||||||
|
|
@ -164,10 +167,10 @@ def main_rails(args):
|
||||||
st_time = args.time
|
st_time = args.time
|
||||||
|
|
||||||
if not st_start or not st_end:
|
if not st_start or not st_end:
|
||||||
print('error: missing stations')
|
print('**', f'{chalk.red(f'Missing stations')}')
|
||||||
return
|
return
|
||||||
|
|
||||||
route = find_route(st_start.code, st_end.code)
|
route = find_route(st_start.code, st_end.code)
|
||||||
|
|
||||||
for st_step, time in route:
|
for st_step, time in route:
|
||||||
print(HourMin(st_time + time), st_step.code, st_step.name)
|
print(chalk.cyan(f'{HourMin(st_time + time)}'), chalk.bold(st_step.code), st_step.name)
|
||||||
|
|
@ -9,6 +9,8 @@ import json
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from suou import chalk
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class TriwatPost:
|
class TriwatPost:
|
||||||
id: str
|
id: str
|
||||||
|
|
@ -40,29 +42,37 @@ def id_to_date(id: str | int):
|
||||||
timestamp = timestamp_millis / 1000
|
timestamp = timestamp_millis / 1000
|
||||||
return datetime.datetime.fromtimestamp(EPOCH + timestamp)
|
return datetime.datetime.fromtimestamp(EPOCH + timestamp)
|
||||||
|
|
||||||
def store_triwat_post(p: TriwatPost) -> bool:
|
def store_triwat_posts(posts: list[TriwatPost], datafile: int) -> bool:
|
||||||
try:
|
try:
|
||||||
with open(f"data/triwat.{int(p.id) >> 51}.json") as f:
|
with open(f"data/triwat.{datafile}.json") as f:
|
||||||
data = json.load(f)
|
data = json.load(f)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
data = {'posts': []}
|
data = {'posts': []}
|
||||||
|
|
||||||
post_exists = [x for x in data['posts'] if x['id'] == p.id]
|
count = 0
|
||||||
if post_exists:
|
|
||||||
return False
|
|
||||||
|
|
||||||
data['posts'].append(p.to_json())
|
for post in posts:
|
||||||
|
post_exists = [x for x in data['posts'] if x['id'] == post.id]
|
||||||
|
if post_exists:
|
||||||
|
continue
|
||||||
|
|
||||||
with open(f'data/triwat.{int(p.id) >> 51}.json', 'w') as fw:
|
data['posts'].append(post.to_json())
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
with open(f'data/triwat.{datafile}.json', 'w') as fw:
|
||||||
json.dump(data, fw, indent=2)
|
json.dump(data, fw, indent=2)
|
||||||
return True
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
def main_triwat(args):
|
def input_single_post(post_id, reply_id) -> TriwatPost | None:
|
||||||
post_id = args.id
|
|
||||||
reply_id = args.parent or None
|
|
||||||
|
|
||||||
whole_post = sys.stdin.read().strip()
|
|
||||||
|
try:
|
||||||
|
whole_post = sys.stdin.read().strip()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print(f'** {chalk.red("Post input interrupted.")}')
|
||||||
|
raise
|
||||||
|
|
||||||
first_line, *rest = whole_post.splitlines()
|
first_line, *rest = whole_post.splitlines()
|
||||||
|
|
||||||
|
|
@ -95,7 +105,7 @@ def main_triwat(args):
|
||||||
|
|
||||||
content = '\n'.join(rest)
|
content = '\n'.join(rest)
|
||||||
|
|
||||||
p = TriwatPost(
|
return TriwatPost(
|
||||||
id = post_id,
|
id = post_id,
|
||||||
date = id_to_date(post_id),
|
date = id_to_date(post_id),
|
||||||
title = title,
|
title = title,
|
||||||
|
|
@ -106,8 +116,30 @@ def main_triwat(args):
|
||||||
muted = muted
|
muted = muted
|
||||||
)
|
)
|
||||||
|
|
||||||
if store_triwat_post(p):
|
|
||||||
print(f'** Post {p.id} stored!')
|
def main_triwat(args):
|
||||||
|
post_id = args.id or None
|
||||||
|
reply_id = args.parent or None
|
||||||
|
if post_id:
|
||||||
|
posts = [input_single_post(post_id, reply_id)]
|
||||||
|
elif args.multi:
|
||||||
|
posts = []
|
||||||
|
print(f'** {chalk.blue('Multi mode enabled. ')}')
|
||||||
|
while (post_id_l := input(chalk.blue(f'[Post #{len(posts) + 1} id]: ')).strip()):
|
||||||
|
reply_id_l = input(chalk.blue(f'[Parent #{len(posts) + 1} id (optional)]: ')).strip()
|
||||||
|
posts.append(input_single_post(post_id_l, reply_id_l or None))
|
||||||
|
else:
|
||||||
|
print(f'** {chalk.red('No post id provided. Please provide a post id and an optional reply id or use --multi option to input multiple posts.')}')
|
||||||
|
return
|
||||||
|
|
||||||
|
store_files: dict[int, list[TriwatPost]] = {}
|
||||||
|
for p in posts:
|
||||||
|
store_files.setdefault(int(p.id) >> 51, []).append(p)
|
||||||
|
count = 0
|
||||||
|
for datafile, postlist in store_files.items():
|
||||||
|
count += store_triwat_posts(postlist, datafile)
|
||||||
|
|
||||||
|
print(f'** {chalk.green(f'{count} posts stored!')}')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue