---
# System prepended metadata

title: 技術組

---

# 技術組

[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 |
| XXX(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
            * 需要備份資料嗎? 要存在哪裡?