PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/irc/socket.go

http://github.com/jlatt/ergonomadic
Go | 95 lines | 80 code | 15 blank | 0 comment | 15 complexity | d3b61cc4fabb9a5fed8883002aadec98 MD5 | raw file
  1. package irc
  2. import (
  3. "bufio"
  4. "io"
  5. "net"
  6. )
  7. const (
  8. R = '→'
  9. W = '←'
  10. )
  11. type Socket struct {
  12. closed bool
  13. conn net.Conn
  14. scanner *bufio.Scanner
  15. writer *bufio.Writer
  16. }
  17. func NewSocket(conn net.Conn) *Socket {
  18. return &Socket{
  19. conn: conn,
  20. scanner: bufio.NewScanner(conn),
  21. writer: bufio.NewWriter(conn),
  22. }
  23. }
  24. func (socket *Socket) String() string {
  25. return socket.conn.RemoteAddr().String()
  26. }
  27. func (socket *Socket) Close() {
  28. if socket.closed {
  29. return
  30. }
  31. socket.closed = true
  32. socket.conn.Close()
  33. Log.debug.Printf("%s closed", socket)
  34. }
  35. func (socket *Socket) Read() (line string, err error) {
  36. if socket.closed {
  37. err = io.EOF
  38. return
  39. }
  40. for socket.scanner.Scan() {
  41. line = socket.scanner.Text()
  42. if len(line) == 0 {
  43. continue
  44. }
  45. Log.debug.Printf("%s → %s", socket, line)
  46. return
  47. }
  48. err = socket.scanner.Err()
  49. socket.isError(err, R)
  50. if err == nil {
  51. err = io.EOF
  52. }
  53. return
  54. }
  55. func (socket *Socket) Write(line string) (err error) {
  56. if socket.closed {
  57. err = io.EOF
  58. return
  59. }
  60. if _, err = socket.writer.WriteString(line); socket.isError(err, W) {
  61. return
  62. }
  63. if _, err = socket.writer.WriteString(CRLF); socket.isError(err, W) {
  64. return
  65. }
  66. if err = socket.writer.Flush(); socket.isError(err, W) {
  67. return
  68. }
  69. Log.debug.Printf("%s ← %s", socket, line)
  70. return
  71. }
  72. func (socket *Socket) isError(err error, dir rune) bool {
  73. if err != nil {
  74. if err != io.EOF {
  75. Log.debug.Printf("%s %c error: %s", socket, dir, err)
  76. }
  77. return true
  78. }
  79. return false
  80. }