diff --git a/app/Models/Meetup.php b/app/Models/Meetup.php index 745648b5..0f8bf2fa 100644 --- a/app/Models/Meetup.php +++ b/app/Models/Meetup.php @@ -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; diff --git a/app/Observers/CourseEventObserver.php b/app/Observers/CourseEventObserver.php new file mode 100644 index 00000000..432d4a32 --- /dev/null +++ b/app/Observers/CourseEventObserver.php @@ -0,0 +1,83 @@ +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) + { + // + } +} diff --git a/app/Observers/CourseObserver.php b/app/Observers/CourseObserver.php new file mode 100644 index 00000000..0036640f --- /dev/null +++ b/app/Observers/CourseObserver.php @@ -0,0 +1,83 @@ +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) + { + // + } +} diff --git a/app/Observers/MeetupObserver.php b/app/Observers/MeetupObserver.php new file mode 100644 index 00000000..833af3ca --- /dev/null +++ b/app/Observers/MeetupObserver.php @@ -0,0 +1,80 @@ +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) + { + // + } +} diff --git a/app/Observers/OrangePillObserver.php b/app/Observers/OrangePillObserver.php new file mode 100644 index 00000000..75cf3eb4 --- /dev/null +++ b/app/Observers/OrangePillObserver.php @@ -0,0 +1,81 @@ +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) + { + // + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 66920a3e..c70ea5e6 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -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> */ 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); } /** diff --git a/app/Traits/TwitterTrait.php b/app/Traits/TwitterTrait.php new file mode 100644 index 00000000..65536365 --- /dev/null +++ b/app/Traits/TwitterTrait.php @@ -0,0 +1,41 @@ +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()); + } +} diff --git a/config/feeds/services.php b/config/feeds/services.php index 287878bd..f49933e2 100644 --- a/config/feeds/services.php +++ b/config/feeds/services.php @@ -1,8 +1,10 @@ [ - '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'), + ] ]; diff --git a/database/migrations/2023_01_15_203928_add_refresh_token_field_to_twitter_accounts_table.php b/database/migrations/2023_01_15_203928_add_refresh_token_field_to_twitter_accounts_table.php new file mode 100644 index 00000000..149e2144 --- /dev/null +++ b/database/migrations/2023_01_15_203928_add_refresh_token_field_to_twitter_accounts_table.php @@ -0,0 +1,33 @@ +text('token') + ->nullable() + ->change(); + $table->text('refresh_token') + ->nullable(); + }); + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::table('twitter_accounts', function (Blueprint $table) { + // + }); + } +}; diff --git a/resources/lang/en.json b/resources/lang/en.json index 2d82c7e8..1591b677 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -633,5 +633,6 @@ "You get a point when you log in.": "", "has": "", "logins": "", - "points": "" -} \ No newline at end of file + "points": "", + "New meetup created: :title": "New meetup created: :title" +} diff --git a/routes/web.php b/routes/web.php index e80809f1..8e31ea76 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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;