123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- require 'eventmachine'
- require 'tempfile'
- require 'fiber'
- require_relative '../monolog'
- module Woe
- class Server
- include Monolog
-
- def initialize(port =7000, logname="woe.log")
- Monolog.setup_all(logname)
- @port = port
-
-
- @client_id = 0
- @clients = {}
- @tick_id = 0
- @fiber = nil
- end
-
- def get_free_client_id
- cli = 0
- @clients.each do |client|
- return cli if client.nil?
- cli += 1
- end
- return cli
- end
-
- def start()
- log_info("Server listening on port #@port")
- @signature = EventMachine.start_server("0.0.0.0", @port, Client) do |client|
- client_id = get_free_client_id
- client.id = client_id
- client.server = self
- @clients[client_id] = client
- end
- EventMachine.add_periodic_timer(1) do
- @tick_id += 1
-
- end
- end
-
-
- def run
- log_info("Server main loop starts.")
- EventMachine.run do
- self.start
- end
- end
-
-
- def disconnect(id)
- log_info("Server disconnecting client #{@id}")
- @clients.delete(id)
- end
-
- def clients_stopped?
- end
-
- def reload
- log_info("Server reload")
- broadcast("Server reload NOW!\n")
- begin
- load 'lib/telnet.rb'
- load 'lib/woe/client.rb'
- load 'lib/woe/server.rb'
- broadcast("Server reloaded OK.\n")
- rescue Exception => ex
- bt = ex.backtrace.join("\n")
- log_error("Server reload failed: #{ex}: #{bt}")
- broadcast("Server reload exception #{ex}: #{bt}!\n")
- end
- end
-
- def stop
- log_info("Server stop")
- EventMachine.stop_server(@signature)
- EventMachine.add_timer(1) do
- EventMachine.stop
- log_info("Server stop OK.")
- end
- end
-
-
- def broadcast(msg)
- @clients.each do |id, client|
- client.send_data(msg)
- end
- end
-
- def self.run(port=7000, logname="woe.log")
- server = Woe::Server.new(port, logname)
- server.run
- end
-
- end
- end
|