diff --git a/data/instances.sql b/data/instances.sql index 5ca018e..9b7a0c0 100644 --- a/data/instances.sql +++ b/data/instances.sql @@ -26,6 +26,7 @@ CREATE TABLE IF NOT EXISTS instances ( longitude REAL, last_update_time INTEGER, is_private BOOLEAN NOT NULL DEFAULT 0, + contact_link TEXT, signature TEXT ); diff --git a/web/lib/potato_mesh/application/database.rb b/web/lib/potato_mesh/application/database.rb index fac2d14..7bee1e3 100644 --- a/web/lib/potato_mesh/application/database.rb +++ b/web/lib/potato_mesh/application/database.rb @@ -164,6 +164,11 @@ module PotatoMesh db.execute_batch(File.read(sql_file)) end + instance_columns = db.execute("PRAGMA table_info(instances)").map { |row| row[1] } + unless instance_columns.include?("contact_link") + db.execute("ALTER TABLE instances ADD COLUMN contact_link TEXT") + end + telemetry_tables = db.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='telemetry'").flatten if telemetry_tables.empty? diff --git a/web/lib/potato_mesh/application/federation.rb b/web/lib/potato_mesh/application/federation.rb index bb452bb..f0f474d 100644 --- a/web/lib/potato_mesh/application/federation.rb +++ b/web/lib/potato_mesh/application/federation.rb @@ -73,6 +73,7 @@ module PotatoMesh longitude: PotatoMesh::Config.map_center_lon, last_update_time: last_update, is_private: private_mode?, + contact_link: sanitized_contact_link, } end @@ -96,6 +97,7 @@ module PotatoMesh "longitude" => attributes[:longitude], "lastUpdateTime" => attributes[:last_update_time], "isPrivate" => attributes[:is_private], + "contactLink" => attributes[:contact_link], "signature" => signature, } payload.reject { |_, value| value.nil? } @@ -450,6 +452,7 @@ module PotatoMesh def canonical_instance_payload(attributes) data = {} + data["contactLink"] = attributes[:contact_link] if attributes[:contact_link] data["id"] = attributes[:id] if attributes[:id] data["domain"] = attributes[:domain] if attributes[:domain] data["pubkey"] = attributes[:pubkey] if attributes[:pubkey] @@ -611,6 +614,7 @@ module PotatoMesh longitude: coerce_float(payload["longitude"]), last_update_time: coerce_integer(payload["lastUpdateTime"]), is_private: private_flag, + contact_link: string_or_nil(payload["contactLink"]), } [attributes, signature, nil] @@ -1055,8 +1059,8 @@ module PotatoMesh sql = <<~SQL INSERT INTO instances ( id, domain, pubkey, name, version, channel, frequency, - latitude, longitude, last_update_time, is_private, signature - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + latitude, longitude, last_update_time, is_private, contact_link, signature + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET domain=excluded.domain, pubkey=excluded.pubkey, @@ -1068,6 +1072,7 @@ module PotatoMesh longitude=excluded.longitude, last_update_time=excluded.last_update_time, is_private=excluded.is_private, + contact_link=excluded.contact_link, signature=excluded.signature SQL @@ -1083,6 +1088,7 @@ module PotatoMesh attributes[:longitude], attributes[:last_update_time], attributes[:is_private] ? 1 : 0, + attributes[:contact_link], signature, ] diff --git a/web/lib/potato_mesh/application/instances.rb b/web/lib/potato_mesh/application/instances.rb index 369d41f..c4b4964 100644 --- a/web/lib/potato_mesh/application/instances.rb +++ b/web/lib/potato_mesh/application/instances.rb @@ -143,6 +143,7 @@ module PotatoMesh "longitude" => coerce_float(row["longitude"]), "lastUpdateTime" => last_update_time, "isPrivate" => private_flag, + "contactLink" => string_or_nil(row["contact_link"]), "signature" => signature, } @@ -173,7 +174,7 @@ module PotatoMesh min_last_update_time = now - PotatoMesh::Config.week_seconds sql = <<~SQL SELECT id, domain, pubkey, name, version, channel, frequency, - latitude, longitude, last_update_time, is_private, signature + latitude, longitude, last_update_time, is_private, contact_link, signature FROM instances WHERE domain IS NOT NULL AND TRIM(domain) != '' AND pubkey IS NOT NULL AND TRIM(pubkey) != ''