Simple bridge server for various bots of mine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
4.5 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. UIDS = {}
  2. module Heimdall
  3. VERSION = "0.99 beta"
  4. attr_reader :VERSION
  5. class ProtocolError < StandardError
  6. end
  7. class UID
  8. def initialize
  9. @UID_prefix = "abstract" if not @UID_prefix
  10. id = (1..32).map { |x| (rand()*10).floor }.join
  11. while UIDS.has_key? id do
  12. id = (1..32).map { |x| (rand()*10).floor }.join
  13. end
  14. UIDS[@UID_prefix+id] = self
  15. @UID = id
  16. end
  17. attr_reader :UID
  18. end
  19. class UserCache
  20. def initialize
  21. @users = {}
  22. end
  23. def sync(data)
  24. data.each { |userdata|
  25. if not @users[userdata["protocol_id"]] then
  26. new_user = User.new userdata
  27. @users[new_user.protoid] = new_user
  28. else
  29. @users[userdata["protocol_id"]].modify(userdata)
  30. end
  31. }
  32. end
  33. def add(user)
  34. @users[user.protoid] = user
  35. end
  36. def get(protoid)
  37. raise ProtocolError, "user not found" if not @users[protoid]
  38. return @users[protoid]
  39. end
  40. def search(name,n,&block)
  41. @users.select(&block).take(n)
  42. end
  43. def search_by_name(name, n = 10)
  44. search(name,n) { |k,v| v.username.match? name }
  45. end
  46. def search_by_protoid(name,n = 10)
  47. search(name,n) { |k,v| k.match? name }
  48. end
  49. def filter(&block)
  50. @users.filter &block
  51. end
  52. def delete(protoid)
  53. @users.delete protoid
  54. end
  55. def bulk_delete(protoid_list)
  56. protoid_list.each { |x| @users.delete x }
  57. end
  58. end
  59. class RoomCache < UserCache
  60. def get(protoid)
  61. raise ProtocolError, "room not found" if not @users[protoid]
  62. return @users[protoid]
  63. end
  64. def sync(data)
  65. data.each { |userdata|
  66. if not @users[userdata["protocol_id"]] then
  67. new_user = Room.new userdata
  68. @users[new_user.protoid] = new_user
  69. else
  70. @users[userdata["protocol_id"]].modify(userdata)
  71. end
  72. }
  73. end
  74. end
  75. class RoomFilter
  76. def initialize(cache, room_protoid)
  77. @cache = cache
  78. @filter = room_protoid
  79. end
  80. def get(protoid)
  81. raise ProtocolError, "user not found" if not _filter[protoid]
  82. return _filter[protoid]
  83. end
  84. private
  85. def _filter
  86. @cache.filter { |k,v|
  87. v.protoid == @filter
  88. }
  89. end
  90. end
  91. class User < UID
  92. def initialize(data)
  93. @username = data["username"]
  94. @protoid = data["protocol_id"]
  95. @UID_prefix = "user"
  96. @channel = DirectChannel.new
  97. super()
  98. end
  99. def to_card()
  100. return {
  101. "username" => @username,
  102. "protoid" => @protoid
  103. }
  104. end
  105. def modify(data)
  106. @username = data["username"]
  107. end
  108. attr_reader :username
  109. attr_reader :protoid
  110. attr_reader :channel
  111. end
  112. class Room < UID
  113. def initialize(data)
  114. @name = data["name"]
  115. @protoid = data["protocol_id"]
  116. @UID_prefix = "room"
  117. @channel = RoomChannel.new
  118. @users = {}
  119. super()
  120. end
  121. def to_card()
  122. return {
  123. "name" => @name,
  124. "protoid" => @protoid
  125. }
  126. end
  127. def modify(data)
  128. @name = data["name"]
  129. end
  130. attr_reader :users
  131. attr_reader :username
  132. attr_reader :protoid
  133. attr_reader :channel
  134. end
  135. class Channel < UID
  136. def initialize
  137. @UID_prefix = "channel"
  138. @messages = MsgStack.new
  139. @read = 0
  140. super()
  141. end
  142. def send(msg)
  143. @messages.push(msg)
  144. @read = @read+1
  145. end
  146. def send_silent(msg)
  147. @messages.push(msg)
  148. end
  149. def get(n = 1)
  150. raise Heimdall::ProtocolError, "Invalid number of messages" if n < 0
  151. return @messages.pull(n)
  152. end
  153. def read()
  154. messages = @messages.pull(@read)
  155. @read = 0
  156. return messages
  157. end
  158. end
  159. class DirectChannel < Channel
  160. def initialize
  161. @UID_prefix = "dchannel"
  162. super()
  163. end
  164. end
  165. class RoomChannel < Channel
  166. def initialize
  167. @UID_prefix = "schannel"
  168. super()
  169. end
  170. undef read
  171. def get(n = 1)
  172. @read = 0
  173. super(n)
  174. end
  175. end
  176. class Message < UID
  177. def initialize(data)
  178. @content = data["content"]
  179. @from = data["from"]
  180. @to = data["to"]
  181. @UID_prefix = "message"
  182. super()
  183. end
  184. def to_struct
  185. return {
  186. "content" => @content,
  187. "from" => @from,
  188. "to" => @to
  189. }
  190. end
  191. attr_reader :content
  192. attr_reader :from
  193. attr_reader :to
  194. end
  195. class MsgStack < UID
  196. def initialize
  197. @UID_prefix = "msgstack"
  198. @messages = []
  199. super()
  200. end
  201. def push(msg)
  202. @messages.append(msg)
  203. end
  204. def pull(n)
  205. @messages.last n
  206. end
  207. end
  208. end