Project

General

Profile

Download (3.42 KB) Statistics
| Branch: | Tag: | Revision:
#--
# CyborgHood, a distributed system management software.
# Copyright (c) 2009-2010 Marc Dequènes (Duck) <Duck@DuckCorp.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#++

require 'cyborghood'
require 'cyborghood/cyborg/server'


module CyborgHood
class Cyborg
include I18nTranslation
bindtextdomain("cyborghood", {:path => Config::L10N_DIR, :charset => "UTF-8"})

def initialize
# load config
Config.load(self.human_name)
@config = Config.instance

# setup logs
unless @config.log.nil?
logger.output_level(@config.log.console_level) unless @config.log.console_level.nil?
unless @config.log.path.nil?
if File.directory? @config.log.path
logger.log_to_file(File.join(@config.log.path, "ch_#{self.class.human_name}.log"))
else
logger.fatal "Log path does not exist or is not a directory, exiting"
exit 1
end
end
end

setup

logger.info "Bot '#{self.human_name}' loaded"
end

def setup
end

def run
logger.info "Bot starting"
end

def ask_to_stop
logger.info "Bot was asked to stop..."
end
end

module SimpleServer
def setup
super
@server = BotServer.build(self.interface)
end

def run
super
@server.run
end

def ask_to_stop
@server.stop
super
end

def interface
CyborgServerInterface
end
end

class CyborgServerInterface
include Singleton

def initialize
@config = Config.instance
end

def api_modules
@modules ||= self.class.constants.select do |c|
cc = self.class.const_get(c)
cc.class == Class and cc.ancestors.include? CyborgServerInterface
end
end

def api_methods
@methods ||= self.methods.collect{|m| $1 if m =~ /^api_(.*)$/ }.compact
end

# preliminary incoming message handling
def call(cmd)
object, method = cmd.split('.', 2)

if method
begin
klass = object.split('::').inject(self.class) {|scope, const_name| scope.const_get(const_name)}
rescue
return "551 unknown object"
end
else
klass = self.class
method = cmd
end

inst = klass.instance
real_method = "api_#{method}"

unless inst.api_methods.include?(method)
return "551 this object has no such method"
end

begin
# preliminary outgoing message handling
return inst.send(real_method).to_yaml
rescue
return "550 method call failed"
end
end
end

class CyborgServerDefaultInterface < CyborgServerInterface
API_VERSION = "0.1~"

def api_product
PRODUCT
end

def api_version
VERSION
end

def api_api_version
API_VERSION
end

def api_bot_name
@config.bot_name
end
end
end
(2-2/8)