initial commit

This commit is contained in:
2026-10-25 23:19:29 -06:00
commit 5a3e877217
43 changed files with 2780 additions and 0 deletions
@@ -0,0 +1,54 @@
require_relative '../../versions'
Sequel.migration do
change do
create_table(:users) do
primary_key :id
String :email, null: false, unique: true
String :name
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
end
create_table(:identities) do
primary_key :id
foreign_key :user_id, :users, null: false, on_delete: :cascade
String :provider, null: false
String :uid, null: false
String :token, text: true
String :refresh_token, text: true
DateTime :expires_at
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
unique [:provider, :uid]
end
create_enum(:project_type, %w[sbq hunt bingo dtq])
create_table(:pokemon) do
primary_key :id
String :name, unique: true, null: false, index: true
FO::Versions::VERSIONS_BY_GENERATION
.values
.map { |g| g[:version_groups] }
.reduce(&:+)
.each { |version|
TrueClass ("version_#{version}").to_sym, default: false
File ("version_#{version}_sprite").to_sym
}
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
end
create_table(:projects) do
primary_key :id
foreign_key :user_id, :users, null: false, on_delete: :cascade
column :data, :jsonb, null: false
column :type, :project_type
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
end
end
end
@@ -0,0 +1,11 @@
Sequel.migration do
change do
create_table(:versions) do
primary_key :id
String :name, unique: true, null: false, index: true
String :generation, null: false, index: true
end
add_enum_value(:project_type, 'mono')
end
end
@@ -0,0 +1,15 @@
require_relative '../../versions'
Sequel.migration do
change do
alter_table(:pokemon) do
FO::Versions::VERSIONS_BY_GENERATION
.values
.map { |g| g[:version_groups] }
.reduce(&:+)
.each { |version|
add_column ("version_#{version}_dex").to_sym, :integer
}
end
end
end
@@ -0,0 +1,17 @@
require_relative '../../versions'
Sequel.migration do
change do
alter_table(:pokemon) do
FO::Versions::VERSIONS_BY_GENERATION
.values
.map { |g| g[:version_groups] }
.reduce(&:+)
.each { |version|
drop_column ("version_#{version}_dex").to_sym
}
add_column :dex, :integer, null: false, index: true
end
end
end
@@ -0,0 +1,21 @@
Sequel.migration do
change do
alter_table(:projects) do
drop_column :data
end
create_table(:hunts) do
primary_key :id
foreign_key :project_id, :projects, null: false, on_delete: :cascade
foreign_key :pokemon_id, :pokemon, null: false, on_delete: :cascade
Integer :encounters
DateTime :started_at
TrueClass :complete, default: false
DateTime :completed_at
TrueClass :verified, default: false
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
File :proof
end
end
end
@@ -0,0 +1,7 @@
Sequel.migration do
change do
alter_table(:pokemon) do
add_column :types, "text[2]", null: false, index: true
end
end
end
@@ -0,0 +1,28 @@
require_relative '../../versions'
Sequel.migration do
change do
alter_table(:pokemon) do
FO::Versions::VERSIONS_BY_GENERATION
.values
.map { |g| g[:version_groups] }
.reduce(&:+)
.each { |version|
drop_column ("version_#{version}").to_sym
drop_column ("version_#{version}_sprite").to_sym
}
end
create_table(:sprites) do
primary_key :id
foreign_key :pokemon_id, :pokemon, null: false, on_delete: :cascade
File :sprite, null: false
end
create_table(:sprites_versions) do
foreign_key :version_id, :versions, null: false, on_delete: :cascade
foreign_key :sprite_id, :versions, null: false, on_delete: :cascade
primary_key [:version_id, :sprite_id]
end
end
end
@@ -0,0 +1,8 @@
Sequel.migration do
change do
alter_table(:sprites_versions) do
drop_column :sprite_id
add_foreign_key(:sprite_id, :sprites)
end
end
end
@@ -0,0 +1,19 @@
Sequel.migration do
change do
create_table(:encounters) do
primary_key :id
Integer :percentage
TrueClass :static
String :location, null: false, index: true
foreign_key :pokemon_id, :pokemon, null: false, on_delete: :cascade
foreign_key :version_id, :versions, null: false, on_delete: :cascade
end
alter_table(:hunts) do
drop_column :pokemon_id
add_foreign_key :enounter_id, :encounters
end
end
end
@@ -0,0 +1,20 @@
require_relative '../../versions'
require_relative '../../model/version'
Sequel.seed do
def run
FO::Versions::VERSIONS_BY_GENERATION
.keys
.map { |gen| { gen: gen }.merge(FO::Versions::VERSIONS_BY_GENERATION[gen]) }
.flatten
.each { |generation|
gen_name = generation[:gen]
generation[:version_groups].each { |v|
FO::Model::Version.create(
name: v,
generation: gen_name
)
}
}
end
end
@@ -0,0 +1,121 @@
# frozen_string_literal: true
require 'httparty'
require 'json'
require_relative '../../db'
require_relative '../../model/pokemon'
require_relative '../../model/sprite'
require_relative '../../model/version'
require_relative '../../versions'
require_relative '../../client/pokeapi'
INITIAL_GENERATIONS = [
'generation-i',
'generation-ii',
'generation-iii',
'generation-iv',
'generation-v',
'generation-vi',
'generation-vii'
]
Sequel.seed do
def run
client = FO::Client::PokeAPI.new
all_species = client.species
all_species["results"].each_with_index do |s, i|
dex = i+1
unless FO::Model::Pokemon.where(dex: dex).empty?
puts "Dex num #{dex} already in database"
next
end
puts "Working on #{s["name"]} #{dex}"
species = client.species(dex)
varieties = species["varieties"]
.map { |v| v["pokemon"]["url"].match(/\/(\d+)\//)[1] }
.select { |v| !v.nil? }
puts "Found varieties: #{varieties}"
varieties.each do |sub|
pokemon = client.pokemon(sub)
name = pokemon["name"]
types = pokemon["types"].map { |t| t["type"]["name"] }
if types.size < 2
types << nil
end
FO::DB.connection.transaction do
pkmn = FO::Model::Pokemon.create(
name: name,
dex: dex,
types: pokemon["types"].map { |t| t["type"]["name"] }
)
pokemon["sprites"]["versions"].keys.each do |generation|
next unless INITIAL_GENERATIONS.include?(generation)
generation_data = pokemon["sprites"]["versions"][generation]
generation_data.keys.each do |version_group|
puts "Working on generation"
actual_version_group = version_group
if version_group == 'gold' ||
version_group == 'silver'
actual_version_group = 'gold-silver'
end
unless FO::Versions::VERSION_GROUPS_TO_VERSIONS.keys.include?(actual_version_group)
puts "Skipping #{actual_version_group} because its not a valid version group. Pkmn: #{name}"
next
end
versions = FO::Versions::VERSION_GROUPS_TO_VERSIONS[actual_version_group]
next if versions.nil?
puts "Looking at generation:"
puts "Gen: #{generation}"
puts "Data: #{generation_data}"
puts "VG: #{version_group}"
puts "AVG: #{actual_version_group}"
sprite_url = ""
if generation == "generation-i"
sprite_url = generation_data[version_group]["front_default"]
else
if !generation_data[version_group]["animated"].nil?
sprite_url = generation_data[version_group]["animated"]["front_shiny"]
else
sprite_url = generation_data[version_group]["front_shiny"]
end
end
next if sprite_url.nil?
puts "Found sprite (#{sprite_url}) for #{name} for versions: #{versions}"
sprite_blob = HTTParty.get(sprite_url).body
sprite = pkmn.add_sprite(sprite: sprite_blob)
versions.each do |v|
version = FO::Model::Version.find(name: v.to_s)
next if version.nil?
version.add_sprite(sprite)
end
sleep 0.5
end
end
sleep 0.1
end
sleep 0.5
end
end
end
end