Skip to content

Instantly share code, notes, and snippets.

@nanoninja
Last active October 21, 2016 22:32
Show Gist options
  • Save nanoninja/d55c3e51e317b69571d724ecebb73604 to your computer and use it in GitHub Desktop.
Save nanoninja/d55c3e51e317b69571d724ecebb73604 to your computer and use it in GitHub Desktop.
Simple GoBot Chat
// Simple Chat Server. It does not broadcast to other people.
// It can be used to create a bot.
package main
import (
"bufio"
"fmt"
"io"
"log"
"net"
"time"
)
func main() {
server, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatalln(err)
}
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
log.Fatalln(err)
}
go handler(New(), conn)
}
}
func handler(chatServer *ChatServer, conn net.Conn) {
defer conn.Close()
scanner := bufio.NewScanner(conn)
io.WriteString(conn, "Enter your username: ")
scanner.Scan()
chatServer.Username = scanner.Text()
fmt.Fprintf(conn, "%s joined: \n", chatServer.Username)
go func() {
for scanner.Scan() {
chatServer.Message <- scanner.Text()
}
}()
for m := range chatServer.Message {
t := time.Now().Format("15:04:05")
s := fmt.Sprintf("%s %s [%s]: %s\n", t, conn.RemoteAddr(), chatServer.Username, m)
fmt.Print(s)
io.WriteString(conn, s)
}
}
// ChatServer is a messenger.
type ChatServer struct {
Username string
Message chan string
}
// New returns an instance of ChatServer.
func New() *ChatServer {
return &ChatServer{Message: make(chan string)}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment