1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
# -*- coding: utf-8 -*-
#
# userlist.rb
#
# users list
require 'typed-array'
miquire :core, 'user', 'message', 'retriever'
require 'set'
class UserList < Retriever::Model
@@system_id = 0
# args format
# key | value(class)
#-------------+--------------
# id | id of status(mixed)
# name | name of list(String)
# public | access mode(boolean:public if true)
# description | memo(String)
# user | user who post this message(User or Hash or mixed(User IDNumber))
# slug | list slug(String)
self.keys = [[:id, :int, true],
[:name, :string, true],
[:mode, :bool],
[:description, :string],
[:user, User, true],
[:slug, :string, true],
[:member, [User]]
]
def initialize(value)
type_strict value => Hash
super(value)
end
# リストを所有しているユーザを返す
# ==== Return
# リストの所有者(User)
def user
self[:user] end
def member
self[:member] ||= Set.new end
def member?(user)
if user.is_a? User
member.include?(user)
else
member.any?{ |m| m.id == user.to_i } end end
# リプライだった場合、投稿した人と宛先が一人でもリストメンバーだったら真。
# リプライではない場合は、 UserList.member?(message.user) と同じ
# ==== Args
# [message] 調べるMessage
# ==== Return
# リスト内のMessageなら真
def related?(message)
idnames = message.receive_user_screen_names
member?(message.user) && (idnames.empty? or member.any?{ |u| idnames.include?(u.idname) }) end
def add_member(user)
member_update_transaction do
if user.is_a? User
member << user
elsif user.is_a? Integer
Thread.new {
user = User.findbyid(user)
member << user }
elsif user.is_a? Enumerable
user.each(&method(:add_member))
else
raise ArgumentError.new('UserList member must be User') end end
self end
def remove_member(user)
member_update_transaction do
if user.is_a? User
member.delete(user)
elsif user.is_a? Integer
member.delete(User.findbyid(user))
elsif user.is_a? Enumerable
user.map(&remove_member)
else
raise ArgumentError.new('UserList member must be User') end end
self end
private
def member_update_transaction
before = member.dup
result = yield
if before != member
Plugin.call(:list_member_changed, self)
self.class.store_datum(self) end
result end
end
class UserLists < TypedArray(UserList)
end
|