You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.4 KiB

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Log;
use App\Player, App\Team, App\Tweet, App\TransitCenter, App\TransitLine, App\Document, App\Mission;
use App\Events\NewTweetEvent;
use Twitter;
class ImportController extends BaseController
{
public function __construct() {
$this->middleware('auth');
}
public function index(Request $request) {
return view('import', []);
}
public function preview(Request $request) {
$url = $request->input('url');
if(preg_match('/twitter\.com\/.+\/status(?:es)?\/(\d+)/', $url, $match)) {
$tweetID = $match[1];
} else {
return response()->json(['error'=>'Invalid URL']);
}
try {
$data = Twitter::getTweet($tweetID);
} catch(\Exception $e) {
return response()->json(['error'=>'Could not fetch tweet']);
}
$player = Player::where('twitter_user_id', $data->user->id_str)->first();
if(!$player) {
return response()->json(['error'=>'Couldn\'t find the player for this tweet. Check that they are added to a team.']);
}
$tweet = self::buildTweetFromTwitterObject($player, $data);
$event = new NewTweetEvent($tweet);
unset($event->socket);
return response()->json($event);
}
public function save(Request $request) {
$tweetID = $request->input('tweet_id');
try {
$data = Twitter::getTweet($tweetID);
} catch(\Exception $e) {
return response()->json(['error'=>'Could not fetch tweet']);
}
$player = Player::where('twitter_user_id', $data->user->id_str)->first();
if(!$player) {
return response()->json(['error'=>'Couldn\'t find the player for this tweet. Check that they are added to a team.']);
}
$tweet = self::buildTweetFromTwitterObject($player, $data);
$tweet->save();
if($tweet->mission_id && $tweet->team_id) {
event(new NewTweetEvent($tweet));
}
return response()->json(['result'=>'ok']);
}
private static function buildTweetFromTwitterObject($player, $data) {
if(isset($data->extended_tweet->full_text))
$text = $data->extended_tweet->full_text;
else
$text = $data->text;
// Unshorten URLs
if(isset($data->entities->urls)) {
foreach($data->entities->urls as $url) {
$text = str_replace($url->url, $url->expanded_url, $text);
}
}
// Remove media URLs from tweet text
$photos = [];
if(isset($data->extended_entities->media)) {
foreach($data->extended_entities->media as $media) {
$text = str_replace($media->url, '', $text);
$photos[] = $media->media_url_https;
}
$text = trim($text);
}
$mission_id = 0;
foreach(Mission::all() as $mission) {
if(strpos($text, $mission->hashtag) !== false) {
$mission_id = $mission->id;
}
}
$tweet = new Tweet;
$tweet->tweet_id = $data->id_str;
$tweet->player_id = $player ? $player->id : 0;
$tweet->team_id = $player ? $player->team->id : 0;
$tweet->text = $text;
$tweet->photo = json_encode($photos, JSON_UNESCAPED_SLASHES);
$tweet->mission_id = $mission_id;
$tweet->tweet_date = date('Y-m-d H:i:s', strtotime($data->created_at));
$tweet->geo = json_encode($data->geo);
$tweet->place = json_encode($data->place);
$tweet->author_username = $data->user->screen_name;
$tweet->author_photo = $data->user->profile_image_url_https;
$tweet->json = json_encode($data);
return $tweet;
}
}