mirror of
https://github.com/shazow/ssh-chat.git
synced 2025-04-17 01:12:23 +03:00
54 lines
1.0 KiB
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)
|
|
}
|
|
|
|
}
|