agent_xmpp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/.document +5 -0
  2. data/.gitignore +11 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +417 -0
  5. data/Rakefile +75 -0
  6. data/VERSION +1 -0
  7. data/agent_xmpp.gemspec +144 -0
  8. data/lib/agent_xmpp.rb +22 -0
  9. data/lib/agent_xmpp/admin.rb +113 -0
  10. data/lib/agent_xmpp/client.rb +7 -0
  11. data/lib/agent_xmpp/client/boot.rb +83 -0
  12. data/lib/agent_xmpp/client/client.rb +64 -0
  13. data/lib/agent_xmpp/client/connection.rb +108 -0
  14. data/lib/agent_xmpp/client/controller.rb +394 -0
  15. data/lib/agent_xmpp/client/message_delegate.rb +720 -0
  16. data/lib/agent_xmpp/client/message_pipe.rb +193 -0
  17. data/lib/agent_xmpp/client/response.rb +102 -0
  18. data/lib/agent_xmpp/config.rb +48 -0
  19. data/lib/agent_xmpp/main.rb +175 -0
  20. data/lib/agent_xmpp/models.rb +7 -0
  21. data/lib/agent_xmpp/models/contact.rb +85 -0
  22. data/lib/agent_xmpp/models/message.rb +152 -0
  23. data/lib/agent_xmpp/models/publication.rb +53 -0
  24. data/lib/agent_xmpp/models/roster.rb +107 -0
  25. data/lib/agent_xmpp/models/service.rb +91 -0
  26. data/lib/agent_xmpp/models/subscription.rb +61 -0
  27. data/lib/agent_xmpp/models/table_definitions.rb +107 -0
  28. data/lib/agent_xmpp/patches.rb +7 -0
  29. data/lib/agent_xmpp/patches/array.rb +32 -0
  30. data/lib/agent_xmpp/patches/float.rb +10 -0
  31. data/lib/agent_xmpp/patches/hash.rb +13 -0
  32. data/lib/agent_xmpp/patches/object.rb +15 -0
  33. data/lib/agent_xmpp/patches/rexml.rb +69 -0
  34. data/lib/agent_xmpp/patches/string.rb +15 -0
  35. data/lib/agent_xmpp/xmpp.rb +18 -0
  36. data/lib/agent_xmpp/xmpp/element.rb +158 -0
  37. data/lib/agent_xmpp/xmpp/entry.rb +36 -0
  38. data/lib/agent_xmpp/xmpp/error_response.rb +189 -0
  39. data/lib/agent_xmpp/xmpp/iq.rb +90 -0
  40. data/lib/agent_xmpp/xmpp/iq_command.rb +54 -0
  41. data/lib/agent_xmpp/xmpp/iq_disco.rb +206 -0
  42. data/lib/agent_xmpp/xmpp/iq_pubsub.rb +270 -0
  43. data/lib/agent_xmpp/xmpp/iq_roster.rb +183 -0
  44. data/lib/agent_xmpp/xmpp/iq_version.rb +89 -0
  45. data/lib/agent_xmpp/xmpp/jid.rb +150 -0
  46. data/lib/agent_xmpp/xmpp/message.rb +82 -0
  47. data/lib/agent_xmpp/xmpp/presence.rb +127 -0
  48. data/lib/agent_xmpp/xmpp/sasl.rb +241 -0
  49. data/lib/agent_xmpp/xmpp/stanza.rb +107 -0
  50. data/lib/agent_xmpp/xmpp/x_data.rb +357 -0
  51. data/test/app/app.rb +339 -0
  52. data/test/cases/test_application_message_processing.rb +65 -0
  53. data/test/cases/test_errors.rb +24 -0
  54. data/test/cases/test_presence_management.rb +139 -0
  55. data/test/cases/test_roster_management.rb +214 -0
  56. data/test/cases/test_service_discovery.rb +168 -0
  57. data/test/cases/test_session_management.rb +120 -0
  58. data/test/cases/test_version_discovery.rb +67 -0
  59. data/test/helpers/matchers.rb +23 -0
  60. data/test/helpers/mocks.rb +82 -0
  61. data/test/helpers/test_case_extensions.rb +45 -0
  62. data/test/helpers/test_client.rb +44 -0
  63. data/test/helpers/test_delegate.rb +60 -0
  64. data/test/helpers/test_helper.rb +91 -0
  65. data/test/messages/application_messages.rb +206 -0
  66. data/test/messages/error_messages.rb +35 -0
  67. data/test/messages/presence_messages.rb +66 -0
  68. data/test/messages/roster_messages.rb +126 -0
  69. data/test/messages/service_discovery_messages.rb +201 -0
  70. data/test/messages/session_messages.rb +158 -0
  71. data/test/messages/version_discovery_messages.rb +69 -0
  72. data/test/peer/peer.rb +21 -0
  73. metadata +187 -0
