diff --git a/etc/art/gamebusy.pdn b/etc/art/gamebusy.pdn
new file mode 100644
index 0000000..8909125
Binary files /dev/null and b/etc/art/gamebusy.pdn differ
diff --git a/web/app/Models/User.php b/web/app/Models/User.php
index c6a360a..91a7ad0 100644
--- a/web/app/Models/User.php
+++ b/web/app/Models/User.php
@@ -91,15 +91,12 @@ class User extends Authenticatable implements MustVerifyEmail
return $this->created_at->isoFormat('ll');
}
- // XlXi: Returns a class name like text-success or
- // gt-status-studio to show next to the
- // user's name.
- public function getOnlineClass()
+ // XlXi: TODO: Replace this with detailed presence
+ // like what game the user is in or
+ // what place they're editing.
+ public function isOnline()
{
- if($this->last_seen >= Carbon::now()->subMinutes(2))
- return 'text-success';
-
- return 'text-muted';
+ return ($this->last_seen >= Carbon::now()->subMinutes(2));
}
public function _hasRolesetInternal($roleName)
diff --git a/web/database/migrations/2014_10_12_000000_create_users_table.php b/web/database/migrations/2014_10_12_000000_create_users_table.php
index b41941e..283bccc 100644
--- a/web/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/web/database/migrations/2014_10_12_000000_create_users_table.php
@@ -22,6 +22,8 @@ return new class extends Migration
$table->rememberToken();
$table->unsignedBigInteger('banId')->nullable();
+ $table->string('biography')->nullable();
+
$table->unsignedBigInteger('tokens')->default(0);
$table->dateTime('next_reward')->useCurrent();
diff --git a/web/public/images/busy/game.png b/web/public/images/busy/game.png
new file mode 100644
index 0000000..d03b7fe
Binary files /dev/null and b/web/public/images/busy/game.png differ
diff --git a/web/resources/js/components/Games.js b/web/resources/js/components/Games.js
new file mode 100644
index 0000000..4233ecf
--- /dev/null
+++ b/web/resources/js/components/Games.js
@@ -0,0 +1,120 @@
+/*
+ Graphictoria 5 (https://gtoria.net)
+ Copyright © XlXi 2022
+*/
+
+import { Component, createRef } from 'react';
+
+import classNames from 'classnames/bind';
+
+import axios from 'axios';
+
+import Twemoji from 'react-twemoji';
+
+import { buildGenericApiUrl } from '../util/HTTP.js';
+import ProgressiveImage from './ProgressiveImage';
+import Loader from './Loader';
+
+axios.defaults.withCredentials = true;
+
+function commaSeparate(num) {
+ let str = num.toString().split('.');
+ str[0] = str[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+ return str.join('.');
+}
+
+class GameItemCard extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ hovered: false
+ }
+ }
+
+ render() {
+ return (
+ this.setState({hovered: true})}
+ onMouseLeave={() => this.setState({hovered: false})}
+ >
+
+ Todo {commaSeparate(1337)} Playing
+ By Todo
+
+
[ Playing: Among Us ]
- @endif -TODO: user description
- @auth - - @endauth -Joined
-{{ $user->getJoinDate() }}
-Last Seen
-{{ $user->getLastSeen() }}
-Visits
-0
-todo
-todo
-
todo
-todo
-todo
-"This is my current status!"
+{{ $user->biography }}
+ @else + This user has no description. + @endif +Joined
+{{ $user->getJoinDate() }}
+Last Seen
+{{ $user->getLastSeen() }}
+Visits
+todo
+Forum Posts
+todo
todo
-Username
+XlXi
+