From c1141c366aadb26d9b5added04dfb85fa4ac1a34 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Fri, 10 May 2019 23:21:03 +0800
Subject: [PATCH] Try to add a new Curses Version

---
 CursesDownload.py |  70 ++++++++++++++++++++++++++++++
 CursesMain.py     | 107 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 177 insertions(+)
 create mode 100644 CursesDownload.py
 create mode 100644 CursesMain.py

diff --git a/CursesDownload.py b/CursesDownload.py
new file mode 100644
index 0000000..ba31106
--- /dev/null
+++ b/CursesDownload.py
@@ -0,0 +1,70 @@
+import curses
+import Common
+
+
+widths = [
+    (126, 1), (159, 0), (687, 1), (710, 0), (711, 1),
+    (727, 0), (733, 1), (879, 0), (1154, 1), (1161, 0),
+    (4347, 1), (4447, 2), (7467, 1), (7521, 0), (8369, 1),
+    (8426, 0), (9000, 1), (9002, 2), (11021, 1), (12350, 2),
+    (12351, 1), (12438, 2), (12442, 0), (19893, 2), (19967, 1),
+    (55203, 2), (63743, 1), (64106, 2), (65039, 1), (65059, 0),
+    (65131, 2), (65279, 1), (65376, 2), (65500, 1), (65510, 2),
+    (120831, 1), (262141, 2), (1114109, 1),
+]
+
+
+def get_width(o):
+    global widths
+    if o == 0xe or o == 0xf:
+        return 0
+    for num, wid in widths:
+        if o <= num:
+            return wid
+    return 1
+
+
+def c_print(handle, y, x, string, style=curses.A_NORMAL):
+    if type(string) != str:
+        string = str(string)
+    for _i in string:
+        _w = get_width(ord(_i))
+        if(_w>1):
+            handle.addch(y, x+1, " ", style)
+        handle.addch(y, x, ord(_i), style)
+        x += _w
+
+
+def render(screen):
+    _style = curses.A_DIM
+    if Common.api.isLive:
+        _style = curses.A_BOLD | curses.A_BLINK | curses.A_ITALIC | curses.A_UNDERLINE
+    c_print(screen, 1, 3, Common.api.roomLiver, _style)
+    screen.refresh()
+
+def main(stdscr):
+    global screen
+    screen = stdscr.subwin(23, 79, 0, 0)
+    screen.timeout(2000)
+    screen.box()
+    screen.hline(2, 1, curses.ACS_HLINE, 77)
+    c_print(screen, 1, 2, " "*45 + " 西瓜录播助手 -- by JerryYan  ", curses.A_STANDOUT)
+    render(screen)
+    while True:
+        c = stdscr.getch()
+        if c == ord("q"):
+            break
+        elif c == ord("f"):
+            render(screen)
+
+
+stdscr = curses.initscr()
+curses.noecho()
+curses.cbreak()
+stdscr.keypad(1)
+curses.wrapper(main)
+stdscr.keypad(0)
+curses.echo()
+curses.nocbreak()
+curses.endwin()
+
diff --git a/CursesMain.py b/CursesMain.py
new file mode 100644
index 0000000..4a1f513
--- /dev/null
+++ b/CursesMain.py
@@ -0,0 +1,107 @@
+import curses
+
+from Struct.Chat import Chat
+from Struct.Gift import Gift
+from Struct.MemberMsg import MemberMsg
+from Struct.User import User
+from api import XiGuaLiveApi
+
+
+class Api(XiGuaLiveApi):
+    danmakuList = []
+    def onAd(self, i):
+        pass
+    def onChat(self, chat: Chat):
+        self.danmakuList.append(str(chat))
+    def onLike(self, user: User):
+        pass
+    def onEnter(self, msg: MemberMsg):
+        pass
+    def onJoin(self, user: User):
+        self.danmakuList.append(str(user))
+    def onSubscribe(self, user: User):
+        self.danmakuList.append(str(user))
+    def onPresent(self, gift: Gift):
+        pass
+    def onPresentEnd(self, gift: Gift):
+        self.danmakuList.append(str(gift))
+
+
+api = Api()
+widths = [
+    (126, 1), (159, 0), (687, 1), (710, 0), (711, 1),
+    (727, 0), (733, 1), (879, 0), (1154, 1), (1161, 0),
+    (4347, 1), (4447, 2), (7467, 1), (7521, 0), (8369, 1),
+    (8426, 0), (9000, 1), (9002, 2), (11021, 1), (12350, 2),
+    (12351, 1), (12438, 2), (12442, 0), (19893, 2), (19967, 1),
+    (55203, 2), (63743, 1), (64106, 2), (65039, 1), (65059, 0),
+    (65131, 2), (65279, 1), (65376, 2), (65500, 1), (65510, 2),
+    (120831, 1), (262141, 2), (1114109, 1),
+]
+
+
+def get_width(o):
+    global widths
+    if o == 0xe or o == 0xf:
+        return 0
+    for num, wid in widths:
+        if o <= num:
+            return wid
+    return 1
+
+
+def c_print(handle, y, x, string, style=curses.A_NORMAL):
+    if type(string) != str:
+        string = str(string)
+    for _i in string:
+        _w = get_width(ord(_i))
+        if(_w>1):
+            handle.addch(y, x+1, " ", style)
+        if _i != " " or style!=curses.A_NORMAL:
+            handle.addch(y, x, ord(_i), style)
+        else:
+            handle.addch(y, x, 0, style)
+        x += _w
+
+
+
+
+def render(screen):
+    screen.erase()
+    screen.box()
+    screen.hline(2, 1, curses.ACS_HLINE, 77)
+    c_print(screen, 1, 2, " "*45 + " 西瓜弹幕助手 -- by JerryYan  ", curses.A_STANDOUT)
+    _style = curses.A_DIM
+    if api.isLive:
+        _style = curses.A_BOLD | curses.A_BLINK | curses.A_ITALIC
+    c_print(screen, 1, 3, api.roomLiver, _style)
+    _y = 3
+    api.getDanmaku()
+    for i in api.danmakuList[-10:]:
+        c_print(screen, _y, 2, i)
+        _y += 1
+    screen.move(0,0)
+    screen.refresh()
+
+def main(stdscr):
+    global screen
+    screen = stdscr.subwin(23, 79, 0, 0)
+    screen.timeout(2000)
+    render(screen)
+    while True:
+        c = screen.getch()
+        if c == ord("q"):
+            break
+        render(screen)
+
+
+stdscr = curses.initscr()
+curses.noecho()
+curses.cbreak()
+stdscr.keypad(1)
+curses.wrapper(main)
+stdscr.keypad(0)
+curses.echo()
+curses.nocbreak()
+curses.endwin()
+