123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <?php
- namespace App\Util\Sentiment;
- use App\AccountInterstitial;
- use App\Status;
- use Cache;
- use Illuminate\Support\Str;
- class Bouncer {
- public static function get(Status $status)
- {
- if($status->uri || $status->scope != 'public') {
- return;
- }
- $exemptionKey = 'pf:bouncer_v0:exemption_by_pid:' . $status->profile_id;
- $exemptionTtl = now()->addDays(12);
- $exemption = Cache::remember($exemptionKey, $exemptionTtl, function() use($status) {
- $uid = $status->profile->user_id;
- $ids = AccountInterstitial::whereUserId($uid)
- ->whereType('post.autospam')
- ->whereItemType('App\Status')
- ->whereNotNull('appeal_handled_at')
- ->latest()
- ->take(5)
- ->pluck('item_id');
- if($ids->count() == 0) {
- return false;
- }
- $count = Status::select('id', 'scope')
- ->whereScope('public')
- ->find($ids)
- ->count();
- return $count >= 1 ? true : false;
- });
- if($exemption == true) {
- return;
- }
- $recentKey = 'pf:bouncer_v0:recent_by_pid:' . $status->profile_id;
- $recentTtl = now()->addHours(28);
- $recent = Cache::remember($recentKey, $recentTtl, function() use($status) {
- return $status
- ->profile
- ->created_at
- ->gt(now()->subMonths(6)) ||
- $status
- ->profile
- ->statuses()
- ->whereScope('public')
- ->count() == 0;
- });
-
- if(!$recent) {
- return;
- }
-
- if($status->profile->followers()->count() > 100) {
- return;
- }
- if(!Str::contains($status->caption, [
- 'https://',
- 'http://',
- 'hxxps://',
- 'hxxp://',
- 'www.',
- '.com',
- '.net',
- '.org'
- ])) {
- return;
- }
- if($status->profile->user->is_admin == true) {
- return;
- }
- return (new self)->handle($status);
- }
- protected function handle($status)
- {
- $media = $status->media;
- $ai = new AccountInterstitial;
- $ai->user_id = $status->profile->user_id;
- $ai->type = 'post.autospam';
- $ai->view = 'account.moderation.post.autospam';
- $ai->item_type = 'App\Status';
- $ai->item_id = $status->id;
- $ai->has_media = (bool) $media->count();
- $ai->blurhash = $media->count() ? $media->first()->blurhash : null;
- $ai->meta = json_encode([
- 'caption' => $status->caption,
- 'created_at' => $status->created_at,
- 'type' => $status->type,
- 'url' => $status->url(),
- 'is_nsfw' => $status->is_nsfw,
- 'scope' => $status->scope,
- 'reblog' => $status->reblog_of_id,
- 'likes_count' => $status->likes_count,
- 'reblogs_count' => $status->reblogs_count,
- ]);
- $ai->save();
- $u = $status->profile->user;
- $u->has_interstitial = true;
- $u->save();
- $status->scope = 'unlisted';
- $status->visibility = 'unlisted';
- $status->is_nsfw = true;
- $status->save();
- Cache::forget('pf:bouncer_v0:exemption_by_pid:' . $status->profile_id);
- Cache::forget('pf:bouncer_v0:recent_by_pid:' . $status->profile_id);
- }
- }
|