// 命令输入相关 package main import ( "bufio" "log" "os" "sort" "time" ) // 列出正在直播的主播 func listLive() { streamers.RLock() lives := make([]streamer, 0, len(streamers.crt)) for _, s := range streamers.crt { if s.isLiveOn() { lives = append(lives, s) } } streamers.RUnlock() sort.Slice(lives, func(i, j int) bool { return lives[i].UID < lives[j].UID }) log.Println("正在直播的主播:") for _, s := range lives { log.Println(s.longID() + ":" + s.getTitle() + " " + s.getURL()) } } // 列出正在录制直播弹幕的主播 func listDanmu() { lInfoMap.RLock() danmu := make([]liveInfo, 0, len(lInfoMap.info)) for _, info := range lInfoMap.info { if info.isDanmu { danmu = append(danmu, info) } } lInfoMap.RUnlock() sort.Slice(danmu, func(i, j int) bool { return danmu[i].uid < danmu[j].uid }) log.Println("正在录制直播弹幕的主播:") for _, d := range danmu { s := streamer{UID: d.uid, Name: getName(d.uid)} log.Println(s.longID() + ":" + s.getTitle() + " " + s.getURL()) } } // 列出正在录制直播视频的主播 func listRecord() { lInfoMap.RLock() recs := make([]liveInfo, 0, len(lInfoMap.info)) for _, info := range lInfoMap.info { if info.isRecording { recs = append(recs, info) } } lInfoMap.RUnlock() sort.Slice(recs, func(i, j int) bool { return recs[i].uid < recs[j].uid }) log.Println("正在录制直播视频的主播:") for _, r := range recs { s := streamer{UID: r.uid, Name: getName(r.uid)} log.Println(s.longID() + ":" + r.recordFile) } } // 通知 main() 退出程序 func quitRun() { lPrintln("正在准备退出,请等待...") q := controlMsg{c: quit} mainCh <- q } // 处理输入 func handleInput() { defer func() { if err := recover(); err != nil { lPrintErr("Recovering from panic in handleInput(), the error is:", err) lPrintErr("输入处理发生错误,尝试重启输入处理") time.Sleep(2 * time.Second) go handleInput() } }() scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { handleAllCmd(scanner.Text()) } err := scanner.Err() checkErr(err) }