# 技術組 [toc] ## 技術組 (11) * 從 https://hackmd.io/qJuUVoePRauR5uGD5QX12A 複製過來的東東 * [RTFM](https://discord.com/developers/docs/intro) * 決定 language * 開發機器人 * 主要開發順序 * Bot alert API * 一旦使用上出現非預期錯誤,向特定 channel 發送錯誤報告 * 有助於 debug,使用者發生問題時亦能快速得知相關訊息 * 加入群組審核 * 串 google oauth * 用信箱驗證 * DB API (discord id + mail/圖) * 身份組選擇(訂閱)機制 * 回覆表情符號獲得身分組 -> 可以看到特定頻道 * 有訂閱的東西發的時候機器人會tag這個身分組 * 廣播機器人 * 純粹用 cd 限制濫用問題 * 即時頻道 & 以驗證頻道,也許前者可以有較短 cd? * 申請頻道機制 * 如何連署? * 不太急的 feature * 檢舉機制 * 實名私訊機制 * 私人語音頻道 * 濫用監控機制(考慮) * Cog * feature request 頻道 * 組長 * jerrycool123 * 成員 * ブイ(rareone0602) * KilinWei * lllIIIIllll * MartianSheep * Yvecca * 霏崎 * General_Winter * CKB * ChungVincent * Xiayu * Rayh ## 自我介紹 (?) credit: 電熊的表 方便我分配工作所以有任何你覺得有用的專長就幫我寫一下 | 姓名 or 暱稱 (方便稱呼??) | discord ID | 系級 | Discord bot/程設經驗/專長 | Gmail | |:------------------------- | ------------------- | ------------ |:------------------------------------------------------------------------------------------------------------ | ---------------------------- | | 翁祖毅 (jerry) | jerrycool123#7133 | 資工四 | 有寫過 discord.py, red discord bot,python/C/C++/java | jerrycool71534@gmail | | 陳光裕 (Yvecca) | Yvecca#3135 | 資工四 | 只會C、C++,python正在學習中 | justin881110@gmail.com| | 郭懷元 (Frank) | General_Winter#1576 | 資工二 | 摸過 discord.py,主要會 py & c ~~,修過NASA算一種技能嗎~~ | frank910311@gmail.com | | 鐘晨瑋 (VC) | ChungVincent#4447 | 大氣四 | 寫過 docker、flask 但都是小專案而已,python/C/C++ | b07209016@ntu.edu.tw | | 王程煜(霏崎) | 霏崎#4287 | 資工二(台科) | 碰過 discord.py,只寫過一些自用的小程式,C/C++/Python | b10915024@gapps.ntust.edu.tw | | 高宇颺(Xiayu) | Xiayu#0028 | 森林二 | 用過 discord.py,寫過3 4台機器人,python | b09605029@ntu.edu.tw | | 陳可邦(CKB) | ChenKB91#2206 | 資工二 | python & C, 做過簡單github page,修過NASA? | b09902011@ntu.edu.tw | | 黃柏睿(Ray)| Rayh#4581 | 電機二(雙資工) | 用過 discord.py| b09990171@ntu.edu.tw rayray2002.huang@gmail.com| | 葉柏宏(伊布) | ブイ#0602 | 資科二 | 給一些畫大餅的沒用意見 > [畫 furry](https://www.pixiv.net/users/16903036) > 開發(OOP 為主) > 寫測試 > 踩雷 | rareone0602@gmail.com | 任瑨洋(羊) | MartianSheep#3857 | 電機三 | 之前幫同學寫他discord bot的後台方便耍油,C/C++/Py/JS(React為主) | b08901132@ntu.edu.tw mkmarsscience@gmail.com |游孟霖(eric)|lllIIIIllll#8848|電機三|碰過C/C++/python/JS JS部分幾乎忘光了,沒寫過機器人,discord.py最近才剛開始看|b08901186@ntu.edu.tw ericispipi@gmail.com |魏麒凌 |KilinW#9999|土木五|碰過不少,但都很淺 寫過一點 discord.py 主要會python跟arduino相關| b06501033@ntu.edu.tw jack233924@gmail.com | 王迺翔 (迺) | came1#9443 | b02校友 | JS 網站開發 (MERN stack) Python 只會用來改寫好Code :P | narada.wang@hotmail.com | ## 小組 * Bot alert API (1) 10/24 完成 * jerry (組長) * 加入群組審核 (6) * mail/oauth (2) * Frank * eric (組長) * 人工驗證 (1) * Ray * UI(一開始選擇驗證方式 + 信箱驗證) (1) * CKB * database API (2) * 伊布 * VC * 身份組選擇(訂閱)機制 (2) * jerry (組長) * 羊 * 廣播機器人 (2) * Yvecca (組長) * Xiayu * 申請頻道機制 (2) * 霏崎 (組長) * KilinWei ## when2meet * https://www.when2meet.com/?13217150-TQume * 目前暫定的人週六 (10/16) 下午 2~6 點 * 備案: 週日 (10/17) 下午 2~6 點 ## 各 feature 的 language * discord.py 將停止運作 * 希望能夠以 python 為主 * 能支援 cog, slash command ## 身分組 * None * 只能看到【社群守則】頻道 * 已驗證 * 可以看到所有公開頻道 * 各頻道身分組 * 可以看到對應的私有頻道 * 各廣播身分組 * 可以接收對應的廣播 * 管理組 - moderator * 技術組 - developer * 組長 - admin ## 頻道 * 社群守則 * 身分組選擇區 * 違規處理區 * 分類: 廣播區 * 公告/校內重要或緊急事務廣播區 * 免費報你知 * 遺失物廣播區 * 新聞廣播區 * 各類校內活動廣播區 * 徵才/問卷廣播區 * 綜合留言版 * 分類: 臨時頻道 * 各頻道連署申請後創立 * 分類: 一般閒聊區 * 綜合閒聊區 * 學生事務閒聊區 * 校友閒聊區 * 教職員與其他人員閒聊區 * 敏感議題閒聊區 * 分類: 學院閒聊區 * 文學院 * 理學院 * 社會科學院 * 醫學院 * 工學院 * 生物資源暨農學院 * 管理學院 * 公共衛生學院 * 電機資訊學院 * 法律學院 * 生命科學院 * 國際學院 * 創新設計學院 * 共同教育中心 * 進修推廣學院 * 校內其他單位 * 分類: 子社群閒聊區 * 各頻道連署申請後創立,採訂閱制 * 分類: 語音頻道 * 公共 1~5 * 私人語音頻道 * 分類: 管理員區 * Bot alert channel * 分類: 私訊頻道區 * 分類: 頻道封存區 ## Discord bot feature * 按照 priority 高至低排列 * 所有 feature 分兩個面向 * User POV (point of view) * Admin POV ### Bot alert API * User POV * 一旦發生 error,告知 user `很抱歉,出現了非預期性的錯誤,請洽管理員` * Admin POV * 所有的 feature 都可以使用本 API * 建立特定的 bot alert channel,由 bot 包裝錯誤訊息與相關資訊並傳送 ### 加入 Discord 群組審核機制 * User POV * 於【社群守則】頻道點擊「我已同意上述條款」 * bot 發出 dm (direct message) 給 user: 請選擇【信箱驗證】或【人工驗證】 * user 選擇其中一種驗證方式 * 信箱驗證 * Implementation 1: NTU mail * bot: 請輸入 NTU mail * user 輸入 NTU mail * bot: 請再次確認 NTU mail 是否正確 * user: 打勾 * bot: 已寄送驗證碼到 NTU mail * user 至 NTU mail 獲取驗證碼 * bot: 請輸入驗證碼 * user 輸入驗證碼 * Implementation 2: NTU G-suite * bot: 請到下列網址使用 NTU G-suite 授權 * user 登入 NTU G-suite 帳號,授權給 NTU Discord * bot: 已驗證成功,您已獲取【已驗證】身分組 * 人工驗證 * bot: 請輸入您的姓名、職位/身分 * user: 輸入資訊 * bot: 請提供身分證明附圖 * user: 上傳圖片 * bot: 請再次確認資訊是否正確 * user: 打勾 * bot: 請稍候管理員審核,您已獲取【審核中】身分組 * (審核完成後)bot: 已驗證成功,您已獲取【已驗證】身分組 * Admin POV * 觸發驗證流程的條件 * 對有特定 ID 的訊息點擊特定的 emoji * 可以開發一個功能調整他對應的訊息、emoji * 不具有【已驗證】、【審核中】身分組 * CD * 串資料庫 * 資料庫的選擇 * sqlite,容易使用 & migrate * others? * mysql 能夠在 non-root 的情況下使用嗎? 還是說要開 docker? 但 jerry 對工作站 docker 不太熟 * 資料內容定義 * (discord ID, identity, image_path) * identity: mail account / 台大資工系教授 * image_path: 圖片的路徑 * 可能需要圖庫 (local/remote?) * image_path (為稀疏,是否可以和 identity 合併?) * 備份問題 * G-Suite oauth * 初步調查,台科大、台師大也有 G-Suite * 需要調查三者能夠使用的客群,好比: 校友、教授有沒有權使用 G-Suite 帳號? * 優點 * 方便,免去輸入驗證碼的流程 * 比較不怕濫用 (比如故意輸入別人的 NTU mail) * 比自架安全、可靠 * 缺點 * jerry 對這個流程不太熟,可能需要更多調查,包含: * 如何用 python 實作 * 所謂的【授權】包含了哪些資訊? * G-Suite 的普及問題 * 人工驗證流程 * 管理員需要建立一個頻道,專門來審核人工驗證訊息 * 審核過後,該頻道訊息會自動移除 * 以 dm 通知 user 審核結果 * 隱私權問題 * 管理員是否要 audit 使用者對機器人的輸入? * 優點是有人在惡意輸入的時候能及時發現並阻止 ### 身份組選擇(訂閱)機制 * User POV * 瀏覽數個選擇身分組的頻道 * 查看身分組選擇的訊息 * 點選對應的表情符號以獲取身分組 * Admin POV * 資料庫 * 記錄身分組選擇的頻道,需要可以增刪 * 頻道原本就存在,僅是登記用 * 記錄這些頻道內的身分組選擇訊息,自動增刪 * 記錄這些身分組選擇訊息包含的 entry,需要可以增刪 * entry 的增刪可以寫成 API,使得其他 feature 也能呼叫(如增刪廣播身分組/增刪頻道身分組) * 因其有結構層次,推薦用 json * 用資料庫la * 可選擇身分組列表的資料結構 * 一個訊息最多包含 10 個 entry (nope) * 一個 entry 包含可供選擇的身分組、其說明文字與表情符號 * 用 discord embed 包起來很好看 * 實作(預設為 moderator 能使用) * 偵測 emoji * `on_raw_reaction_add` instead of `on_reaction_add` * 為了效率,可以在 memory 裡 maintain 身分組選擇頻道的列表,這樣就不須處理在這些頻道外的 emoji 事件。 * 新增身分組選擇頻道 * arg1: #channel * 不會新增頻道,僅綁定 * 刪除身分組選擇頻道 * arg1: #channel * 只有 admin 能使用,避免誤刪 * 不會刪除頻道,僅取消綁定 * 不會刪除身分組,僅刪除該頻道先前記錄的 entry,也因此需要警示指令執行者有多少個 entry 會受到影響 * 新增選擇身分組的 entry * arg1: \@身份組, arg2: #channel, arg3: 身分組說明, arg4: emoji * 確認參數是否合法 * 不可以為管理員身分組 * 刪除選擇身分組的 entry * arg1: \@身分組 * 同樣只有 admin 能使用,避免誤刪 * call Entry Manage API * Entry Manage API * 內建 `dict` 資料結構與相關的查找/修改 functions * `RoleSelection: dict` * `'metadata': dict` * `'maxEntryPerMessage': int` (default 10) * `'channels': list of dict` * `'channel_id': int` * `'messages': list of dict` * `'message_id': int` * `'entries': list of dict` * `'role_id': int` * `'description': str` * `'emoji': int` * 一個身分組僅允許一個 entry 存在 * 保證 I/O atomicity * 用 json 來儲存資料(因為理論上不會存太多資料) * API * `getRole(channl_id: int, emoji: str) -> Optional[discord.Role]` * `channel_id`: discord channel ID * `emoji`: a default unicode emoji of discord * return value * `discord.Role`: the corresponding role * `None`: channel_id doesn't exist or no corresponding role * `modifyRoleSelectionChannel(mount: bool, channel_id: int) -> bool` * `mount`: * `True`: mount * `False`: unmount * `channel_id`: discord channel ID * return value * `True`: success * `False`: channel_id doesn't exist or has already/never been mounted * `modifyRoleSelectionEntry(add: bool, role_id: int, channel_id: int, description: str, emoji: str) -> bool` * `add`: * `True`: add * `False`: remove * `role_id`: discord role ID * `channel_id`: discord channel ID (required when `add == True`) * `description`: description to this role (required when `add == True`) * `emoji`: a default unicode emoji of discord (required when `add == True`) * return value * `True`: success * `False`: either `role_id`, `channel_id`, `description`, `emoji` is invalid * Extension and Discuss results / 修憲 * 原則:少少的頻道裡面有一些訊息,這些訊息下面會有emoji可以點 * 巢狀結構 * 訊息必須專注在同一件事情上,同一件事情的emoji都放在同一個訊息 * 情況:今天有人新增一個頻道,導致多出了一個新的身分組 * 新增頻道的時候要指定大類別 * 類別應該是管理員指定,可以由管理員新增 * 類別可刪iff下面沒有身分組 * 同一類別的新身分歸類在同一個訊息裡面 * 遊戲類別 etc. * 爆20個再開新訊息 * 許多相似類別的訊息歸類在一個很高階級的頻道下面 * 學術身分組選擇 * 休閒身分組選擇 etc. * 情況:刪除身分組 * 更改選擇身分組的訊息 * 下次新增的時候記得要從這邊開始加(有點像memory arrangement) * 訊息裡的emoji刪光光的時候要刪掉訊息 * 由於沒辦法移植emoji,不考慮合併 * "刪除"是把這個身分組從db裡面移除,然後把emoji撤下而已,不要真的去刪掉那個身分組(比較像身分組被archieve) * 用資料庫la * 記得把讀寫資料庫的操作全部wrap在一起 * 可是json有巢狀 * 直接存很多筆資料在db裡面 * 一筆資料包括哪個類別、哪個頻道、哪個訊息、哪個emoji對應到哪個身分組 * 問題:要怎麼知道從哪個訊息開始加身分組 * 暴力:每次新增的時候直接count * 暴力2:直接新增一個新的table紀錄每個訊息有幾個身分組 * 進度報告 * git開個branch * dc那邊進度報告 ### 廣播機器人 * User POV * 廣播接收者 * 使用訂閱機制獲取身分組 * 廣播發送者 * 私訊機器人送出指令 * 選擇廣播種類 * 主旨與內文 * 待定 * Admin POV * 使用指令增刪廣播身分組 * 預設要有哪些? * 使用訂閱機制的 function,為其在特定頻道增刪可選擇的身分組 * 對每種廣播要定義其冷卻時間和發送頻道 * 同樣可以用 json 存 ### 申請頻道機制 * User POV * 連署機制尚待管理組討論 * Admin POV * 申請通過後 * bot 新增頻道與對應身分組 * 挑戰: 如何在特定位置新增頻道? * bot 設定僅有該身分組能檢視頻道 * 使用訂閱機制的 function,為其在特定頻道新增可選擇的身分組 * 頻道消滅 * 刪除對應身分組 * 使用訂閱機制的 function,為其在特定頻道刪除可選擇的身分組 * 方案1: archive * 唯獨 * 公開可見,移動分類至【頻道封存區】 * 一旦頻道過多,封存頻道的淘汰機制是? * 方案2: delete * 需要備份資料嗎? 要存在哪裡?