server.rb 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. require 'eventmachine'
  2. require 'tempfile'
  3. require 'fiber'
  4. module Woe
  5. class Server
  6. def initialize(port =7000)
  7. @port = port
  8. # Keep an overall record of the client IDs allocated
  9. # and the lines of chat
  10. @client_id = 0
  11. @clients = {}
  12. @tick_id = 0
  13. @fiber = nil
  14. end
  15. def start()
  16. @signature = EventMachine.start_server("0.0.0.0", @port, Client) do |client|
  17. @client_id += 1
  18. client.id = @client_id
  19. client.server = self
  20. @clients[@client_id] = client
  21. end
  22. EventMachine.add_periodic_timer(1) do
  23. @tick_id += 1
  24. # self.broadcast("Tick tock #{@tick_id}\n")
  25. end
  26. end
  27. def run
  28. EventMachine.run do
  29. self.start
  30. end
  31. end
  32. def disconnect(id)
  33. @clients.delete(id)
  34. end
  35. def clients_stopped?
  36. end
  37. def reload
  38. broadcast("Reloading\n")
  39. begin
  40. load 'lib/woe/server.rb'
  41. broadcast("Reloaded\n")
  42. rescue Exception => ex
  43. broadcast("Exception #{ex}: #{ex.backtrace.join("\n")}!\n")
  44. end
  45. end
  46. def stop
  47. EventMachine.stop_server(@signature)
  48. EventMachine.add_timer(1) { EventMachine.stop }
  49. end
  50. def broadcast(msg)
  51. @clients.each do |id, client|
  52. client.send_data(msg)
  53. end
  54. end
  55. def self.run(port=7000)
  56. server = Woe::Server.new(port)
  57. server.run
  58. end
  59. end
  60. end