You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

socket.go 1.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package irc
  2. import (
  3. "bufio"
  4. "io"
  5. "net"
  6. )
  7. const (
  8. R = '→'
  9. W = '←'
  10. EOF = ""
  11. )
  12. type Socket struct {
  13. conn net.Conn
  14. writer *bufio.Writer
  15. }
  16. func NewSocket(conn net.Conn, commands chan<- Command) *Socket {
  17. socket := &Socket{
  18. conn: conn,
  19. writer: bufio.NewWriter(conn),
  20. }
  21. go socket.readLines(commands)
  22. return socket
  23. }
  24. func (socket *Socket) String() string {
  25. return socket.conn.RemoteAddr().String()
  26. }
  27. func (socket *Socket) Close() {
  28. socket.conn.Close()
  29. Log.debug.Printf("%s closed", socket)
  30. }
  31. func (socket *Socket) readLines(commands chan<- Command) {
  32. commands <- &ProxyCommand{
  33. hostname: AddrLookupHostname(socket.conn.RemoteAddr()),
  34. }
  35. scanner := bufio.NewScanner(socket.conn)
  36. for scanner.Scan() {
  37. line := scanner.Text()
  38. if len(line) == 0 {
  39. continue
  40. }
  41. Log.debug.Printf("%s → %s", socket, line)
  42. msg, err := ParseCommand(line)
  43. if err != nil {
  44. // TODO error messaging to client
  45. continue
  46. }
  47. commands <- msg
  48. }
  49. if err := scanner.Err(); err != nil {
  50. Log.debug.Printf("%s error: %s", socket, err)
  51. }
  52. commands <- &QuitCommand{
  53. message: "connection closed",
  54. }
  55. close(commands)
  56. }
  57. func (socket *Socket) Write(line string) (err error) {
  58. if _, err = socket.writer.WriteString(line); socket.isError(err, W) {
  59. return
  60. }
  61. if _, err = socket.writer.WriteString(CRLF); socket.isError(err, W) {
  62. return
  63. }
  64. if err = socket.writer.Flush(); socket.isError(err, W) {
  65. return
  66. }
  67. Log.debug.Printf("%s ← %s", socket, line)
  68. return
  69. }
  70. func (socket *Socket) isError(err error, dir rune) bool {
  71. if err != nil {
  72. if err != io.EOF {
  73. Log.debug.Printf("%s %c error: %s", socket, dir, err)
  74. }
  75. return true
  76. }
  77. return false
  78. }