mirror of
https://github.com/shazow/ssh-chat.git
synced 2025-06-05 01:43:20 +03:00
Super broken but kinda working.
This commit is contained in:
parent
a1d5cc6735
commit
eda2b7c0d9
@ -7,7 +7,6 @@ const channelBuffer = 10
|
|||||||
|
|
||||||
// Channel definition, also a Set of User Items
|
// Channel definition, also a Set of User Items
|
||||||
type Channel struct {
|
type Channel struct {
|
||||||
id string
|
|
||||||
topic string
|
topic string
|
||||||
history *History
|
history *History
|
||||||
users *Set
|
users *Set
|
||||||
@ -15,11 +14,10 @@ type Channel struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create new channel and start broadcasting goroutine.
|
// Create new channel and start broadcasting goroutine.
|
||||||
func NewChannel(id string) *Channel {
|
func NewChannel() *Channel {
|
||||||
broadcast := make(chan Message, channelBuffer)
|
broadcast := make(chan Message, channelBuffer)
|
||||||
|
|
||||||
ch := Channel{
|
ch := Channel{
|
||||||
id: id,
|
|
||||||
broadcast: broadcast,
|
broadcast: broadcast,
|
||||||
history: NewHistory(historyLen),
|
history: NewHistory(historyLen),
|
||||||
users: NewSet(),
|
users: NewSet(),
|
||||||
@ -27,8 +25,14 @@ func NewChannel(id string) *Channel {
|
|||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for m := range broadcast {
|
for m := range broadcast {
|
||||||
|
// TODO: Handle commands etc?
|
||||||
ch.users.Each(func(u Item) {
|
ch.users.Each(func(u Item) {
|
||||||
u.(*User).Send(m)
|
user := u.(*User)
|
||||||
|
if m.from == user {
|
||||||
|
// Skip
|
||||||
|
return
|
||||||
|
}
|
||||||
|
user.Send(m)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -11,7 +11,7 @@ func TestChannel(t *testing.T) {
|
|||||||
s := &MockScreen{}
|
s := &MockScreen{}
|
||||||
u := NewUser("foo")
|
u := NewUser("foo")
|
||||||
|
|
||||||
ch := NewChannel("")
|
ch := NewChannel()
|
||||||
defer ch.Close()
|
defer ch.Close()
|
||||||
|
|
||||||
err := ch.Join(u)
|
err := ch.Join(u)
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
var ErrInvalidCommand error = errors.New("invalid command")
|
var ErrInvalidCommand error = errors.New("invalid command")
|
||||||
var ErrNoOwner error = errors.New("command without owner")
|
var ErrNoOwner error = errors.New("command without owner")
|
||||||
|
|
||||||
type CmdHandler func(host Host, msg Message, args []string) error
|
type CmdHandler func(msg Message, args []string) error
|
||||||
|
|
||||||
type Commands map[string]CmdHandler
|
type Commands map[string]CmdHandler
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ func (c Commands) Add(cmd string, handler CmdHandler) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Execute command message, assumes IsCommand was checked
|
// Execute command message, assumes IsCommand was checked
|
||||||
func (c Commands) Run(host Host, msg Message) error {
|
func (c Commands) Run(msg Message) error {
|
||||||
if msg.from == nil {
|
if msg.from == nil {
|
||||||
return ErrNoOwner
|
return ErrNoOwner
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ func (c Commands) Run(host Host, msg Message) error {
|
|||||||
return ErrInvalidCommand
|
return ErrInvalidCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
return handler(host, msg, args)
|
return handler(msg, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultCmdHandlers Commands
|
var defaultCmdHandlers Commands
|
||||||
@ -37,7 +37,7 @@ var defaultCmdHandlers Commands
|
|||||||
func init() {
|
func init() {
|
||||||
c := Commands{}
|
c := Commands{}
|
||||||
|
|
||||||
c.Add("me", func(host Host, msg Message, args []string) error {
|
c.Add("me", func(msg Message, args []string) error {
|
||||||
me := strings.TrimLeft(msg.Body, "/me")
|
me := strings.TrimLeft(msg.Body, "/me")
|
||||||
if me == "" {
|
if me == "" {
|
||||||
me = " is at a loss for words."
|
me = " is at a loss for words."
|
||||||
|
28
chat/host.go
28
chat/host.go
@ -1,28 +0,0 @@
|
|||||||
package chat
|
|
||||||
|
|
||||||
// Host knows about all the commands and channels.
|
|
||||||
type Host struct {
|
|
||||||
defaultChannel *Channel
|
|
||||||
commands Commands
|
|
||||||
done chan struct{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewHost() *Host {
|
|
||||||
h := Host{
|
|
||||||
commands: defaultCmdHandlers,
|
|
||||||
}
|
|
||||||
h.defaultChannel = h.CreateChannel("")
|
|
||||||
return &h
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Host) handleCommand(m Message) {
|
|
||||||
// TODO: ...
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Host) broadcast(ch *Channel, m Message) {
|
|
||||||
// TODO: ...
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Host) CreateChannel(id string) *Channel {
|
|
||||||
return NewChannel(id)
|
|
||||||
}
|
|
@ -9,8 +9,9 @@ import (
|
|||||||
// Container for messages sent to chat
|
// Container for messages sent to chat
|
||||||
type Message struct {
|
type Message struct {
|
||||||
Body string
|
Body string
|
||||||
from *User // Not set for Sys messages
|
from *User // Not set for Sys messages
|
||||||
to *User // Only set for PMs
|
to *User // Only set for PMs
|
||||||
|
channel *Channel // Not set for global commands
|
||||||
timestamp time.Time
|
timestamp time.Time
|
||||||
themeCache *map[*Theme]string
|
themeCache *map[*Theme]string
|
||||||
}
|
}
|
||||||
@ -35,6 +36,12 @@ func (m *Message) From(u *User) *Message {
|
|||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set channel
|
||||||
|
func (m *Message) Channel(ch *Channel) *Message {
|
||||||
|
m.channel = ch
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
// Render message based on the given theme
|
// Render message based on the given theme
|
||||||
func (m *Message) Render(*Theme) string {
|
func (m *Message) Render(*Theme) string {
|
||||||
// TODO: Return []byte?
|
// TODO: Return []byte?
|
||||||
|
65
cmd.go
65
cmd.go
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -13,6 +12,10 @@ import (
|
|||||||
"github.com/alexcesaro/log"
|
"github.com/alexcesaro/log"
|
||||||
"github.com/alexcesaro/log/golog"
|
"github.com/alexcesaro/log/golog"
|
||||||
"github.com/jessevdk/go-flags"
|
"github.com/jessevdk/go-flags"
|
||||||
|
"golang.org/x/crypto/ssh"
|
||||||
|
|
||||||
|
"github.com/shazow/ssh-chat/chat"
|
||||||
|
"github.com/shazow/ssh-chat/sshd"
|
||||||
)
|
)
|
||||||
import _ "net/http/pprof"
|
import _ "net/http/pprof"
|
||||||
|
|
||||||
@ -52,9 +55,6 @@ func main() {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize seed for random colors
|
|
||||||
RandomColorInit()
|
|
||||||
|
|
||||||
// Figure out the log level
|
// Figure out the log level
|
||||||
numVerbose := len(options.Verbose)
|
numVerbose := len(options.Verbose)
|
||||||
if numVerbose > len(logLevels) {
|
if numVerbose > len(logLevels) {
|
||||||
@ -78,12 +78,55 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
server, err := NewServer(privateKey)
|
signer, err := ssh.ParsePrivateKey(privateKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Failed to create server: %v", err)
|
logger.Errorf("Failed to prase key: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: MakeAuth
|
||||||
|
config := sshd.MakeNoAuth()
|
||||||
|
config.AddHostKey(signer)
|
||||||
|
|
||||||
|
s, err := sshd.ListenSSH(options.Bind, config)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("Failed to listen on socket: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
|
terminals := s.ServeTerminal()
|
||||||
|
channel := chat.NewChannel()
|
||||||
|
|
||||||
|
// TODO: Move this elsewhere
|
||||||
|
go func() {
|
||||||
|
for term := range terminals {
|
||||||
|
go func() {
|
||||||
|
defer term.Close()
|
||||||
|
name := term.Conn.User()
|
||||||
|
term.SetPrompt(fmt.Sprintf("[%s]", name))
|
||||||
|
// TODO: term.AutoCompleteCallback = ...
|
||||||
|
user := chat.NewUserScreen(name, term)
|
||||||
|
channel.Join(user)
|
||||||
|
|
||||||
|
for {
|
||||||
|
// TODO: Handle commands etc?
|
||||||
|
line, err := term.ReadLine()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
m := chat.NewMessage(line).From(user)
|
||||||
|
channel.Send(*m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Handle disconnect sooner (currently closes channel before removing)
|
||||||
|
channel.Leave(user)
|
||||||
|
user.Close()
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
for _, fingerprint := range options.Admin {
|
for _, fingerprint := range options.Admin {
|
||||||
server.Op(fingerprint)
|
server.Op(fingerprint)
|
||||||
}
|
}
|
||||||
@ -109,23 +152,17 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
motdString := string(motd[:])
|
motdString := string(motd[:])
|
||||||
/* hack to normalize line endings into \r\n */
|
// hack to normalize line endings into \r\n
|
||||||
motdString = strings.Replace(motdString, "\r\n", "\n", -1)
|
motdString = strings.Replace(motdString, "\r\n", "\n", -1)
|
||||||
motdString = strings.Replace(motdString, "\n", "\r\n", -1)
|
motdString = strings.Replace(motdString, "\n", "\r\n", -1)
|
||||||
server.SetMotd(motdString)
|
server.SetMotd(motdString)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Construct interrupt handler
|
// Construct interrupt handler
|
||||||
sig := make(chan os.Signal, 1)
|
sig := make(chan os.Signal, 1)
|
||||||
signal.Notify(sig, os.Interrupt)
|
signal.Notify(sig, os.Interrupt)
|
||||||
|
|
||||||
err = server.Start(options.Bind)
|
|
||||||
if err != nil {
|
|
||||||
logger.Errorf("Failed to start server: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
<-sig // Wait for ^C signal
|
<-sig // Wait for ^C signal
|
||||||
logger.Warningf("Interrupt signal detected, shutting down.")
|
logger.Warningf("Interrupt signal detected, shutting down.")
|
||||||
server.Stop()
|
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ package sshd
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// Handle opening socket error
|
// Handle opening socket error
|
||||||
}
|
}
|
||||||
|
defer s.Close()
|
||||||
|
|
||||||
terminals := s.ServeTerminal()
|
terminals := s.ServeTerminal()
|
||||||
|
|
||||||
@ -21,7 +22,7 @@ package sshd
|
|||||||
term.AutoCompleteCallback = nil // ...
|
term.AutoCompleteCallback = nil // ...
|
||||||
|
|
||||||
for {
|
for {
|
||||||
line, err := term.Readline()
|
line, err := term.ReadLine()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user