reorder some files
This commit is contained in:
parent
f126ba7cce
commit
77b1a93b30
3 changed files with 220 additions and 201 deletions
201
command.go
201
command.go
|
|
@ -2,129 +2,92 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (app *App) Stat() (res string, err error) {
|
type Command func(*App, string)
|
||||||
if _, err := app.conn.Write([]byte("STAT\n")); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
var str strings.Builder
|
var CommandMap map[string]Command
|
||||||
for range 3 {
|
|
||||||
if !app.conn.Scanner.Scan() {
|
|
||||||
return "", app.conn.Scanner.Err()
|
|
||||||
}
|
|
||||||
str.Write(app.conn.Scanner.Bytes())
|
|
||||||
str.WriteRune(' ')
|
|
||||||
}
|
|
||||||
|
|
||||||
return str.String(), nil
|
func initCommandMap() {
|
||||||
}
|
CommandMap = map[string]Command{
|
||||||
|
"help": func(app *App, rest string) {
|
||||||
func (app *App) Send(data string) (num int, err error) {
|
var s strings.Builder
|
||||||
if _, err := fmt.Fprintf(app.conn, "SEND %s\n", data); err != nil {
|
for name, _ := range CommandMap {
|
||||||
return 0, err
|
if name == "q" {
|
||||||
}
|
continue
|
||||||
|
}
|
||||||
if !app.conn.Scanner.Scan() {
|
s.WriteString(name)
|
||||||
return 0, app.conn.Scanner.Err()
|
s.WriteRune(' ')
|
||||||
}
|
}
|
||||||
numRaw := app.conn.Scanner.Text()
|
app.AppendSystemMessage("commands: %s", s.String())
|
||||||
num, err = strconv.Atoi(numRaw)
|
},
|
||||||
if err != nil {
|
"dial": func(app *App, rest string) {
|
||||||
return 0, err
|
args := strings.Fields(rest)
|
||||||
}
|
if len(args) < 1 || len(args) > 2 {
|
||||||
return num, nil
|
app.AppendSystemMessage("usage: /connect host [port]")
|
||||||
}
|
}
|
||||||
|
host := args[0]
|
||||||
func (app *App) Poll(since int) (num int, err error) {
|
port := "44322"
|
||||||
if _, err := fmt.Fprintf(app.conn, "POLL %d\n", since); err != nil {
|
if len(args) == 2 {
|
||||||
return 0, err
|
port = args[1]
|
||||||
}
|
}
|
||||||
|
app.outgoing <- DialEvent{host, port}
|
||||||
if !app.conn.Scanner.Scan() {
|
},
|
||||||
return 0, app.conn.Scanner.Err()
|
"hangup": func(app *App, rest string) {
|
||||||
}
|
app.outgoing <- HangupEvent{}
|
||||||
numRaw := app.conn.Scanner.Text()
|
},
|
||||||
num, err = strconv.Atoi(numRaw)
|
"nick": func(app *App, rest string) {
|
||||||
if err != nil {
|
if rest == "" {
|
||||||
return 0, err
|
app.AppendSystemMessage("nick: your nickname is %s", app.nick)
|
||||||
}
|
} else {
|
||||||
return num, nil
|
app.SetNick(rest)
|
||||||
}
|
app.AppendSystemMessage("nick: your nickname is now %s", app.nick)
|
||||||
|
if err := os.WriteFile(path.Join(app.cfgHome, "nick"), []byte(rest), 0o700); err != nil {
|
||||||
func (app *App) Skip(since int) (num int, err error) {
|
app.AppendSystemMessage("nick: failed to persist nickname: %s", err)
|
||||||
if _, err := fmt.Fprintf(app.conn, "SKIP %d\n", since); err != nil {
|
}
|
||||||
return 0, err
|
}
|
||||||
}
|
},
|
||||||
|
"poll": func(app *App, rest string) {
|
||||||
if !app.conn.Scanner.Scan() {
|
if rest == "" {
|
||||||
return 0, app.conn.Scanner.Err()
|
app.outgoing <- ManualPollEvent(app.last)
|
||||||
}
|
} else {
|
||||||
num, err = strconv.Atoi(app.conn.Scanner.Text())
|
num, err := strconv.Atoi(rest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
app.AppendSystemMessage("poll: invalid number %s", rest)
|
||||||
}
|
} else {
|
||||||
|
if num == 0 {
|
||||||
for range num {
|
app.conn.ticker.Stop()
|
||||||
if !app.conn.Scanner.Scan() {
|
app.conn.rate = 0
|
||||||
return 0, err
|
app.AppendSystemMessage("poll: disabled automatic polling")
|
||||||
}
|
} else {
|
||||||
app.incoming <- MessageEvent(app.conn.Scanner.Text())
|
app.conn.rate = time.Second * time.Duration(num)
|
||||||
}
|
app.conn.ticker.Stop()
|
||||||
|
app.conn.ticker = time.NewTicker(app.conn.rate)
|
||||||
if !app.conn.Scanner.Scan() {
|
app.AppendSystemMessage("poll: polling every %s", app.conn.rate.String())
|
||||||
return 0, app.conn.Scanner.Err()
|
}
|
||||||
}
|
}
|
||||||
last, err := strconv.Atoi(app.conn.Scanner.Text())
|
}
|
||||||
if err != nil {
|
},
|
||||||
return 0, err
|
"me": func(app *App, rest string) {
|
||||||
}
|
msg := fmt.Sprintf("%s %s", app.nick, rest)
|
||||||
app.incoming <- SetLastEvent(last)
|
app.AppendMessage(msg)
|
||||||
|
app.outgoing <- MessageEvent(msg)
|
||||||
return num, nil
|
},
|
||||||
}
|
"clear": func(app *App, rest string) {
|
||||||
|
clear(app.pager.Segments)
|
||||||
func (app *App) Last(n int) (num int, err error) {
|
app.pager.Layout()
|
||||||
if n == 0 {
|
app.AppendSystemMessage("cleared message history")
|
||||||
return 0, nil
|
},
|
||||||
}
|
"quit": func(app *App, rest string) {
|
||||||
|
app.stop()
|
||||||
if _, err := fmt.Fprintf(app.conn, "LAST %d\n", n); err != nil {
|
},
|
||||||
return 0, err
|
"q": func(app *App, rest string) {
|
||||||
}
|
app.stop()
|
||||||
|
},
|
||||||
var nsrv int
|
}
|
||||||
if !app.conn.Scanner.Scan() {
|
|
||||||
return 0, app.conn.Scanner.Err()
|
|
||||||
}
|
|
||||||
nsrvRaw := app.conn.Scanner.Text()
|
|
||||||
nsrv, err = strconv.Atoi(nsrvRaw)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if nsrv != 0 {
|
|
||||||
for range nsrv {
|
|
||||||
if !app.conn.Scanner.Scan() {
|
|
||||||
return 0, app.conn.Scanner.Err()
|
|
||||||
}
|
|
||||||
app.incoming <- MessageEvent(app.conn.Scanner.Text())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var last int
|
|
||||||
if !app.conn.Scanner.Scan() {
|
|
||||||
return 0, app.conn.Scanner.Err()
|
|
||||||
}
|
|
||||||
lastRaw := app.conn.Scanner.Text()
|
|
||||||
last, err = strconv.Atoi(lastRaw)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
app.incoming <- SetLastEvent(last)
|
|
||||||
|
|
||||||
return nsrv, nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
94
main.go
94
main.go
|
|
@ -8,7 +8,6 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -18,87 +17,6 @@ import (
|
||||||
"git.sr.ht/~rockorager/vaxis/widgets/textinput"
|
"git.sr.ht/~rockorager/vaxis/widgets/textinput"
|
||||||
)
|
)
|
||||||
|
|
||||||
var CommandMap map[string]func(*App, string)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
CommandMap = map[string]func(*App, string){
|
|
||||||
"help": func(app *App, rest string) {
|
|
||||||
var s strings.Builder
|
|
||||||
for name, _ := range CommandMap {
|
|
||||||
if name == "q" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
s.WriteString(name)
|
|
||||||
s.WriteRune(' ')
|
|
||||||
}
|
|
||||||
app.AppendSystemMessage("commands: %s", s.String())
|
|
||||||
},
|
|
||||||
"dial": func(app *App, rest string) {
|
|
||||||
args := strings.Fields(rest)
|
|
||||||
if len(args) < 1 || len(args) > 2 {
|
|
||||||
app.AppendSystemMessage("usage: /connect host [port]")
|
|
||||||
}
|
|
||||||
host := args[0]
|
|
||||||
port := "44322"
|
|
||||||
if len(args) == 2 {
|
|
||||||
port = args[1]
|
|
||||||
}
|
|
||||||
app.outgoing <- DialEvent{host, port}
|
|
||||||
},
|
|
||||||
"hangup": func(app *App, rest string) {
|
|
||||||
app.outgoing <- HangupEvent{}
|
|
||||||
},
|
|
||||||
"nick": func(app *App, rest string) {
|
|
||||||
if rest == "" {
|
|
||||||
app.AppendSystemMessage("nick: your nickname is %s", app.nick)
|
|
||||||
} else {
|
|
||||||
app.SetNick(rest)
|
|
||||||
app.AppendSystemMessage("nick: your nickname is now %s", app.nick)
|
|
||||||
if err := os.WriteFile(path.Join(app.cfgHome, "nick"), []byte(rest), 0o700); err != nil {
|
|
||||||
app.AppendSystemMessage("nick: failed to persist nickname: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"poll": func(app *App, rest string) {
|
|
||||||
if rest == "" {
|
|
||||||
app.outgoing <- ManualPollEvent(app.last)
|
|
||||||
} else {
|
|
||||||
num, err := strconv.Atoi(rest)
|
|
||||||
if err != nil {
|
|
||||||
app.AppendSystemMessage("poll: invalid number %s", rest)
|
|
||||||
} else {
|
|
||||||
if num == 0 {
|
|
||||||
app.conn.ticker.Stop()
|
|
||||||
app.conn.rate = 0
|
|
||||||
app.AppendSystemMessage("poll: disabled automatic polling")
|
|
||||||
} else {
|
|
||||||
app.conn.rate = time.Second * time.Duration(num)
|
|
||||||
app.conn.ticker.Stop()
|
|
||||||
app.conn.ticker = time.NewTicker(app.conn.rate)
|
|
||||||
app.AppendSystemMessage("poll: polling every %s", app.conn.rate.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"me": func(app *App, rest string) {
|
|
||||||
msg := fmt.Sprintf("%s %s", app.nick, rest)
|
|
||||||
app.AppendMessage(msg)
|
|
||||||
app.outgoing <- MessageEvent(msg)
|
|
||||||
},
|
|
||||||
"clear": func(app *App, rest string) {
|
|
||||||
app.pager.Segments = []vaxis.Segment{}
|
|
||||||
app.pager.Layout()
|
|
||||||
app.AppendSystemMessage("cleared message history")
|
|
||||||
},
|
|
||||||
"quit": func(app *App, rest string) {
|
|
||||||
app.stop()
|
|
||||||
},
|
|
||||||
"q": func(app *App, rest string) {
|
|
||||||
app.stop()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type App struct {
|
type App struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
stop context.CancelFunc
|
stop context.CancelFunc
|
||||||
|
|
@ -133,9 +51,13 @@ type Conn struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) AppendMessage(data string) {
|
func (app *App) AppendMessage(data string) {
|
||||||
// TODO: make messages without a nick italic
|
nick, _, found := strings.Cut(data, ": ")
|
||||||
|
style := vaxis.Style{}
|
||||||
|
if !found || strings.TrimSpace(nick) != nick {
|
||||||
|
style.Attribute = vaxis.AttrItalic
|
||||||
|
}
|
||||||
app.pager.Segments = append(app.pager.Segments,
|
app.pager.Segments = append(app.pager.Segments,
|
||||||
vaxis.Segment{Text: data},
|
vaxis.Segment{Text: data, Style: style},
|
||||||
vaxis.Segment{Text: "\n"},
|
vaxis.Segment{Text: "\n"},
|
||||||
)
|
)
|
||||||
app.last += 1
|
app.last += 1
|
||||||
|
|
@ -230,6 +152,10 @@ func (app *App) Finish() {
|
||||||
HangupEvent{}.HandleOutgoing(app)
|
HangupEvent{}.HandleOutgoing(app)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
initCommandMap()
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := NewApp()
|
app := NewApp()
|
||||||
defer app.Finish()
|
defer app.Finish()
|
||||||
|
|
|
||||||
130
protocol.go
Normal file
130
protocol.go
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (app *App) Stat() (res string, err error) {
|
||||||
|
if _, err := app.conn.Write([]byte("STAT\n")); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var str strings.Builder
|
||||||
|
for range 3 {
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return "", app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
str.Write(app.conn.Scanner.Bytes())
|
||||||
|
str.WriteRune(' ')
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) Send(data string) (num int, err error) {
|
||||||
|
if _, err := fmt.Fprintf(app.conn, "SEND %s\n", data); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
numRaw := app.conn.Scanner.Text()
|
||||||
|
num, err = strconv.Atoi(numRaw)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return num, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) Poll(since int) (num int, err error) {
|
||||||
|
if _, err := fmt.Fprintf(app.conn, "POLL %d\n", since); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
numRaw := app.conn.Scanner.Text()
|
||||||
|
num, err = strconv.Atoi(numRaw)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return num, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) Skip(since int) (num int, err error) {
|
||||||
|
if _, err := fmt.Fprintf(app.conn, "SKIP %d\n", since); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
num, err = strconv.Atoi(app.conn.Scanner.Text())
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for range num {
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
app.incoming <- MessageEvent(app.conn.Scanner.Text())
|
||||||
|
}
|
||||||
|
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
last, err := strconv.Atoi(app.conn.Scanner.Text())
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
app.incoming <- SetLastEvent(last)
|
||||||
|
|
||||||
|
return num, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) Last(n int) (num int, err error) {
|
||||||
|
if n == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := fmt.Fprintf(app.conn, "LAST %d\n", n); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var nsrv int
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
nsrvRaw := app.conn.Scanner.Text()
|
||||||
|
nsrv, err = strconv.Atoi(nsrvRaw)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if nsrv != 0 {
|
||||||
|
for range nsrv {
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
app.incoming <- MessageEvent(app.conn.Scanner.Text())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var last int
|
||||||
|
if !app.conn.Scanner.Scan() {
|
||||||
|
return 0, app.conn.Scanner.Err()
|
||||||
|
}
|
||||||
|
lastRaw := app.conn.Scanner.Text()
|
||||||
|
last, err = strconv.Atoi(lastRaw)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
app.incoming <- SetLastEvent(last)
|
||||||
|
|
||||||
|
return nsrv, nil
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue