Last active
October 21, 2016 22:32
-
-
Save nanoninja/d55c3e51e317b69571d724ecebb73604 to your computer and use it in GitHub Desktop.
Simple GoBot Chat
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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