@@ -0,0 +1,75 @@
1
+ ############################################################################################################
2
+ $:.unshift('lib')
3
+ require 'rubygems'
4
+ require 'rake'
5
+ require 'agent_xmpp/config'
6
+
7
+ #####-------------------------------------------------------------------------------------------------------
8
+ task :default => :test
9
+
10
+ #####-------------------------------------------------------------------------------------------------------
11
+ begin
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ gem.name = "agent_xmpp"
15
+ gem.summary = %Q{Agent XMPP is a ruby XMPP bot framework inspired by MVC web frameworks.}
16
+ gem.email = "troy.stribling@gmail.com"
17
+ gem.homepage = "http://github.com/troystribling/agent_xmpp"
18
+ gem.authors = ["Troy Stribling"]
19
+ gem.files.include %w(lib/jeweler/templates/.gitignore VERSION)
20
+ gem.add_dependency('rake', '>= 0.8.3')
21
+ gem.add_dependency('eventmachine', '>= 0.12.6')
22
+ gem.add_dependency('sequel', '>= 3.9.0')
23
+ gem.add_dependency('evma_xmlpushparser', '>= 0.0.1')
24
+ end
25
+ rescue LoadError
26
+ abort "jeweler is not available. In order to run test, you must: sudo gem install technicalpickles-jeweler --source=http://gems.github.com"
27
+ end
28
+
29
+ #####-------------------------------------------------------------------------------------------------------
30
+ task :uninstall do
31
+ %x[gem uninstall agent_xmpp]
32
+ end
33
+
34
+ #####-------------------------------------------------------------------------------------------------------
35
+ task :default => [:test]
36
+
37
+ #####-------------------------------------------------------------------------------------------------------
38
+ require 'rake/testtask'
39
+ Rake::TestTask.new(:test) do |test|
40
+ test.libs << ['test/cases', 'test/helpers', 'test/messages']
41
+ test.pattern = 'test/cases/**/test_*.rb'
42
+ test.verbose = true
43
+ end
44
+
45
+ #####-------------------------------------------------------------------------------------------------------
46
+ Rake::TestTask.new(:test_case) do |test|
47
+ file = ENV["FILE"] || ''
48
+ test.libs << ['test/cases', 'test/helpers', 'test/messages']
49
+ test.test_files = ["test/cases/#{file}"]
50
+ test.verbose = true
51
+ end
52
+
53
+ #####-------------------------------------------------------------------------------------------------------
54
+ begin
55
+ require 'rcov/rcovtask'
56
+ Rcov::RcovTask.new do |test|
57
+ test.libs << 'test'
58
+ test.pattern = 'test/**/test_*.rb'
59
+ test.verbose = true
60
+ end
61
+ rescue LoadError
62
+ task :rcov do
63
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov --source=http://gems.github.com"
64
+ end
65
+ end
66
+
67
+ #####-------------------------------------------------------------------------------------------------------
68
+ require 'rake/rdoctask'
69
+ Rake::RDocTask.new do |rdoc|
70
+ rdoc.rdoc_dir = 'rdoc'
71
+ rdoc.title = "agent_xmpp #{AgentXmpp::VERSION}"
72
+ rdoc.rdoc_files.include('README*')
73
+ rdoc.rdoc_files.include('lib/**/*.rb')
74
+ end
75
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,144 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{agent_xmpp}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Troy Stribling"]
12
+ s.date = %q{2010-08-21}
13
+ s.email = %q{troy.stribling@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "agent_xmpp.gemspec",
26
+ "lib/agent_xmpp.rb",
27
+ "lib/agent_xmpp/admin.rb",
28
+ "lib/agent_xmpp/client.rb",
29
+ "lib/agent_xmpp/client/boot.rb",
30
+ "lib/agent_xmpp/client/client.rb",
31
+ "lib/agent_xmpp/client/connection.rb",
32
+ "lib/agent_xmpp/client/controller.rb",
33
+ "lib/agent_xmpp/client/message_delegate.rb",
34
+ "lib/agent_xmpp/client/message_pipe.rb",
35
+ "lib/agent_xmpp/client/response.rb",
36
+ "lib/agent_xmpp/config.rb",
37
+ "lib/agent_xmpp/main.rb",
38
+ "lib/agent_xmpp/models.rb",
39
+ "lib/agent_xmpp/models/contact.rb",
40
+ "lib/agent_xmpp/models/message.rb",
41
+ "lib/agent_xmpp/models/publication.rb",
42
+ "lib/agent_xmpp/models/roster.rb",
43
+ "lib/agent_xmpp/models/service.rb",
44
+ "lib/agent_xmpp/models/subscription.rb",
45
+ "lib/agent_xmpp/models/table_definitions.rb",
46
+ "lib/agent_xmpp/patches.rb",
47
+ "lib/agent_xmpp/patches/array.rb",
48
+ "lib/agent_xmpp/patches/float.rb",
49
+ "lib/agent_xmpp/patches/hash.rb",
50
+ "lib/agent_xmpp/patches/object.rb",
51
+ "lib/agent_xmpp/patches/rexml.rb",
52
+ "lib/agent_xmpp/patches/string.rb",
53
+ "lib/agent_xmpp/xmpp.rb",
54
+ "lib/agent_xmpp/xmpp/element.rb",
55
+ "lib/agent_xmpp/xmpp/entry.rb",
56
+ "lib/agent_xmpp/xmpp/error_response.rb",
57
+ "lib/agent_xmpp/xmpp/iq.rb",
58
+ "lib/agent_xmpp/xmpp/iq_command.rb",
59
+ "lib/agent_xmpp/xmpp/iq_disco.rb",
60
+ "lib/agent_xmpp/xmpp/iq_pubsub.rb",
61
+ "lib/agent_xmpp/xmpp/iq_roster.rb",
62
+ "lib/agent_xmpp/xmpp/iq_version.rb",
63
+ "lib/agent_xmpp/xmpp/jid.rb",
64
+ "lib/agent_xmpp/xmpp/message.rb",
65
+ "lib/agent_xmpp/xmpp/presence.rb",
66
+ "lib/agent_xmpp/xmpp/sasl.rb",
67
+ "lib/agent_xmpp/xmpp/stanza.rb",
68
+ "lib/agent_xmpp/xmpp/x_data.rb",
69
+ "test/app/app.rb",
70
+ "test/cases/test_application_message_processing.rb",
71
+ "test/cases/test_errors.rb",
72
+ "test/cases/test_presence_management.rb",
73
+ "test/cases/test_roster_management.rb",
74
+ "test/cases/test_service_discovery.rb",
75
+ "test/cases/test_session_management.rb",
76
+ "test/cases/test_version_discovery.rb",
77
+ "test/helpers/matchers.rb",
78
+ "test/helpers/mocks.rb",
79
+ "test/helpers/test_case_extensions.rb",
80
+ "test/helpers/test_client.rb",
81
+ "test/helpers/test_delegate.rb",
82
+ "test/helpers/test_helper.rb",
83
+ "test/messages/application_messages.rb",
84
+ "test/messages/error_messages.rb",
85
+ "test/messages/presence_messages.rb",
86
+ "test/messages/roster_messages.rb",
87
+ "test/messages/service_discovery_messages.rb",
88
+ "test/messages/session_messages.rb",
89
+ "test/messages/version_discovery_messages.rb",
90
+ "test/peer/peer.rb"
91
+ ]
92
+ s.homepage = %q{http://github.com/troystribling/agent_xmpp}
93
+ s.rdoc_options = ["--charset=UTF-8"]
94
+ s.require_paths = ["lib"]
95
+ s.rubygems_version = %q{1.3.5}
96
+ s.summary = %q{Agent XMPP is a ruby XMPP bot framework inspired by MVC web frameworks.}
97
+ s.test_files = [
98
+ "test/app/app.rb",
99
+ "test/cases/test_application_message_processing.rb",
100
+ "test/cases/test_errors.rb",
101
+ "test/cases/test_presence_management.rb",
102
+ "test/cases/test_roster_management.rb",
103
+ "test/cases/test_service_discovery.rb",
104
+ "test/cases/test_session_management.rb",
105
+ "test/cases/test_version_discovery.rb",
106
+ "test/helpers/matchers.rb",
107
+ "test/helpers/mocks.rb",
108
+ "test/helpers/test_case_extensions.rb",
109
+ "test/helpers/test_client.rb",
110
+ "test/helpers/test_delegate.rb",
111
+ "test/helpers/test_helper.rb",
112
+ "test/messages/application_messages.rb",
113
+ "test/messages/error_messages.rb",
114
+ "test/messages/presence_messages.rb",
115
+ "test/messages/roster_messages.rb",
116
+ "test/messages/service_discovery_messages.rb",
117
+ "test/messages/session_messages.rb",
118
+ "test/messages/version_discovery_messages.rb",
119
+ "test/peer/peer.rb"
120
+ ]
121
+
122
+ if s.respond_to? :specification_version then
123
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
124
+ s.specification_version = 3
125
+
126
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
127
+ s.add_runtime_dependency(%q<rake>, [">= 0.8.3"])
128
+ s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.6"])
129
+ s.add_runtime_dependency(%q<sequel>, [">= 3.9.0"])
130
+ s.add_runtime_dependency(%q<evma_xmlpushparser>, [">= 0.0.1"])
131
+ else
132
+ s.add_dependency(%q<rake>, [">= 0.8.3"])
133
+ s.add_dependency(%q<eventmachine>, [">= 0.12.6"])
134
+ s.add_dependency(%q<sequel>, [">= 3.9.0"])
135
+ s.add_dependency(%q<evma_xmlpushparser>, [">= 0.0.1"])
136
+ end
137
+ else
138
+ s.add_dependency(%q<rake>, [">= 0.8.3"])
139
+ s.add_dependency(%q<eventmachine>, [">= 0.12.6"])
140
+ s.add_dependency(%q<sequel>, [">= 3.9.0"])
141
+ s.add_dependency(%q<evma_xmlpushparser>, [">= 0.0.1"])
142
+ end
143
+ end
144
+
@@ -0,0 +1,22 @@
1
+ $:.unshift(File.dirname(__FILE__))
2
+
3
+ require 'find'
4
+ require 'singleton'
5
+ require 'logger'
6
+ require 'socket'
7
+ require 'optparse'
8
+ require 'rexml/document'
9
+ require 'base64'
10
+
11
+ require 'eventmachine'
12
+ require 'evma_xmlpushparser'
13
+
14
+ require 'sequel'
15
+
16
+ require 'agent_xmpp/patches'
17
+ require 'agent_xmpp/client'
18
+ require 'agent_xmpp/xmpp'
19
+ require 'agent_xmpp/config'
20
+ require 'agent_xmpp/models'
21
+ require 'agent_xmpp/main'
22
+ require 'agent_xmpp/admin'
@@ -0,0 +1,113 @@
1
+ #.........................................................................................................
2
+ # authorize command access
3
+ #.........................................................................................................
4
+ before :command => :all do
5
+ if access = route[:opts][:access]
6
+ jid = params[:from]
7
+ unless AgentXmpp.is_account_jid?(jid)
8
+ groups = AgentXmpp::Contact.find_by_jid(jid)[:groups]
9
+ [access].flatten.any?{|a| groups.include?(a)}
10
+ else; true; end
11
+ else; true; end
12
+ end
13
+
14
+ #.........................................................................................................
15
+ # admin commands
16
+ #.........................................................................................................
17
+ command 'admin/contacts', :access => 'admin' do
18
+ AgentXmpp.logger.info "ACTION: admin/contacts"
19
+ AgentXmpp::Contact.find_all.map{|c| {:jid => c[:jid], :sub => c[:subscription]}}
20
+ end
21
+
22
+ #.........................................................................................................
23
+ command 'admin/on_line_users', :access => 'admin' do
24
+ AgentXmpp.logger.info "ACTION: admin/on_line_users"
25
+ AgentXmpp::Roster.find_all_by_status(:available).map do |r|
26
+ jid = AgentXmpp::Xmpp::Jid.new(r[:jid])
27
+ {:jid => jid.bare, :resource => jid.resource}
28
+ end
29
+ end
30
+
31
+ #.........................................................................................................
32
+ command 'admin/add_contact', :access => 'admin' do
33
+ AgentXmpp.logger.info "ACTION: admin/add_contact"
34
+ on(:execute) do |form|
35
+ form.add_title('Add Contact')
36
+ form.add_jid_single('jid', 'contact JID')
37
+ form.add_text_single('groups', 'groups comma seperated')
38
+ end
39
+ on(:submit) do
40
+ contact = params[:data]
41
+ if contact["jid"]
42
+ AgentXmpp::Contact.update(contact)
43
+ xmpp_msg(AgentXmpp::Xmpp::IqRoster.update(pipe, contact["jid"], contact["groups"].split(/,/)))
44
+ xmpp_msg(AgentXmpp::Xmpp::Presence.subscribe(contact["jid"]))
45
+ delegate_to(
46
+ :on_update_roster_item_result => lambda do |pipe, item_jid|
47
+ command_completed if item_jid.eql?(contact["jid"])
48
+ end,
49
+ :on_update_roster_item_error => lambda do |pipe, item_jid|
50
+ error(:bad_request, params, 'roster updated failed') if item_jid.eql?(contact["jid"])
51
+ end
52
+ )
53
+ else
54
+ error(:bad_request, params, 'jid not specified')
55
+ end
56
+ end
57
+ end
58
+
59
+ #.........................................................................................................
60
+ command 'admin/delete_contact', :access => 'admin' do
61
+ AgentXmpp.logger.info "ACTION: admin/delete_contact"
62
+ contacts = AgentXmpp::Contact.find_all.map{|c| c[:jid]}
63
+ on(:execute) do |form|
64
+ form.add_title('Delete Contact')
65
+ form.add_list_single('jid', contacts)
66
+ end
67
+ on(:submit) do
68
+ contact = params[:data]
69
+ if contact["jid"]
70
+ xmpp_msg(AgentXmpp::Xmpp::IqRoster.remove(pipe, contact["jid"]))
71
+ delegate_to(
72
+ :on_remove_roster_item_result => lambda do |pipe, item_jid|
73
+ command_completed if item_jid.eql?(contact["jid"])
74
+ end,
75
+ :on_remove_roster_item_error => lambda do |pipe, item_jid|
76
+ error(:bad_request, params, 'roster updated failed') if item_jid.eql?(contact["jid"])
77
+ end
78
+ )
79
+ else
80
+ error(:bad_request, params, 'jid not specified')
81
+ end
82
+ end
83
+ end
84
+
85
+ #.........................................................................................................
86
+ command 'admin/subscriptions', :access => 'admin' do
87
+ AgentXmpp.logger.info "ACTION: admin/subscriptions"
88
+ AgentXmpp::Subscription.stats_by_node
89
+ end
90
+
91
+ #.........................................................................................................
92
+ command 'admin/publications', :access => 'admin' do
93
+ AgentXmpp.logger.info "ACTION: admin/publications"
94
+ AgentXmpp::Publication.stats_by_node
95
+ end
96
+
97
+ #.........................................................................................................
98
+ command 'admin/messages_by_type', :access => 'admin' do
99
+ AgentXmpp.logger.info "ACTION: admin/publications"
100
+ AgentXmpp::Message.stats_by_message_type
101
+ end
102
+
103
+ #.........................................................................................................
104
+ command 'admin/messages_by_contact', :access => 'admin' do
105
+ AgentXmpp.logger.info "ACTION: admin/publications"
106
+ AgentXmpp::Contact.message_stats
107
+ end
108
+
109
+ #.........................................................................................................
110
+ command 'admin/messages_by_command', :access => 'admin' do
111
+ AgentXmpp.logger.info "ACTION: admin/publications"
112
+ AgentXmpp::Message.stats_by_command_node
113
+ end
@@ -0,0 +1,7 @@
1
+ require 'agent_xmpp/client/boot'
2
+ require 'agent_xmpp/client/controller'
3
+ require 'agent_xmpp/client/response'
4
+ require 'agent_xmpp/client/message_pipe'
5
+ require 'agent_xmpp/client/message_delegate'
6
+ require 'agent_xmpp/client/connection'
7
+ require 'agent_xmpp/client/client'
@@ -0,0 +1,83 @@
1
+ ##############################################################################################################
2
+ module AgentXmpp
3
+
4
+ #####-------------------------------------------------------------------------------------------------------
5
+ class Boot
6
+
7
+ ####......................................................................................................
8
+ class << self
9
+
10
+ ####....................................................................................................
11
+ # start application
12
+ #.......................................................................................................
13
+ def boot
14
+
15
+ AgentXmpp.config_file = File.join(AgentXmpp.app_path, "agent_xmpp.yml")
16
+
17
+ AgentXmpp.log_file = add_path(AgentXmpp.log_file) if AgentXmpp.log_file.kind_of?(String)
18
+ AgentXmpp.logger = Logger.new(AgentXmpp.log_file, 10, 1024000)
19
+ AgentXmpp.logger.level = Logger::WARN
20
+
21
+ call_if_implemented(:call_before_start)
22
+
23
+ AgentXmpp.logger.info "STARTING AgentXmpp"
24
+ AgentXmpp.logger.info "APPLICATION PATH: #{AgentXmpp.app_path}"
25
+ AgentXmpp.logger.info "LOG FILE: #{AgentXmpp.log_file.kind_of?(String) ? AgentXmpp.log_file : "STDOUT"}"
26
+ AgentXmpp.logger.info "CONFIGURATION FILE: #{AgentXmpp.config_file}"
27
+
28
+ raise AgentXmppError, "Configuration file #{AgentXmpp.config_file} required." unless File.exist?(AgentXmpp.config_file)
29
+
30
+ AgentXmpp.config = File.open(AgentXmpp.config_file) {|yf| YAML::load(yf)}
31
+
32
+ AgentXmpp.create_agent_xmpp_db
33
+ AgentXmpp.create_in_memory_db
34
+ AgentXmpp.upgrade_agent_xmpp_db
35
+ Contact.load_config
36
+ Publication.load_config
37
+
38
+ AgentXmpp::Client.new().connect
39
+
40
+ end
41
+
42
+ ####....................................................................................................
43
+ # application deligate methods
44
+ #.......................................................................................................
45
+ def call_if_implemented(method, *args)
46
+ send(method, *args) if respond_to?(method)
47
+ end
48
+
49
+ #.........................................................................................................
50
+ def callbacks(*args)
51
+ args.each do |meth|
52
+ instance_eval <<-do_eval
53
+ def call_#{meth}(*args)
54
+ @array_#{meth}.each{|m| m.call(*args)} unless @array_#{meth}.nil?
55
+ end
56
+ def #{meth}(&blk)
57
+ (@array_#{meth} ||= []) << blk
58
+ end
59
+ do_eval
60
+ end
61
+ end
62
+
63
+ ####......................................................................................................
64
+ # private
65
+ #.......................................................................................................
66
+ def add_path(dir)
67
+ File.join(AgentXmpp.app_path, dir)
68
+ end
69
+
70
+ private :add_path
71
+
72
+ #### self
73
+ end
74
+
75
+ #.........................................................................................................
76
+ callbacks(:before_start, :after_connected, :discovered_all_publish_nodes, :discovered_command_nodes,
77
+ :discovered_pubsub_node, :received_presence, :restarting_client)
78
+
79
+ #### Boot
80
+ end
81
+
82
+ #### AgentXmpp
83
+ end