You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
7.6 KiB
PHP
196 lines
7.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Location;
|
|
use Ramsey\Uuid\Uuid;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use App\Models\Source;
|
|
|
|
class LocationController extends Controller
|
|
{
|
|
public function addLocation(Request $request)
|
|
{
|
|
$fields = $request->validate([
|
|
'name' => ['required'],
|
|
'url' => ['required'],
|
|
'description' => ['required'],
|
|
'tags' => ['required'],
|
|
]);
|
|
|
|
if ($fields) {
|
|
$examples = [];
|
|
$files = $request->files->get("loc_examples");
|
|
if ($request->hasfile('loc_examples')) {
|
|
foreach ($request->file('loc_examples') as $file) {
|
|
$path = $file->store('reference');
|
|
array_push($examples, ["path" => $path]);
|
|
}
|
|
}
|
|
$request->merge(['active' => true]);
|
|
$request->merge(['uuid' => Uuid::uuid4()]);
|
|
$request->merge(['images' => json_encode($examples)]);
|
|
$request->merge(['added_by' => Auth::user()->id]);
|
|
//NOTE: Laravel gets funky if sequencing isn't explicitly set
|
|
$new = Location::create($request->all());
|
|
if ($new) {
|
|
return back()->with('message', 'New Location Added. Take a break!');
|
|
} else {
|
|
return back()->withErrors([
|
|
'error' => 'Uh oh. There was an inssue',
|
|
]);
|
|
}
|
|
} else {
|
|
return back()->withErrors([
|
|
'error' => 'All fields are required',
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function updateLocations()
|
|
{
|
|
$duplicates = 0;
|
|
$fresh = 0;
|
|
|
|
$unified = [];
|
|
$sources = Source::where("active", true)->get();
|
|
foreach ($sources as $source) {
|
|
//parsing for mastodon
|
|
if ($source->type == 'mastodon') {
|
|
$result = [];
|
|
if ($source->token == null) {
|
|
$result = \Mastodon::domain('https://' . $source->url)
|
|
->get('/instance/domain_blocks');
|
|
} else {
|
|
$result = \Mastodon::domain('https://' . $source->url)
|
|
->token($source->token)
|
|
->get('/instance/domain_blocks');
|
|
}
|
|
|
|
foreach ($result as $item) {
|
|
$index = array_search($item['domain'], array_column($unified, 'url'));
|
|
if ($index) {
|
|
//if there is a match, update the count
|
|
if ($item['severity'] == "suspend" || $item['severity'] == "defederate") {
|
|
++$unified[$index]['block_count'];
|
|
} else {
|
|
++$unified[$index]['silence_count'];
|
|
}
|
|
} else {
|
|
$silence = 0;
|
|
$suspend = 0;
|
|
if ($item['severity'] == "suspend" || $item['severity'] == "defederate") {
|
|
++$silence;
|
|
} else {
|
|
++$suspend;
|
|
}
|
|
array_push($unified, [
|
|
'name' => $item['domain'],
|
|
'url' => $item['domain'],
|
|
'rating' => $item['severity'],
|
|
'comment' => $item['comment'],
|
|
'block_count' => $suspend,
|
|
'silence_count' => $silence,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
//parsing for custom csv
|
|
if ($source->type == 'custom' && $source->format == 'csv') {
|
|
$denylist = array_map('str_getcsv', file($source->url));
|
|
foreach ($denylist as $item) {
|
|
$index = array_search($item[0], array_column($unified, 'url'));
|
|
if ($index) {
|
|
//if there is a match, update the count
|
|
if ($item[1] == "suspend" || $item['severity'] == "defederate") {
|
|
++$unified[$index]['block_count'];
|
|
} else {
|
|
++$unified[$index]['silence_count'];
|
|
}
|
|
} else {
|
|
$silence = 0;
|
|
$suspend = 0;
|
|
if ($item[1] == "suspend" || $item[1] == "defederate") {
|
|
++$silence;
|
|
} else {
|
|
++$suspend;
|
|
}
|
|
array_push($unified, [
|
|
'name' => $item[0],
|
|
'url' => $item[0],
|
|
'rating' => $item[1],
|
|
'comment' => $item[2],
|
|
'block_count' => $suspend,
|
|
'silence_count' => $silence,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//get all locations and sort which are present in unified or not
|
|
/*
|
|
$sorted = [];
|
|
$listed = 0;
|
|
$notlisted = 0;
|
|
foreach (Location::all() as $location) {
|
|
if (array_search($location->url, array_column($unified, 'url'))) {
|
|
++$listed;
|
|
// locations present in unfied, so updated
|
|
array_push($sorted, [
|
|
'location' => $location,
|
|
'listed' => true
|
|
]);
|
|
} else {
|
|
++$notlisted;
|
|
//locations not present
|
|
array_push($sorted, [
|
|
'location' => $location,
|
|
'listed' => false
|
|
]);
|
|
}
|
|
};
|
|
*/
|
|
|
|
//once the unified list is created, update current entries or create fresh ones
|
|
|
|
foreach ($unified as $item) {
|
|
$location = Location::where("url", $item['url'])->first();
|
|
if ($location) {
|
|
++$duplicates;
|
|
//update block count for existing item
|
|
|
|
$location->block_count = $item['block_count'];
|
|
$location->silence_count = $item['silence_count'];
|
|
|
|
//replace null with empty array
|
|
if ($location->images == null) {
|
|
$location->images = [];
|
|
};
|
|
$location->save();
|
|
} else {
|
|
// make new entries for instances not present
|
|
++$fresh;
|
|
$images = [];
|
|
$rating = ($item['rating'] == 'defederate') ? 'suspend' : $item['rating'];
|
|
$new = Location::create([
|
|
'uuid' => Uuid::uuid4(),
|
|
'name' => $item['url'],
|
|
'url' => $item['url'],
|
|
'description' => ($item['comment'] != null) ? $item['comment'] : "no description",
|
|
'active' => true,
|
|
'rating' => $rating,
|
|
'added_by' => 1,
|
|
'tags' => 'poor moderation, hate speech',
|
|
'images' => json_encode($images),
|
|
'block_count' => $item['block_count'],
|
|
'silence_count' => $item['silence_count'],
|
|
]);
|
|
}
|
|
}
|
|
|
|
return back()->with('message', $duplicates . ' UPDATED - ' . $fresh . ' CREATED');
|
|
}
|
|
}
|