An example chat server in golang.
Go to file
AJ ONeal 1061dd4c71 typo fix README 2018-08-06 17:42:44 -06:00
public update docs 2018-08-02 11:33:47 -06:00
.gitignore Initial commit 2018-07-21 21:45:42 +00:00
LICENSE Initial commit 2018-07-21 21:45:42 +00:00
README.md typo fix README 2018-08-06 17:42:44 -06:00
chatserver-http.go GEFN (good enough for now) 2018-08-02 02:52:55 -06:00
chatserver-telnet.go bugfixes 2018-08-02 12:02:04 -06:00
chatserver.go update usage 2018-08-06 13:04:22 -06:00
config.sample.yml even more cleanup 2018-08-02 02:13:56 -06:00

README.md

chat.go

Rudimentary go chat server as a fun project.

Install

git clone https://git.coolaj86.com/coolaj86/chat.go.git

go get gopkg.in/yaml.v2
go get github.com/emicklei/go-restful

Note: I also copied some code directly from https://github.com/polvi/sni/blob/master/sni.go

Usage

Start the server

go run -race chatserver*.go -conf ./config.yml

See sample config file at config.sample.yml.

Connect clients

You can connect multiple clients.

telnet localhost 4080

You can also use HTTP.

curl http://localhost:4080

Testing Beyond Localhost

You can use Telebit to share the experience with friends and loved ones:

Completely userspace installation:

curl -fsSL https://get.telebit.cloud | bash

Easy configuration:

~/telebit http 4080
> Forwarding https://lucky-duck-42.telebit.fun => localhost:4080

~/telebit tcp 4080
> Forwarding telebit.cloud:1234 => localhost:4080

Caveat: Due to a bug in telebit you must send 'hello' in telnet to establish a connection.

API Docs

The API docs and examples can be seen at http://localhost:4080

Project Approach

I've understood theoretical principles of Go for a long time and I've always loved it. However, most of that came from watching Go Tech Talks and going to meetups.

This is my first Go project and my primary goal was to learn how to use Go for the kinds of things that I'm personally interested in while also satisfying a mix of the requirements and optional add-ons, and show you that I know how to write code and learn.

Criteria Met

  • Works
  • Attention to Detail
    • Security
    • UX
    • Performance
  • Commenting
  • Creativity

Limitations

  • Good coding style

This is my first Go project so I was learning as I went and trying different approaches. As a result my code style is inconsistent and probably does some things the wrong way (especially confusing since I probably did it the right way in other places).

Implemented

  • Awesome telnet server
    • Multiple clients can connect
    • Messages are relayed to all clients
    • Includes timestamp, name of client
    • Config file for port and addr
  • HTTP API
    • Post message
    • List messages
    • Serve Docs
    • Working curl examples
  • Multiplex the same port (because I wanted to learn)
  • E-mail "magic link" authentication (minus the link since it's localhost)

Not Implemented

I don't think these things would be difficult to add, but I was having fun learning lots of other things and I figured they're not that important.

  • local log file
  • Rooms
  • Blocking
  • UI for HTTP API