lijab 0.1.1
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.
- data/bin/lijab +9 -0
- data/ext/extconf.rb +20 -0
- data/ext/readline_extra.c +172 -0
- data/ext/test.rb +29 -0
- data/lib/bleh.rb +45 -0
- data/lib/configs/commands/cowsay.rb +33 -0
- data/lib/configs/hooks/ting.rb +23 -0
- data/lib/lijab.rb +7 -0
- data/lib/lijab/commands.rb +139 -0
- data/lib/lijab/commands/contacts.rb +101 -0
- data/lib/lijab/commands/options.rb +49 -0
- data/lib/lijab/commands/simple.rb +132 -0
- data/lib/lijab/commands/status.rb +63 -0
- data/lib/lijab/commands/subscription.rb +78 -0
- data/lib/lijab/config.rb +174 -0
- data/lib/lijab/contacts.rb +324 -0
- data/lib/lijab/history.rb +122 -0
- data/lib/lijab/hooks.rb +109 -0
- data/lib/lijab/input.rb +234 -0
- data/lib/lijab/main.rb +248 -0
- data/lib/lijab/out.rb +174 -0
- data/lib/lijab/term/ansi.rb +20 -0
- data/lib/lijab/version.rb +4 -0
- data/lib/lijab/xmpp4r/message.rb +45 -0
- data/lib/readline/extra.rb +7 -0
- metadata +122 -0
data/lib/lijab/out.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'lijab/input'
|
2
|
+
require 'lijab/term/ansi'
|
3
|
+
require 'monitor'
|
4
|
+
require 'readline'
|
5
|
+
require 'readline/extra'
|
6
|
+
|
7
|
+
include Term
|
8
|
+
|
9
|
+
module Lijab
|
10
|
+
|
11
|
+
module Out
|
12
|
+
|
13
|
+
@monitor = Monitor.new
|
14
|
+
@time = Time.now
|
15
|
+
|
16
|
+
module_function
|
17
|
+
|
18
|
+
def put(s="\n", redisplay_input=false)
|
19
|
+
print "#{ANSI.clearline}#{s}\n#{ANSI.clearline}"
|
20
|
+
STDOUT.flush
|
21
|
+
InputHandler::redisplay_input if redisplay_input
|
22
|
+
end
|
23
|
+
|
24
|
+
def notice_if_day_changed(redisplay_input=true)
|
25
|
+
t = Time.now
|
26
|
+
if @time.day != t.day
|
27
|
+
ft = @time.strftime('%Y-%M-%d')
|
28
|
+
@time = t
|
29
|
+
puts "#{ANSI.clearline}** day changed -- #{ft} -> #{Date.today}".green
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def format_time(time=nil, format=:datetime_format)
|
34
|
+
return "" unless time
|
35
|
+
time = Time.now if time == :now
|
36
|
+
|
37
|
+
"#{time.strftime(Config.opts[format])} "
|
38
|
+
end
|
39
|
+
|
40
|
+
def format_message_in(from, text, colors, time)
|
41
|
+
"#{ANSI.clearline}#{time}#{from} -> ".colored(*colors) + text
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_message_out(to, text, colors, time)
|
45
|
+
|
46
|
+
prefix = "#{time}#{to} <- "
|
47
|
+
indent = " " * prefix.length
|
48
|
+
|
49
|
+
lines = text.to_a
|
50
|
+
s = []
|
51
|
+
|
52
|
+
s << "#{ANSI.clearline}#{prefix.colored(*colors)}#{lines.shift.chomp}"
|
53
|
+
lines.each do |l|
|
54
|
+
s << "#{ANSI.clearline}#{indent}#{l.chomp}"
|
55
|
+
end
|
56
|
+
|
57
|
+
s.join("\n")
|
58
|
+
end
|
59
|
+
|
60
|
+
def message_in(from, text, colors=[])
|
61
|
+
@monitor.synchronize do
|
62
|
+
clear_infoline()
|
63
|
+
InputHandler::delete_typed
|
64
|
+
|
65
|
+
notice_if_day_changed()
|
66
|
+
|
67
|
+
print "\a" if Config.opts[:terminal_bell_on_message]
|
68
|
+
puts format_message_in(from, text, colors, format_time(:now))
|
69
|
+
|
70
|
+
InputHandler::redisplay_input
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def message_out(to, text, colors=[])
|
75
|
+
@monitor.synchronize do
|
76
|
+
InputHandler::delete_last_typed
|
77
|
+
|
78
|
+
notice_if_day_changed(false)
|
79
|
+
|
80
|
+
puts format_message_out(to, text, colors, format_time(:now))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def presence(from, presence, colors=[])
|
85
|
+
@monitor.synchronize do
|
86
|
+
clear_infoline()
|
87
|
+
InputHandler::delete_typed
|
88
|
+
|
89
|
+
notice_if_day_changed()
|
90
|
+
|
91
|
+
print "#{ANSI.clearline}"
|
92
|
+
print "** #{format_time(:now)}#{from} (#{presence.priority || 0}) is now ".colored(*colors)
|
93
|
+
puts presence.pretty(true)
|
94
|
+
|
95
|
+
InputHandler::redisplay_input
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def subscription(from, type, msg=nil, colors=[])
|
100
|
+
@monitor.synchronize do
|
101
|
+
clear_infoline()
|
102
|
+
InputHandler::delete_typed
|
103
|
+
|
104
|
+
notice_if_day_changed()
|
105
|
+
|
106
|
+
time = format_time(:now)
|
107
|
+
case type
|
108
|
+
when :subscribe
|
109
|
+
indent = ' ' * time.length
|
110
|
+
s = "** #{time}subscription request from #{from} received:\n"
|
111
|
+
s += %{"#{msg}"\n} if msg
|
112
|
+
s += "** See '/help requests' to see how to handle requests."
|
113
|
+
when :subscribed
|
114
|
+
s = "** #{time}#{from} has subscribed to you"
|
115
|
+
when :unsubscribed
|
116
|
+
s = "** #{time}#{from} has unsubscribed from you"
|
117
|
+
end
|
118
|
+
|
119
|
+
puts "#{ANSI.clearline}#{s}"
|
120
|
+
|
121
|
+
InputHandler::redisplay_input
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def history(*log_entries)
|
126
|
+
log_entries.each do |e|
|
127
|
+
contact = Main.contacts[Jabber::JID.new(e[:target])]
|
128
|
+
target_s = contact ? contact.simple_name : e[:target]
|
129
|
+
colors = contact ? [contact.color] : []
|
130
|
+
time = format_time(e[:time].localtime, :history_datetime_format)
|
131
|
+
|
132
|
+
if e[:direction] == :from
|
133
|
+
colors << :bold
|
134
|
+
m = method(:format_message_in)
|
135
|
+
else
|
136
|
+
m = method(:format_message_out)
|
137
|
+
end
|
138
|
+
|
139
|
+
puts m.call(target_s, e[:msg], colors, time)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def error(s, redisplay_input=true)
|
144
|
+
print "#{ANSI.clearline}error: #{s}\n#{ANSI.clearline}".red.bold
|
145
|
+
STDOUT.flush
|
146
|
+
InputHandler::redisplay_input if redisplay_input
|
147
|
+
end
|
148
|
+
|
149
|
+
def infoline(s)
|
150
|
+
@monitor.synchronize do
|
151
|
+
print "#{ANSI.savepos}#{ANSIMove.down(1)}#{ANSI.clearline}"
|
152
|
+
print s
|
153
|
+
print "#{ANSI.restorepos}"
|
154
|
+
STDOUT.flush
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def clear_infoline
|
159
|
+
@monitor.synchronize do
|
160
|
+
print "#{ANSI.savepos}\n#{ANSI.clearline}#{ANSI.restorepos}"
|
161
|
+
STDOUT.flush
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def make_infoline
|
166
|
+
@monitor.synchronize do
|
167
|
+
print "\n\r#{ANSI.cleartoeol}#{ANSIMove.up(1)}"
|
168
|
+
STDOUT.flush
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
module Term
|
3
|
+
module ANSIMove
|
4
|
+
module_function
|
5
|
+
def to(line, col) "\033[#{line};#{col}H" end
|
6
|
+
def up(lines) "\033[#{lines}A" end
|
7
|
+
def down(lines) "\033[#{lines}B" end
|
8
|
+
def fwd(cols) "\033[#{cols}C" end
|
9
|
+
def back(cols) "\033[#{cols}D" end
|
10
|
+
end
|
11
|
+
module ANSI
|
12
|
+
module_function
|
13
|
+
def savepos() "\033[s" end
|
14
|
+
def restorepos() "\033[u" end
|
15
|
+
def title(s) "\033]2;#{s}\007" end
|
16
|
+
def clear() "\033[2J" end
|
17
|
+
def cleartoeol() "\033[K" end
|
18
|
+
def clearline() "\r#{cleartoeol}" end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'xmpp4r'
|
2
|
+
|
3
|
+
unless Jabber::Message.method_defined?(:chat_state)
|
4
|
+
class Jabber::Message
|
5
|
+
CHAT_STATES = %w(active composing gone inactive paused).freeze
|
6
|
+
|
7
|
+
# Returns the current chat state, or nil if no chat state is set
|
8
|
+
def each_elements(*els, &block)
|
9
|
+
els.inject([ ]) do |res, e|
|
10
|
+
res + each_element(e, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def chat_state
|
15
|
+
each_elements(*CHAT_STATES) { |el| return el.name.to_sym }
|
16
|
+
return nil
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Sets the chat state :active, :composing, :gone, :inactive, :paused
|
21
|
+
def chat_state=(s)
|
22
|
+
s = s.to_s
|
23
|
+
raise InvalidChatState,
|
24
|
+
"Chat state must be one of #{CHAT_STATES.join(', ')}" unless CHAT_STATES.include?(s)
|
25
|
+
CHAT_STATES.each { |state| delete_elements(state) }
|
26
|
+
add_element(REXML::Element.new(s).add_namespace('http://jabber.org/protocol/chatstates'))
|
27
|
+
end
|
28
|
+
|
29
|
+
CHAT_STATES.each do |state|
|
30
|
+
define_method("#{state}?") do
|
31
|
+
chat_state == state.to_sym
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Jabber::Message
|
38
|
+
##
|
39
|
+
# Sets the message's chat state
|
40
|
+
def set_chat_state(s)
|
41
|
+
self.chat_state = s
|
42
|
+
self
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
metadata
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lijab
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Pablo Flouret
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-05 00:46:35 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: file-tail
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: term-ansicolor
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: xmpp4r
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
56
|
+
description:
|
57
|
+
email: quuxbaz@gmail.com
|
58
|
+
executables:
|
59
|
+
- lijab
|
60
|
+
extensions:
|
61
|
+
- ext/extconf.rb
|
62
|
+
extra_rdoc_files: []
|
63
|
+
|
64
|
+
files:
|
65
|
+
- ext/extconf.rb
|
66
|
+
- ext/test.rb
|
67
|
+
- ext/readline_extra.c
|
68
|
+
- lib/bleh.rb
|
69
|
+
- lib/configs/commands/cowsay.rb
|
70
|
+
- lib/configs/hooks/ting.rb
|
71
|
+
- lib/lijab/commands/contacts.rb
|
72
|
+
- lib/lijab/commands/options.rb
|
73
|
+
- lib/lijab/commands/simple.rb
|
74
|
+
- lib/lijab/commands/status.rb
|
75
|
+
- lib/lijab/commands/subscription.rb
|
76
|
+
- lib/lijab/commands.rb
|
77
|
+
- lib/lijab/config.rb
|
78
|
+
- lib/lijab/contacts.rb
|
79
|
+
- lib/lijab/history.rb
|
80
|
+
- lib/lijab/hooks.rb
|
81
|
+
- lib/lijab/input.rb
|
82
|
+
- lib/lijab/main.rb
|
83
|
+
- lib/lijab/out.rb
|
84
|
+
- lib/lijab/term/ansi.rb
|
85
|
+
- lib/lijab/version.rb
|
86
|
+
- lib/lijab/xmpp4r/message.rb
|
87
|
+
- lib/lijab.rb
|
88
|
+
- lib/readline/extra.rb
|
89
|
+
has_rdoc: true
|
90
|
+
homepage: http://github.com/palbo/lijab
|
91
|
+
licenses: []
|
92
|
+
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
segments:
|
103
|
+
- 1
|
104
|
+
- 8
|
105
|
+
- 0
|
106
|
+
version: 1.8.0
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
version: "0"
|
114
|
+
requirements: []
|
115
|
+
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 1.3.6
|
118
|
+
signing_key:
|
119
|
+
specification_version: 3
|
120
|
+
summary: Extensible line oriented jabber client
|
121
|
+
test_files: []
|
122
|
+
|