Class: Vines::Storage::Local
Overview
A storage implementation that persists data to YAML files on the local file system.
Instance Method Summary
collapse
#authenticate, defer, fiber, from_name, register
Methods included from Log
#log
Constructor Details
#initialize(&block) ⇒ Local
Returns a new instance of Local.
11
12
13
14
15
16
17
18
19
20
21
22
|
# File 'lib/vines/storage/local.rb', line 11
def initialize(&block)
@dir = nil
instance_eval(&block)
unless @dir && File.directory?(@dir) && File.writable?(@dir)
raise 'Must provide a writable storage directory'
end
%w[user vcard fragment room message].each do |sub|
sub = File.expand_path(sub, @dir)
Dir.mkdir(sub, 0700) unless File.exists?(sub)
end
end
|
Instance Method Details
#delete_offline_messages(jid) ⇒ Object
57
58
59
60
61
|
# File 'lib/vines/storage/local.rb', line 57
def delete_offline_messages(jid)
if offline_messages_present?(jid)
File.delete(absolute_path("message/#{jid.bare.to_s}"))
end
end
|
#dir(dir = nil) ⇒ Object
24
25
26
|
# File 'lib/vines/storage/local.rb', line 24
def dir(dir=nil)
dir ? @dir = File.expand_path(dir) : @dir
end
|
#fetch_offline_messages(jid) ⇒ Object
63
64
65
66
67
|
# File 'lib/vines/storage/local.rb', line 63
def fetch_offline_messages(jid)
jid = JID.new(jid).bare.to_s
file = absolute_path("message/#{jid}") unless jid.empty?
offline_msgs = YAML.load_file(file) rescue {}
end
|
#find_fragment(jid, node) ⇒ Object
92
93
94
95
96
97
|
# File 'lib/vines/storage/local.rb', line 92
def find_fragment(jid, node)
jid = JID.new(jid).bare.to_s
return if jid.empty?
file = 'fragment/%s' % fragment_id(jid, node)
Nokogiri::XML(read(file)).root rescue nil
end
|
#find_user(jid) ⇒ Object
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# File 'lib/vines/storage/local.rb', line 28
def find_user(jid)
jid = JID.new(jid).bare.to_s
file = "user/#{jid}" unless jid.empty?
record = YAML.load(read(file)) rescue nil
return User.new(jid: jid).tap do |user|
user.name, user.password = record.values_at('name', 'password')
(record['roster'] || {}).each_pair do |jid, props|
user.roster << Contact.new(
jid: jid,
name: props['name'],
subscription: props['subscription'],
ask: props['ask'],
groups: props['groups'] || [])
end
end if record
end
|
#find_vcard(jid) ⇒ Object
79
80
81
82
83
84
|
# File 'lib/vines/storage/local.rb', line 79
def find_vcard(jid)
jid = JID.new(jid).bare.to_s
return if jid.empty?
file = "vcard/#{jid}"
Nokogiri::XML(read(file)).root rescue nil
end
|
#offline_messages_present?(jid) ⇒ Boolean
53
54
55
|
# File 'lib/vines/storage/local.rb', line 53
def offline_messages_present?(jid)
File.exist?(absolute_path("message/#{jid.bare.to_s}"))
end
|
#save_fragment(jid, node) ⇒ Object
99
100
101
102
103
104
|
# File 'lib/vines/storage/local.rb', line 99
def save_fragment(jid, node)
jid = JID.new(jid).bare.to_s
return if jid.empty?
file = 'fragment/%s' % fragment_id(jid, node)
save(file, node.to_xml)
end
|
#save_offline_message(msg) ⇒ Object
69
70
71
72
73
74
75
76
77
|
# File 'lib/vines/storage/local.rb', line 69
def save_offline_message(msg)
file = "message/#{msg[:to]}"
offline_msgs = YAML.load_file(absolute_path(file)) rescue []
msg.delete('to')
offline_msgs << msg
save(file) do |f|
YAML.dump(offline_msgs,f)
end
end
|
#save_user(user) ⇒ Object
45
46
47
48
49
50
51
|
# File 'lib/vines/storage/local.rb', line 45
def save_user(user)
record = {'name' => user.name, 'password' => user.password, 'roster' => {}}
user.roster.each do |contact|
record['roster'][contact.jid.bare.to_s] = contact.to_h
end
save("user/#{user.jid.bare}", YAML.dump(record))
end
|
#save_vcard(jid, card) ⇒ Object
86
87
88
89
90
|
# File 'lib/vines/storage/local.rb', line 86
def save_vcard(jid, card)
jid = JID.new(jid).bare.to_s
return if jid.empty?
save("vcard/#{jid}", card.to_xml)
end
|