ssh-chat/serve.go

54 lines
1.0 KiB
Go

package main
import (
"fmt"
"github.com/shazow/ssh-chat/chat"
"github.com/shazow/ssh-chat/sshd"
)
func HandleTerminal(term *sshd.Terminal, channel *chat.Channel) {
defer term.Close()
name := term.Conn.User()
term.SetPrompt(fmt.Sprintf("[%s] ", name))
// TODO: term.AutoCompleteCallback = ...
user := chat.NewUserScreen(name, term)
defer user.Close()
err := channel.Join(user)
if err != nil {
logger.Errorf("Failed to join: %s", err)
return
}
defer func() {
err := channel.Leave(user)
if err != nil {
logger.Errorf("Failed to leave: %s", err)
}
}()
for {
// TODO: Handle commands etc?
line, err := term.ReadLine()
if err != nil {
// TODO: Catch EOF specifically?
logger.Errorf("Terminal reading error: %s", err)
return
}
m := chat.NewMessage(line).From(user)
channel.Send(*m)
}
}
// Serve a chat service onto the sshd server.
func Serve(listener *sshd.SSHListener) {
terminals := listener.ServeTerminal()
channel := chat.NewChannel()
for term := range terminals {
go HandleTerminal(term, channel)
}
}