96 lines
2.1 KiB
Ruby
96 lines
2.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class E621Status < ApplicationRecord
|
||
|
NOTES = {
|
||
|
0 => "Some internal issue happened while contacting e621.",
|
||
|
1 => "E621 is currently in maintenance mode.",
|
||
|
403 => "E621 is likely experiencing some kind of attack right now, so api endpoints may be returning challenges.",
|
||
|
}.freeze
|
||
|
|
||
|
STATES = {
|
||
|
0 => "error",
|
||
|
1 => "maintenance",
|
||
|
403 => "partially down",
|
||
|
}.freeze
|
||
|
|
||
|
STATUS_MESSAGES = {
|
||
|
0 => "Internal Error",
|
||
|
1 => "Maintenance",
|
||
|
2 => "No Status",
|
||
|
200 => "OK",
|
||
|
204 => "No Content",
|
||
|
400 => "Bad Request",
|
||
|
401 => "Unauthorized",
|
||
|
403 => "Forbidden",
|
||
|
404 => "Not Found",
|
||
|
405 => "Method Not Allowed",
|
||
|
406 => "Not Acceptable",
|
||
|
408 => "Request Timeout",
|
||
|
410 => "Gone",
|
||
|
429 => "Too Many Requests",
|
||
|
500 => "Internal Server Error",
|
||
|
502 => "Bad Gateway",
|
||
|
503 => "Service Unavailable",
|
||
|
504 => "Gateway Timeout",
|
||
|
520 => "Unknown Cloudflare Error",
|
||
|
521 => "Web Server Is Down",
|
||
|
522 => "Connection Timed Out",
|
||
|
523 => "Origin Is Unreachable",
|
||
|
524 => "A Timeout Occurred",
|
||
|
525 => "SSL Handshake Failed",
|
||
|
526 => "Invalid SSL Certificate",
|
||
|
527 => "Railgun Error",
|
||
|
530 => "Site Is Frozen",
|
||
|
}.freeze
|
||
|
|
||
|
after_create :send_notifications
|
||
|
|
||
|
def available
|
||
|
status >= 200 && status <= 299
|
||
|
end
|
||
|
|
||
|
def state
|
||
|
(STATES[status] || available ? "up" : "down").gsub(/ /, "-")
|
||
|
end
|
||
|
|
||
|
def status_message
|
||
|
STATUS_MESSAGES[status] || "Unknown (#{status})"
|
||
|
end
|
||
|
|
||
|
def note
|
||
|
NOTES[status]
|
||
|
end
|
||
|
|
||
|
module ApiMethods
|
||
|
def method_attributes
|
||
|
super + %i[available state status_message note]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
module SearchMethods
|
||
|
def current
|
||
|
order(id: :desc).first || new(status: 2, created_at: Time.now)
|
||
|
end
|
||
|
|
||
|
def history(limit = 100)
|
||
|
order(id: :desc).limit(limit)
|
||
|
end
|
||
|
|
||
|
def combined(limit = 100)
|
||
|
{
|
||
|
current: current,
|
||
|
history: history(limit)[1..],
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
include ApiMethods
|
||
|
extend SearchMethods
|
||
|
|
||
|
def send_notifications
|
||
|
E621Webhook.find_each do |webhook|
|
||
|
webhook.send_update(self)
|
||
|
end
|
||
|
end
|
||
|
end
|