2016-09-11 17:55:19 +02:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
import (
|
2016-09-25 22:34:02 +02:00
|
|
|
"fmt"
|
|
|
|
|
2016-09-11 17:55:19 +02:00
|
|
|
"github.com/gizak/termui"
|
2016-09-25 22:34:02 +02:00
|
|
|
"github.com/nlopes/slack"
|
2016-09-11 17:55:19 +02:00
|
|
|
|
|
|
|
"github.com/erroneousboat/slack-term/src/context"
|
|
|
|
"github.com/erroneousboat/slack-term/src/views"
|
|
|
|
)
|
|
|
|
|
|
|
|
func RegisterEventHandlers(ctx *context.AppContext) {
|
|
|
|
termui.Handle("/sys/kbd/", anyKeyHandler(ctx))
|
|
|
|
termui.Handle("/sys/wnd/resize", resizeHandler(ctx))
|
2016-09-25 22:34:02 +02:00
|
|
|
termui.Handle("/timer/1s", timeHandler(ctx))
|
|
|
|
|
|
|
|
// TODO: check channel of message should be added to correct channel
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case msg := <-ctx.Service.RTM.IncomingEvents:
|
|
|
|
switch ev := msg.Data.(type) {
|
|
|
|
case *slack.MessageEvent:
|
|
|
|
var name string
|
|
|
|
user, err := ctx.Service.Client.GetUserInfo(ev.User)
|
|
|
|
if err == nil {
|
|
|
|
name = user.Name
|
|
|
|
} else {
|
|
|
|
name = "unknown"
|
|
|
|
}
|
|
|
|
msg := fmt.Sprintf("[%s] %s", name, ev.Text)
|
|
|
|
ctx.View.Chat.AddMessage(msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
2016-09-11 17:55:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func anyKeyHandler(ctx *context.AppContext) func(termui.Event) {
|
|
|
|
return func(e termui.Event) {
|
|
|
|
key := e.Data.(termui.EvtKbd).KeyStr
|
|
|
|
|
|
|
|
if ctx.Mode == context.CommandMode {
|
|
|
|
switch key {
|
|
|
|
case "q":
|
|
|
|
actionQuit()
|
|
|
|
return
|
|
|
|
case "i":
|
|
|
|
actionInsertMode(ctx)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else if ctx.Mode == context.InsertMode {
|
|
|
|
switch key {
|
|
|
|
case "<escape>":
|
|
|
|
actionCommandMode(ctx)
|
|
|
|
return
|
|
|
|
case "<enter>":
|
|
|
|
actionSend(ctx)
|
|
|
|
return
|
|
|
|
case "<space>":
|
|
|
|
actionInput(ctx.View, " ")
|
|
|
|
return
|
|
|
|
case "<backspace>":
|
|
|
|
actionBackSpace(ctx.View)
|
|
|
|
case "C-8":
|
|
|
|
actionBackSpace(ctx.View)
|
|
|
|
case "<right>":
|
|
|
|
actionMoveCursorRight(ctx.View)
|
|
|
|
case "<left>":
|
|
|
|
actionMoveCursorLeft(ctx.View)
|
|
|
|
default:
|
|
|
|
actionInput(ctx.View, key)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func resizeHandler(ctx *context.AppContext) func(termui.Event) {
|
|
|
|
return func(e termui.Event) {
|
|
|
|
actionResize(ctx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-25 22:34:02 +02:00
|
|
|
func timeHandler(ctx *context.AppContext) func(termui.Event) {
|
|
|
|
return func(e termui.Event) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-11 17:55:19 +02:00
|
|
|
// FIXME: resize only seems to work for width and resizing it too small
|
|
|
|
// will cause termui to panic
|
|
|
|
func actionResize(ctx *context.AppContext) {
|
|
|
|
termui.Body.Width = termui.TermWidth()
|
|
|
|
termui.Body.Align()
|
|
|
|
termui.Render(termui.Body)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionInput(view *views.View, key string) {
|
|
|
|
view.Input.Insert(key)
|
|
|
|
termui.Render(view.Input)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionBackSpace(view *views.View) {
|
|
|
|
view.Input.Remove()
|
|
|
|
termui.Render(view.Input)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionMoveCursorRight(view *views.View) {
|
|
|
|
view.Input.MoveCursorRight()
|
|
|
|
termui.Render(view.Input)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionMoveCursorLeft(view *views.View) {
|
|
|
|
view.Input.MoveCursorLeft()
|
|
|
|
termui.Render(view.Input)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionSend(ctx *context.AppContext) {
|
|
|
|
if !ctx.View.Input.IsEmpty() {
|
|
|
|
// FIXME
|
2016-09-24 20:18:09 +02:00
|
|
|
ctx.View.Chat.List.Items = append(ctx.View.Chat.List.Items, ctx.View.Input.Text())
|
2016-09-11 17:55:19 +02:00
|
|
|
ctx.View.Input.Clear()
|
|
|
|
ctx.View.Refresh()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionQuit() {
|
|
|
|
termui.StopLoop()
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionInsertMode(ctx *context.AppContext) {
|
|
|
|
ctx.Mode = context.InsertMode
|
2016-09-25 22:34:02 +02:00
|
|
|
ctx.View.Mode.Par.Text = "INSERT"
|
2016-09-11 17:55:19 +02:00
|
|
|
termui.Render(ctx.View.Mode)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionCommandMode(ctx *context.AppContext) {
|
|
|
|
ctx.Mode = context.CommandMode
|
2016-09-25 22:34:02 +02:00
|
|
|
ctx.View.Mode.Par.Text = "NORMAL"
|
2016-09-11 17:55:19 +02:00
|
|
|
termui.Render(ctx.View.Mode)
|
|
|
|
}
|
2016-09-25 22:34:02 +02:00
|
|
|
|
|
|
|
// TODO: get message for channel
|
|
|
|
func actionGetMessages(ctx *context.AppContext) {
|
|
|
|
ctx.View.Chat.GetMessages(ctx.Service)
|
|
|
|
termui.Render(ctx.View.Chat)
|
|
|
|
}
|
|
|
|
|
|
|
|
func actionGetChannels(ctx *context.AppContext) {
|
|
|
|
ctx.View.Channels.GetChannels(ctx.Service)
|
|
|
|
termui.Render(ctx.View.Channels)
|
|
|
|
}
|