twitter bot added

This commit is contained in:
Benjamin Takats
2023-01-15 23:29:59 +01:00
parent ea05c93365
commit 05887c7daa
11 changed files with 432 additions and 15 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Models;
use App\Traits\TwitterTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

View File

@@ -0,0 +1,83 @@
<?php
namespace App\Observers;
use App\Models\CourseEvent;
use App\Traits\TwitterTrait;
class CourseEventObserver
{
use TwitterTrait;
/**
* Handle the CourseEvent "created" event.
*
* @param \App\Models\CourseEvent $courseEvent
*
* @return void
*/
public function created(CourseEvent $courseEvent)
{
if (config('feeds.services.twitterAccountId')) {
$this->setNewAccessToken(1);
$text = sprintf("Unser Dozent %s hat einen neuen Kurs-Termin eingestellt:\n\n%s\n\n%s\n\n%s\n\n#Bitcoin #Kurs #Education #Einundzwanzig",
$courseEvent->course->lecturer->name,
$courseEvent->course->name,
str($courseEvent->course->description)->limit(100),
url()->route('school.landingPage.lecturer',
['country' => 'de', 'lecturer' => $courseEvent->course->lecturer]),
);
$this->postTweet($text);
}
}
/**
* Handle the CourseEvent "updated" event.
*
* @param \App\Models\CourseEvent $courseEvent
*
* @return void
*/
public function updated(CourseEvent $courseEvent)
{
//
}
/**
* Handle the CourseEvent "deleted" event.
*
* @param \App\Models\CourseEvent $courseEvent
*
* @return void
*/
public function deleted(CourseEvent $courseEvent)
{
//
}
/**
* Handle the CourseEvent "restored" event.
*
* @param \App\Models\CourseEvent $courseEvent
*
* @return void
*/
public function restored(CourseEvent $courseEvent)
{
//
}
/**
* Handle the CourseEvent "force deleted" event.
*
* @param \App\Models\CourseEvent $courseEvent
*
* @return void
*/
public function forceDeleted(CourseEvent $courseEvent)
{
//
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace App\Observers;
use App\Models\Course;
use App\Traits\TwitterTrait;
class CourseObserver
{
use TwitterTrait;
/**
* Handle the Course "created" event.
*
* @param \App\Models\Course $course
*
* @return void
*/
public function created(Course $course)
{
if (config('feeds.services.twitterAccountId')) {
$this->setNewAccessToken(1);
$text = sprintf("Unser Dozent %s hat einen neuen Kurs eingestellt:\n\n%s\n\n%s\n\n%s\n\n#Bitcoin #Kurs #Education #Einundzwanzig",
$course->lecturer->name,
$course->name,
str($course->description)->limit(100),
url()->route('school.landingPage.lecturer',
['country' => 'de', 'lecturer' => $course->lecturer]),
);
$this->postTweet($text);
}
}
/**
* Handle the Course "updated" event.
*
* @param \App\Models\Course $course
*
* @return void
*/
public function updated(Course $course)
{
//
}
/**
* Handle the Course "deleted" event.
*
* @param \App\Models\Course $course
*
* @return void
*/
public function deleted(Course $course)
{
//
}
/**
* Handle the Course "restored" event.
*
* @param \App\Models\Course $course
*
* @return void
*/
public function restored(Course $course)
{
//
}
/**
* Handle the Course "force deleted" event.
*
* @param \App\Models\Course $course
*
* @return void
*/
public function forceDeleted(Course $course)
{
//
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace App\Observers;
use App\Models\Meetup;
use App\Traits\TwitterTrait;
class MeetupObserver
{
use TwitterTrait;
/**
* Handle the Meetup "created" event.
*
* @param \App\Models\Meetup $meetup
*
* @return void
*/
public function created(Meetup $meetup)
{
if (config('feeds.services.twitterAccountId')) {
$this->setNewAccessToken(1);
$text = sprintf("Eine neue Meetup Gruppe wurde hinzugefügt:\n\n%s\n\n%s\n\n#Bitcoin #Meetup #Einundzwanzig",
$meetup->name,
url()->route('meetup.landing', ['country' => 'de', 'meetup' => $meetup])
);
$this->postTweet($text);
}
}
/**
* Handle the Meetup "updated" event.
*
* @param \App\Models\Meetup $meetup
*
* @return void
*/
public function updated(Meetup $meetup)
{
//
}
/**
* Handle the Meetup "deleted" event.
*
* @param \App\Models\Meetup $meetup
*
* @return void
*/
public function deleted(Meetup $meetup)
{
//
}
/**
* Handle the Meetup "restored" event.
*
* @param \App\Models\Meetup $meetup
*
* @return void
*/
public function restored(Meetup $meetup)
{
//
}
/**
* Handle the Meetup "force deleted" event.
*
* @param \App\Models\Meetup $meetup
*
* @return void
*/
public function forceDeleted(Meetup $meetup)
{
//
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Observers;
use App\Models\OrangePill;
use App\Traits\TwitterTrait;
class OrangePillObserver
{
use TwitterTrait;
/**
* Handle the OrangePill "created" event.
*
* @param \App\Models\OrangePill $orangePill
*
* @return void
*/
public function created(OrangePill $orangePill)
{
if (config('feeds.services.twitterAccountId')) {
$this->setNewAccessToken(1);
$text = sprintf("In einem der weltweiten Bücherschränke wurde ein Bitcoin-Buch reingestellt:\n\n%s\n\n%s\n\n%s\n\n#Bitcoin #Education #Einundzwanzig",
$orangePill->bookCase->title,
$orangePill->bookCase->address,
url()->route('bookCases.comment.bookcase', ['country' => 'de', 'bookCase' => $orangePill->bookCase]),
);
$this->postTweet($text);
}
}
/**
* Handle the OrangePill "updated" event.
*
* @param \App\Models\OrangePill $orangePill
*
* @return void
*/
public function updated(OrangePill $orangePill)
{
//
}
/**
* Handle the OrangePill "deleted" event.
*
* @param \App\Models\OrangePill $orangePill
*
* @return void
*/
public function deleted(OrangePill $orangePill)
{
//
}
/**
* Handle the OrangePill "restored" event.
*
* @param \App\Models\OrangePill $orangePill
*
* @return void
*/
public function restored(OrangePill $orangePill)
{
//
}
/**
* Handle the OrangePill "force deleted" event.
*
* @param \App\Models\OrangePill $orangePill
*
* @return void
*/
public function forceDeleted(OrangePill $orangePill)
{
//
}
}

View File

@@ -3,7 +3,14 @@
namespace App\Providers;
use App\Listeners\AddLoginReputation;
use App\Observers\EpisodeObserver;
use App\Models\Course;
use App\Models\CourseEvent;
use App\Models\Meetup;
use App\Models\OrangePill;
use App\Observers\CourseEventObserver;
use App\Observers\CourseObserver;
use App\Observers\MeetupObserver;
use App\Observers\OrangePillObserver;
use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
@@ -16,7 +23,7 @@ class EventServiceProvider extends ServiceProvider
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
Login::class => [
Login::class => [
AddLoginReputation::class,
],
Registered::class => [
@@ -30,7 +37,10 @@ class EventServiceProvider extends ServiceProvider
*/
public function boot()
{
//
Meetup::observe(MeetupObserver::class);
OrangePill::observe(OrangePillObserver::class);
CourseEvent::observe(CourseEventObserver::class);
Course::observe(CourseObserver::class);
}
/**

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Traits;
use App\Models\TwitterAccount;
use Illuminate\Support\Facades\Http;
trait TwitterTrait
{
public function setNewAccessToken($accountId)
{
$twitterAccount = TwitterAccount::find($accountId);
$response = Http::acceptJson()
->post('https://api.twitter.com/2/oauth2/token', [
'grant_type' => 'refresh_token',
'refresh_token' => $twitterAccount->refresh_token,
'client_id' => 'a0I1Nnp4YmMzZzdtRzFod1ZWT2c6MTpjaQ',
]);
$json = $response->json();
\Log::info($json);
TwitterAccount::find($accountId)
->update([
'token' => $json['access_token'],
'refresh_token' => $json['refresh_token'],
]);
}
public function postTweet($text)
{
$twitterAccount = TwitterAccount::find(1);
$response = Http::acceptJson()
->withToken($twitterAccount->token)
->post('https://api.twitter.com/2/tweets', [
'text' => $text,
]);
\Log::info($response->json());
}
}

View File

@@ -1,8 +1,10 @@
<?php
return [
'podcastindex-org' => [
'key' => env('PODCASTINDEX_ORG_KEY'),
'secret' => env('PODCASTINDEX_ORG_SECRET'),
]
return [
'twitterAccountId' => env('TWITTER_ACCOUNT_ID', null),
'podcastindex-org' => [
'key' => env('PODCASTINDEX_ORG_KEY'),
'secret' => env('PODCASTINDEX_ORG_SECRET'),
]
];

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
* @return void
*/
public function up()
{
Schema::table('twitter_accounts', function (Blueprint $table) {
$table->text('token')
->nullable()
->change();
$table->text('refresh_token')
->nullable();
});
}
/**
* Reverse the migrations.
* @return void
*/
public function down()
{
Schema::table('twitter_accounts', function (Blueprint $table) {
//
});
}
};

View File

@@ -633,5 +633,6 @@
"You get a point when you log in.": "",
"has": "",
"logins": "",
"points": ""
"points": "",
"New meetup created: :title": "New meetup created: :title"
}

View File

@@ -14,6 +14,7 @@ Route::get('/auth/twitter', function () {
return Socialite::driver('twitter')
->scopes([
'tweet.write',
'offline.access',
])
->redirect();
})
@@ -25,11 +26,12 @@ Route::get('/auth/twitter/callback', function () {
$twitterAccount = \App\Models\TwitterAccount::updateOrCreate([
'twitter_id' => $twitterUser->id,
], [
'twitter_id' => $twitterUser->id,
'nickname' => $twitterUser->nickname,
'token' => $twitterUser->token,
'expires_in' => $twitterUser->expiresIn,
'data' => [],
'twitter_id' => $twitterUser->id,
'refresh_token' => $twitterUser->refreshToken,
'nickname' => $twitterUser->nickname,
'token' => $twitterUser->token,
'expires_in' => $twitterUser->expiresIn,
'data' => [],
]);
echo 'Twitter account updated. We can now tweet on: '.$twitterUser->name;