eserver.rb 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. require 'eventmachine'
  2. require 'tempfile'
  3. require 'fiber'
  4. require_relative '../monolog'
  5. module Woe
  6. class Server
  7. include Monolog
  8. def initialize(port =7000, logname="woe.log")
  9. Monolog.setup_all(logname)
  10. @port = port
  11. # Keep an overall record of the client IDs allocated
  12. # and the lines of chat
  13. @client_id = 0
  14. @clients = {}
  15. @tick_id = 0
  16. @fiber = nil
  17. end
  18. def get_free_client_id
  19. cli = 0
  20. @clients.each do |client|
  21. return cli if client.nil?
  22. cli += 1
  23. end
  24. return cli
  25. end
  26. def start()
  27. log_info("Server listening on port #@port")
  28. @signature = EventMachine.start_server("0.0.0.0", @port, Client) do |client|
  29. client_id = get_free_client_id
  30. client.id = client_id
  31. client.server = self
  32. @clients[client_id] = client
  33. end
  34. EventMachine.add_periodic_timer(1) do
  35. @tick_id += 1
  36. # self.broadcast("Tick tock #{@tick_id}\n")
  37. end
  38. end
  39. def run
  40. log_info("Server main loop starts.")
  41. EventMachine.run do
  42. self.start
  43. end
  44. end
  45. def disconnect(id)
  46. log_info("Server disconnecting client #{@id}")
  47. @clients.delete(id)
  48. end
  49. def clients_stopped?
  50. end
  51. def reload
  52. log_info("Server reload")
  53. broadcast("Server reload NOW!\n")
  54. begin
  55. load 'lib/telnet.rb'
  56. load 'lib/woe/client.rb'
  57. load 'lib/woe/server.rb'
  58. broadcast("Server reloaded OK.\n")
  59. rescue Exception => ex
  60. bt = ex.backtrace.join("\n")
  61. log_error("Server reload failed: #{ex}: #{bt}")
  62. broadcast("Server reload exception #{ex}: #{bt}!\n")
  63. end
  64. end
  65. def stop
  66. log_info("Server stop")
  67. EventMachine.stop_server(@signature)
  68. EventMachine.add_timer(1) do
  69. EventMachine.stop
  70. log_info("Server stop OK.")
  71. end
  72. end
  73. def broadcast(msg)
  74. @clients.each do |id, client|
  75. client.send_data(msg)
  76. end
  77. end
  78. def self.run(port=7000, logname="woe.log")
  79. server = Woe::Server.new(port, logname)
  80. server.run
  81. end
  82. end
  83. end