├── go.mod ├── README.md └── main.go /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/mattn/koukoku-chat 2 | 3 | go 1.20 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # koukoku-chat 2 | 3 | 電子公告のチャット機能を利用できるチャットクライアント 4 | 5 | See https://twitter.com/dnobori/status/1699339202104889474 6 | 7 | ## Installation 8 | 9 | ``` 10 | go install github.com/mattn/koukoku-chat@latest 11 | ``` 12 | 13 | ## License 14 | 15 | MIT 16 | 17 | ## Author 18 | 19 | Yasuhiro Matsumoto (a.k.a. mattn) 20 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "crypto/tls" 6 | "fmt" 7 | "log" 8 | "os" 9 | "regexp" 10 | "strings" 11 | "sync" 12 | ) 13 | 14 | var re = regexp.MustCompile("[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))") 15 | 16 | func main() { 17 | config := tls.Config{Certificates: []tls.Certificate{}, InsecureSkipVerify: false} 18 | conn, err := tls.Dial("tcp", "koukoku.shadan.open.ad.jp:992", &config) 19 | if err != nil { 20 | log.Fatalf("client: dial: %s", err) 21 | } 22 | defer conn.Close() 23 | log.Println("client: connected to: ", conn.RemoteAddr()) 24 | fmt.Fprintln(conn, "nobody") 25 | 26 | var wg sync.WaitGroup 27 | wg.Add(1) 28 | go func() { 29 | defer wg.Done() 30 | scanner := bufio.NewScanner(conn) 31 | for scanner.Scan() { 32 | line := strings.TrimSpace(re.ReplaceAllString(scanner.Text(), "")) 33 | fmt.Println(line) 34 | } 35 | }() 36 | 37 | wg.Add(1) 38 | go func() { 39 | defer wg.Done() 40 | scanner := bufio.NewScanner(os.Stdin) 41 | for scanner.Scan() { 42 | fmt.Fprintln(conn, scanner.Text()) 43 | } 44 | }() 45 | 46 | wg.Wait() 47 | } 48 | --------------------------------------------------------------------------------