client.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package main
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "os"
  8. "time"
  9. )
  10. type Client struct {
  11. server *Server
  12. conn net.Conn
  13. Ip string
  14. Line string
  15. Prompt string
  16. PromptWLine bool
  17. }
  18. func NewClient(server *Server, conn net.Conn) *Client {
  19. ip := conn.RemoteAddr().String()
  20. c := &Client{
  21. server: server,
  22. conn: conn,
  23. Ip: ip,
  24. Line: "",
  25. Prompt: "Login: ",
  26. PromptWLine: true,
  27. }
  28. go c.reader()
  29. return c
  30. }
  31. func (c *Client) Write(text string) {
  32. c.conn.Write([]byte(text))
  33. }
  34. var clearLine = bytes.Repeat([]byte("\b \b"), 500)
  35. func (c *Client) InsertWrite(text string) {
  36. c.conn.Write(clearLine)
  37. c.Write(text)
  38. if len(c.Prompt) != 0 {
  39. c.Write(c.Prompt)
  40. if c.PromptWLine {
  41. c.Write(c.Line)
  42. }
  43. }
  44. }
  45. func (c *Client) reader() {
  46. var (
  47. buf []byte = make([]byte, 1024) // 1kb
  48. read int
  49. err error
  50. )
  51. for {
  52. c.conn.SetReadDeadline(time.Now().Add(time.Duration(200) * time.Millisecond))
  53. read, err = c.conn.Read(buf)
  54. if err != nil {
  55. if errors.Is(err, net.ErrClosed) || errors.Is(err, os.ErrClosed) {
  56. return
  57. } else if errors.Is(err, os.ErrDeadlineExceeded) {
  58. if read != 0 {
  59. c.process(string(buf[0:read]))
  60. }
  61. continue
  62. } else {
  63. fmt.Printf("%s ERR> %v", c.Ip, err)
  64. continue
  65. }
  66. }
  67. if read != 0 {
  68. c.process(string(buf[0:read]))
  69. }
  70. }
  71. }
  72. func (c *Client) process(input string) {
  73. // Process the input as far as ENTER/RETURN and keys being pressed
  74. // This will require a state machine to track where the client is (Login, Password, Sitting in their ship, Accessing computer, etc)
  75. // For now we'll just echo it back
  76. c.Write(input)
  77. }