Class: MijDiscord::Core::Gateway
- Inherits:
-
Object
- Object
- MijDiscord::Core::Gateway
- Defined in:
- lib/mij-discord/core/gateway.rb
Constant Summary collapse
- GATEWAY_VERSION =
6
- LARGE_THRESHOLD =
100
Instance Attribute Summary collapse
-
#check_heartbeat_acks ⇒ Object
Returns the value of attribute check_heartbeat_acks.
Instance Method Summary collapse
- #heartbeat ⇒ Object
-
#initialize(bot, auth, shard_key = nil) ⇒ Gateway
constructor
A new instance of Gateway.
- #kill ⇒ Object
- #notify_ready ⇒ Object
- #open? ⇒ Boolean
- #reconnect(try_resume = true) ⇒ Object
- #run_async ⇒ Object
- #send_heartbeat(sequence) ⇒ Object
- #send_identify(token, properties, compress, large_threshold, shard_key) ⇒ Object
- #send_packet(opcode, packet) ⇒ Object
- #send_raw(data, type = :text) ⇒ Object
- #send_request_members(server_id, query, limit) ⇒ Object
- #send_resume(token, session_id, sequence) ⇒ Object
- #send_status_update(status, since, game, afk) ⇒ Object
- #send_voice_state_update(server_id, channel_id, self_mute, self_deaf) ⇒ Object
- #stop(no_sync = false) ⇒ Object
- #sync ⇒ Object
Constructor Details
#initialize(bot, auth, shard_key = nil) ⇒ Gateway
Returns a new instance of Gateway.
109 110 111 112 113 114 115 116 |
# File 'lib/mij-discord/core/gateway.rb', line 109 def initialize(bot, auth, shard_key = nil) @bot, @auth, @shard_key = bot, auth, shard_key @ws_success = false @getc_mutex = Mutex.new @check_heartbeat_acks = true end |
Instance Attribute Details
#check_heartbeat_acks ⇒ Object
Returns the value of attribute check_heartbeat_acks.
107 108 109 |
# File 'lib/mij-discord/core/gateway.rb', line 107 def check_heartbeat_acks @check_heartbeat_acks end |
Instance Method Details
#heartbeat ⇒ Object
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/mij-discord/core/gateway.rb', line 166 def heartbeat if check_heartbeat_acks unless @last_heartbeat_acked MijDiscord::LOGGER.warn('Gateway') { 'Heartbeat not acknowledged, attempting to reconnect' } @broken_pipe = true reconnect(true) return end @last_heartbeat_acked = false end send_heartbeat(@session&.sequence || 0) end |
#kill ⇒ Object
151 152 153 154 |
# File 'lib/mij-discord/core/gateway.rb', line 151 def kill @ws_thread&.kill nil end |
#notify_ready ⇒ Object
266 267 268 |
# File 'lib/mij-discord/core/gateway.rb', line 266 def notify_ready @ws_success = true end |
#open? ⇒ Boolean
156 157 158 |
# File 'lib/mij-discord/core/gateway.rb', line 156 def open? @handshake&.finished? && !@ws_closed end |
#reconnect(try_resume = true) ⇒ Object
182 183 184 185 186 187 188 189 190 |
# File 'lib/mij-discord/core/gateway.rb', line 182 def reconnect(try_resume = true) @session&.suspend if try_resume @instant_reconnect = true @should_reconnect = true ws_close(false) nil end |
#run_async ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/mij-discord/core/gateway.rb', line 118 def run_async @ws_thread = Thread.new do Thread.current[:mij_discord] = 'websocket' @reconnect_delay = 1.0 loop do ws_connect break unless @should_reconnect if @instant_reconnect @reconnect_delay = 1.0 @instant_reconnect = false else sleep(@reconnect_delay) @reconnect_delay = [@reconnect_delay * 1.5, 120].min end end MijDiscord::LOGGER.info('Gateway') { 'Websocket loop has been terminated' } end sleep(0.2) until @ws_success MijDiscord::LOGGER.info('Gateway') { 'Connection established and confirmed' } nil end |
#send_heartbeat(sequence) ⇒ Object
192 193 194 |
# File 'lib/mij-discord/core/gateway.rb', line 192 def send_heartbeat(sequence) send_packet(Opcodes::HEARTBEAT, sequence) end |
#send_identify(token, properties, compress, large_threshold, shard_key) ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/mij-discord/core/gateway.rb', line 196 def send_identify(token, properties, compress, large_threshold, shard_key) data = { token: token, properties: properties, compress: compress, large_threshold: large_threshold, } data[:shard] = shard_key if shard_key send_packet(Opcodes::IDENTIFY, data) end |
#send_packet(opcode, packet) ⇒ Object
251 252 253 254 255 256 257 258 259 |
# File 'lib/mij-discord/core/gateway.rb', line 251 def send_packet(opcode, packet) data = { op: opcode, d: packet, } ws_send(data.to_json, :text) nil end |
#send_raw(data, type = :text) ⇒ Object
261 262 263 264 |
# File 'lib/mij-discord/core/gateway.rb', line 261 def send_raw(data, type = :text) ws_send(data, type) nil end |
#send_request_members(server_id, query, limit) ⇒ Object
241 242 243 244 245 246 247 248 249 |
# File 'lib/mij-discord/core/gateway.rb', line 241 def send_request_members(server_id, query, limit) data = { guild_id: server_id, query: query, limit: limit, } send_packet(Opcodes::REQUEST_MEMBERS, data) end |
#send_resume(token, session_id, sequence) ⇒ Object
231 232 233 234 235 236 237 238 239 |
# File 'lib/mij-discord/core/gateway.rb', line 231 def send_resume(token, session_id, sequence) data = { token: token, session_id: session_id, seq: sequence, } send_packet(Opcodes::RESUME, data) end |
#send_status_update(status, since, game, afk) ⇒ Object
209 210 211 212 213 214 215 216 217 218 |
# File 'lib/mij-discord/core/gateway.rb', line 209 def send_status_update(status, since, game, afk) data = { status: status, since: since, game: game, afk: afk, } send_packet(Opcodes::PRESENCE, data) end |
#send_voice_state_update(server_id, channel_id, self_mute, self_deaf) ⇒ Object
220 221 222 223 224 225 226 227 228 229 |
# File 'lib/mij-discord/core/gateway.rb', line 220 def send_voice_state_update(server_id, channel_id, self_mute, self_deaf) data = { guild_id: server_id, channel_id: channel_id, self_mute: self_mute, self_deaf: self_deaf, } send_packet(Opcodes::VOICE_STATE, data) end |
#stop(no_sync = false) ⇒ Object
160 161 162 163 164 |
# File 'lib/mij-discord/core/gateway.rb', line 160 def stop(no_sync = false) @should_reconnect = false ws_close(no_sync) nil end |
#sync ⇒ Object
146 147 148 149 |
# File 'lib/mij-discord/core/gateway.rb', line 146 def sync @ws_thread&.join nil end |