]> git.openstreetmap.org Git - rails.git/blob - app/models/social_link.rb
Localisation updates from https://translatewiki.net.
[rails.git] / app / models / social_link.rb
1 # == Schema Information
2 #
3 # Table name: social_links
4 #
5 #  id         :bigint           not null, primary key
6 #  user_id    :bigint           not null
7 #  url        :string           not null
8 #  created_at :datetime         not null
9 #  updated_at :datetime         not null
10 #
11 # Indexes
12 #
13 #  index_social_links_on_user_id  (user_id)
14 #
15 # Foreign Keys
16 #
17 #  fk_rails_...  (user_id => users.id)
18 #
19
20 class SocialLink < ApplicationRecord
21   belongs_to :user
22
23   validates :url, :format => { :with => %r{\A(https?://.+|@([a-zA-Z0-9_]+)@([\w\-\.]+))\z}, :message => :http_parse_error }
24
25   URL_PATTERNS = {
26     :bluesky => %r{\Ahttps?://(?:www\.)?bsky\.app/profile/([a-zA-Z0-9\._-]+)},
27     :discord => %r{\Ahttps?://(?:www\.)?discord\.com/users/(\d+)},
28     :facebook => %r{\Ahttps?://(?:www\.)?facebook\.com/([a-zA-Z0-9.]+)},
29     :flickr => %r{\Ahttps?://(?:www\.)?flickr\.com/people/([a-zA-Z0-9@._-]+)},
30     :github => %r{\Ahttps?://(?:www\.)?github\.com/([a-zA-Z0-9_-]+)},
31     :gitlab => %r{\Ahttps?://(?:www\.)?gitlab\.com/([a-zA-Z0-9_-]+)},
32     :hdyc => %r{\Ahttps?://(?:www\.)?hdyc\.neis-one\.org/\?([a-zA-Z0-9_-]+)},
33     :hot => %r{\Ahttps?://tasks\.hotosm\.org/users/([a-zA-Z0-9_-]+)},
34     :instagram => %r{\Ahttps?://(?:www\.)?instagram\.com/([a-zA-Z0-9._]+)},
35     :linkedin => %r{\Ahttps?://(?:www\.)?linkedin\.com/in/([a-zA-Z0-9_-]+)},
36     :line => %r{\Ahttps?://(?:www\.)?line\.me/ti/p/([a-zA-Z0-9_-]+)},
37     :mapillary => %r{\Ahttps?://(?:www\.)?mapillary\.com/(?:app/user|profile)/([a-zA-Z0-9_-]+)},
38     :mastodon => %r{\Ahttps?://(?:(?:www\.)?(mastodon\.social|en\.osm\.town))/(@[a-zA-Z0-9_]+)},
39     :mastodon_general => /\A@([a-zA-Z0-9_]+)@([\w\-\.]+)/,
40     :medium => %r{\Ahttps?://(?:www\.)?medium\.com/@([a-zA-Z0-9_]+)},
41     :ogf => %r{\Ahttps?://wiki\.opengeofiction\.net/index\.php/User:([a-zA-Z0-9_-]+)},
42     :ohm => %r{\Ahttps?://(?:www\.)?openhistoricalmap\.org/user/(\S+)},
43     :osm_forum => %r{\Ahttps?://community\.openstreetmap\.org/u/(\S+)},
44     :osm_wiki => %r{\Ahttps?://wiki\.openstreetmap\.org/wiki/User:([a-zA-Z0-9_-]+)},
45     :quora => %r{\Ahttps?://(?:www\.)?quora\.com/profile/([a-zA-Z0-9_-]+)},
46     :reddit => %r{\Ahttps?://(?:www\.)?reddit\.com/user/([a-zA-Z0-9_-]+)},
47     :slack => %r{\Ahttps?://join\.slack\.com/shareDM/([a-zA-Z0-9_~-]+)},
48     :snapchat => %r{\Ahttps?://(?:www\.)?snapchat\.com/add/([a-zA-Z0-9_-]+)},
49     :stackoverflow => %r{\Ahttps?://(?:www\.)?stackoverflow\.com/users/\d+/([a-zA-Z0-9_-]+)},
50     :strava => %r{\Ahttps?://(?:www\.)?strava\.com/athletes/([a-zA-Z0-9_-]+)},
51     :substack => %r{\Ahttps?://(?:www\.)?substack\.com/@([a-zA-Z0-9_-]+)},
52     :telegram => %r{\Ahttps?://(?:www\.)?t\.me/([a-zA-Z0-9_]+)},
53     :threads => %r{\Ahttps?://(?:www\.)?threads\.net/@([a-zA-Z0-9_]+)},
54     :tiktok => %r{\Ahttps?://(?:www\.)?tiktok\.com/@([a-zA-Z0-9_]+)},
55     :twitch => %r{\Ahttps?://(?:www\.)?twitch\.tv/([a-zA-Z0-9_]+)},
56     :twitter_x => %r{\Ahttps?://(?:www\.)?(?:twitter|x)\.com/([a-zA-Z0-9_]+)},
57     :vimeo => %r{\Ahttps?://(?:www\.)?vimeo\.com/([a-zA-Z0-9_]+)},
58     :whatsapp => %r{\Ahttps?://wa\.me/(\d+)},
59     :wikidata => %r{\Ahttps?://(?:www\.)?wikidata\.org/wiki/User:([a-zA-Z0-9_-]+)},
60     :wikimedia => %r{\Ahttps?://commons\.wikimedia\.org/wiki/User:([a-zA-Z0-9_-]+)},
61     :wikipedia => %r{\Ahttps?://(?:[a-zA-Z]+\.)?wikipedia\.org/wiki/User:([a-zA-Z0-9_-]+)},
62     :wikivoyage => %r{\Ahttps?://(?:[a-zA-Z]+\.)?wikivoyage\.org/wiki/User:([a-zA-Z0-9_-]+)},
63     :youtube => %r{\Ahttps?://(?:www\.)?youtube\.com/@([a-zA-Z0-9_-]+)}
64   }.freeze
65
66   NO_USERNAME_PLATFORMS = %w[discord line slack].freeze
67
68   def parsed
69     URL_PATTERNS.each do |platform, pattern|
70       names = url.match(pattern)
71       next unless names
72
73       if platform == :mastodon_general
74         return {
75           :url => "https://#{names[2]}/@#{names[1]}",
76           :platform => "mastodon",
77           :name => "@#{names[1]}@#{names[2]}"
78         }
79       end
80
81       name = names[2].nil? ? names[1] : "#{names[2]}@#{names[1]}"
82       name = platform.to_s.capitalize if NO_USERNAME_PLATFORMS.include?(platform.to_s)
83
84       return {
85         :url => url,
86         :platform => platform.to_s,
87         :name => name
88       }
89     end
90     { :url => url, :platform => nil, :name => url.gsub(%r{https?://}, "") }
91   end
92 end