diff --git a/.gitignore b/.gitignore index 2bc8b18c8f0346..d912cd6d97bc71 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,7 @@ yarn-debug.log # Ignore Docker option files docker-compose.override.yml + +# twingyeo.kr +*.woff +*.woff2 diff --git a/Gemfile.lock b/Gemfile.lock index 3bd2d591dfa4eb..677ac16ff6e367 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -207,7 +207,7 @@ GEM docile (1.4.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.6.4) + doorkeeper (5.6.5) railties (>= 5) dotenv (2.8.1) dotenv-rails (2.8.1) @@ -754,7 +754,7 @@ GEM xorcist (1.1.3) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.6) + zeitwerk (2.6.7) PLATFORMS ruby diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb index 6dd4fb18b024dc..520b3d4571850c 100644 --- a/app/chewy/statuses_index.rb +++ b/app/chewy/statuses_index.rb @@ -4,6 +4,12 @@ class StatusesIndex < Chewy::Index include FormattingHelper settings index: { refresh_interval: '30s' }, analysis: { + tokenizer: { + nori_mixed: { + type: 'nori_tokenizer', + decompound_mode: 'mixed', + }, + }, filter: { english_stop: { type: 'stop', @@ -20,7 +26,7 @@ class StatusesIndex < Chewy::Index }, analyzer: { content: { - tokenizer: 'uax_url_email', + tokenizer: 'nori_mixed', filter: %w( english_possessive_stemmer lowercase diff --git a/app/javascript/styles/bigemoji.scss b/app/javascript/styles/bigemoji.scss new file mode 100644 index 00000000000000..14b27cb6c7c326 --- /dev/null +++ b/app/javascript/styles/bigemoji.scss @@ -0,0 +1,3 @@ +@import 'bigemoji/variables'; +@import 'application'; +@import 'bigemoji/diff'; diff --git a/app/javascript/styles/bigemoji/diff.scss b/app/javascript/styles/bigemoji/diff.scss new file mode 100644 index 00000000000000..970d8b9650d795 --- /dev/null +++ b/app/javascript/styles/bigemoji/diff.scss @@ -0,0 +1,58 @@ +$emoji-enlarge-time: 40ms; + +// bigger emojis +.status__content, +.detailed-status .status__content, +.account__header__bio { + .emojione { + --emoji-size: 1.5em; + width: var(--emoji-size, 36px); + height: var(--emoji-size, 36px); + font-size: var(--emoji-size, 36px); + transition: transform $emoji-enlarge-time ease; + + &:hover { + transform: scale(2); + } + } +} + + +// enlarge only (names) +.display-name, +.notification__display-name, +.account__header__tabs__name { + .emojione { + transition: transform $emoji-enlarge-time linear; + vertical-align: center; + + &:hover { + transform: scale(2); + } + } + +} + + +// don't crop enlarged emojis as possible +.status__info { + .status__display-name, .display-name { + overflow-x: hidden; + overflow-y: visible; + } +} + + +// special case: collapsed article +.status__content { + overflow: visible; + &.status__content--collapsed { + overflow-y: hidden; // poor man's solution + } +} + + +// visual modifications +.status__info { + align-items: flex-start; // align time info to top (visual satisfaction) +} diff --git a/app/javascript/styles/bigemoji/variables.scss b/app/javascript/styles/bigemoji/variables.scss new file mode 100644 index 00000000000000..d11c69f812a8df --- /dev/null +++ b/app/javascript/styles/bigemoji/variables.scss @@ -0,0 +1 @@ +// intentionally empty diff --git a/app/javascript/styles/twvariant-wide-extra.scss b/app/javascript/styles/twvariant-wide-extra.scss new file mode 100644 index 00000000000000..4b0074d9a2024a --- /dev/null +++ b/app/javascript/styles/twvariant-wide-extra.scss @@ -0,0 +1,5 @@ +@import 'application'; + +.column { + width: 560px; +} diff --git a/app/javascript/styles/twvariant-wide.scss b/app/javascript/styles/twvariant-wide.scss new file mode 100644 index 00000000000000..a8c53ed82af372 --- /dev/null +++ b/app/javascript/styles/twvariant-wide.scss @@ -0,0 +1,5 @@ +@import 'application'; + +.column { + width: 480px; +} diff --git a/app/models/email_domain_block.rb b/app/models/email_domain_block.rb index 10a0e51020e628..16d14248246522 100644 --- a/app/models/email_domain_block.rb +++ b/app/models/email_domain_block.rb @@ -3,11 +3,13 @@ # # Table name: email_domain_blocks # -# id :bigint(8) not null, primary key -# domain :string default(""), not null -# created_at :datetime not null -# updated_at :datetime not null -# parent_id :bigint(8) +# id :bigint(8) not null, primary key +# domain :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# parent_id :bigint(8) +# ips :inet is an Array +# last_refresh_at :datetime # class EmailDomainBlock < ApplicationRecord diff --git a/app/services/activitypub/fetch_featured_collection_service.rb b/app/services/activitypub/fetch_featured_collection_service.rb index 1208820df224d6..9b0b6137f8bf78 100644 --- a/app/services/activitypub/fetch_featured_collection_service.rb +++ b/app/services/activitypub/fetch_featured_collection_service.rb @@ -100,4 +100,8 @@ def local_follower @local_follower = @account.followers.local.without_suspended.first end + + def local_follower + @local_follower ||= @account.followers.local.without_suspended.first + end end diff --git a/app/workers/scheduler/email_domain_block_refresh_scheduler.rb b/app/workers/scheduler/email_domain_block_refresh_scheduler.rb new file mode 100644 index 00000000000000..e0ad89866b6fb0 --- /dev/null +++ b/app/workers/scheduler/email_domain_block_refresh_scheduler.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +class Scheduler::EmailDomainBlockRefreshScheduler + include Sidekiq::Worker + include Redisable + + sidekiq_options retry: 0 + + def perform + Resolv::DNS.open do |dns| + dns.timeouts = 5 + + EmailDomainBlock.find_each do |email_domain_block| + ips = begin + if ip?(email_domain_block.domain) + [email_domain_block.domain] + else + resources = dns.getresources(email_domain_block.domain, Resolv::DNS::Resource::IN::A).to_a + dns.getresources(email_domain_block.domain, Resolv::DNS::Resource::IN::AAAA).to_a + resources.map { |resource| resource.address.to_s } + end + end + + email_domain_block.update(ips: ips, last_refresh_at: Time.now.utc) + end + end + end + + def ip?(str) + str =~ Regexp.union([Resolv::IPv4::Regex, Resolv::IPv6::Regex]) + end +end diff --git a/config/themes.yml b/config/themes.yml index 9c21c9459f3bcf..b46fdf68d1422c 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1,3 +1,8 @@ default: styles/application.scss contrast: styles/contrast.scss mastodon-light: styles/mastodon-light.scss + +twvariant-wide: styles/twvariant-wide.scss +twvariant-wide-extra: styles/twvariant-wide-extra.scss + +bigemoji: styles/bigemoji.scss diff --git a/db/schema.rb b/db/schema.rb index 704cef1228b63e..d6eb67f634c3fe 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -408,6 +408,8 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "parent_id" + t.inet "ips", array: true + t.datetime "last_refresh_at" t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true end @@ -1322,5 +1324,4 @@ ORDER BY (sum(t0.rank)) DESC; SQL add_index "follow_recommendations", ["account_id"], name: "index_follow_recommendations_on_account_id", unique: true - end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index 8101e61dd28c1f..bee24f24809470 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -21,7 +21,7 @@ def flags end def suffix - '' + '+twvariant' end def to_a @@ -33,7 +33,7 @@ def to_s end def repository - ENV.fetch('GITHUB_REPOSITORY', 'mastodon/mastodon') + ENV.fetch('GITHUB_REPOSITORY', 'twingyeo-kr/mastodon') end def source_base_url diff --git a/yarn.lock b/yarn.lock index cd14ee89a8852e..3d069fa98ac35b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2616,9 +2616,9 @@ babel-plugin-macros@^2.6.1: resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" babel-plugin-macros@^3.0.1: version "3.1.0" @@ -3551,16 +3551,16 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" cosmiconfig@^7.0.0, cosmiconfig@^7.1.0: version "7.1.0"