This commit is contained in:
Thomas G 2022-06-28 16:41:17 +10:00
commit d0a80ea62b
39 changed files with 1482 additions and 350 deletions

View File

@ -29,6 +29,13 @@ class LoginController extends Controller
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Login username to be used by the controller.
*
* @var string
*/
protected $username;
/**
* Create a new controller instance.
*
@ -37,5 +44,30 @@ class LoginController extends Controller
public function __construct()
{
$this->middleware('guest')->except('logout');
$this->username = $this->findUsername();
}
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function findUsername()
{
$login = request()->input('login');
$fieldType = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
request()->merge([$fieldType => $login]);
return $fieldType;
}
/**
* Get username property.
*
* @return string
*/
public function username()
{
return $this->username;
}
}

View File

@ -5,9 +5,11 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\Models\User;
use App\Models\InviteKey;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
class RegisterController extends Controller
{
@ -65,11 +67,51 @@ class RegisterController extends Controller
*/
protected function create(array $data)
{
$this->verifyKey($data['key']);
$invited_by = $this->getInviter($data['key']);
$this->updateKeyTable($data['key']);
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'dob' => $data['dob'],
'password' => Hash::make($data['password']),
'badges' => [3],
'invited_by' => $invited_by,
]);
}
protected function verifyKey($key)
{
$fetchKey = InviteKey::where('key', $key)->orderBy('id', 'desc')->first();
if (empty($fetchKey) || !$fetchKey->active) {
throw ValidationException::withMessages(['key' => 'Incorrect invite key']);
} else {
return true;
}
}
protected function getInviter($key)
{
$fetchKey = InviteKey::where('key', $key)->orderBy('id', 'desc')->first();
return $fetchKey->created_by;
}
protected function updateKeyTable($key) : void
{
if (!User::exists()) {
$newId = 0;
} else {
$newId = User::orderBy('id', 'desc')->first()->id;
}
$updateDetails = [
'user_invited' => ++$newId,
'active' => false,
];
InviteKey::where('key', $key)->orderBy('id', 'desc')->first()->update($updateDetails);
}
}

View File

@ -23,6 +23,9 @@ class HomeController extends Controller
*/
public function index()
{
if (auth()->user()) {
return redirect(route('home'));
}
return view('index');
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Webpatser\Uuid\Uuid;
use App\Models\InviteKey;
use App\Models\User;
class KeyController extends Controller
{
public function index()
{
$fetchKeys = InviteKey::where('created_by', Auth::id())->orderBy('id', 'desc')->get();
$activeKey = InviteKey::where('created_by', Auth::id())->orderBy('id', 'desc')->first();
if (!$fetchKeys->isEmpty()) {
if ($activeKey->created_at->addWeek()->gt(Carbon::now())) {
$canCreate = false;
} else {
$canCreate = true;
}
} else {
$canCreate = true;
}
$data = [
'canCreate' => $canCreate,
'fetchKeys' => $fetchKeys,
];
return view('invite.index')->with('data', $data);
}
public function create()
{
$fetchKeys = InviteKey::where('created_by', Auth::id())->orderBy('id', 'desc')->get();
$activeKey = InviteKey::where('created_by', Auth::id())->orderBy('id', 'desc')->first();
// Validation
if (!$fetchKeys->isEmpty() && $activeKey->created_at->addWeek()->gt(Carbon::now())) {
if (!User::isAdmin())
abort(404);
}
$key = new InviteKey;
$key->key = Uuid::generate()->string;
$key->created_by = Auth::id();
$key->user_invited = 0;
$key->save();
return redirect()->route('key_index');
}
}

View File

@ -2,9 +2,11 @@
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use App\Models\User;
class PageController extends Controller
{
/**
@ -25,9 +27,33 @@ class PageController extends Controller
public function profile($id)
{
$user = User::find($id);
$badges = DB::table('badges')->get();
if (!$user) {
abort(404);
}
return view('pages.profile')->with('user', $user);
$data = [
'user' => $user,
'badges' => $badges
];
return view('pages.profile')->with('data', $data);
}
public function users(Request $request)
{
if ($request->has('q')) {
$users = DB::table('users')->where('name', 'LIKE', '%'.$request->q.'%')->paginate(10);
} else {
$users = User::paginate(10);
}
return view('pages.users')->with('users', $users);
}
public function settings()
{
return view('misc.settings');
}
}

View File

@ -37,12 +37,14 @@ class Kernel extends HttpKernel
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\UserLastActivity::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Carbon\Carbon;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;
class UserLastActivity
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::check()) {
$expireTime = Carbon::now()->addMinute(2); // keep online for 2 min
Cache::put('is_online_' . Auth::user()->id, true, $expireTime);
User::where('id', Auth::user()->id)->update(['last_seen' => Carbon::now()]);
}
return $next($request);
}
}

23
app/Models/InviteKey.php Normal file
View File

@ -0,0 +1,23 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class InviteKey extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'key',
'created_by',
'user_invited',
'active',
];
}

View File

@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Support\Facades\Auth;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
@ -22,6 +23,8 @@ class User extends Authenticatable
'email',
'dob',
'password',
'badges',
'invited_by',
];
/**
@ -41,5 +44,15 @@ class User extends Authenticatable
*/
protected $casts = [
'email_verified_at' => 'datetime',
'badges' => 'array'
];
public static function isAdmin()
{
if (Auth::guest() || !Auth::user()->admin) {
return false;
} else {
return true;
}
}
}

View File

@ -11,7 +11,8 @@
"laravel/framework": "^8.75",
"laravel/sanctum": "^2.11",
"laravel/tinker": "^2.5",
"laravel/ui": "^3.4"
"laravel/ui": "^3.4",
"webpatser/laravel-uuid": "^4.0"
},
"require-dev": {
"facade/ignition": "^2.5",

140
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "cf14086919a839fe740e00554e4baff6",
"content-hash": "25ae453eae609a277c5bbd141f21342f",
"packages": [
{
"name": "asm89/stack-cors",
@ -959,16 +959,16 @@
},
{
"name": "laravel/framework",
"version": "v8.83.16",
"version": "v8.83.17",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "6be5abd144faf517879af7298e9d79f06f250f75"
"reference": "2cf142cd5100b02da248acad3988bdaba5635e16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/6be5abd144faf517879af7298e9d79f06f250f75",
"reference": "6be5abd144faf517879af7298e9d79f06f250f75",
"url": "https://api.github.com/repos/laravel/framework/zipball/2cf142cd5100b02da248acad3988bdaba5635e16",
"reference": "2cf142cd5100b02da248acad3988bdaba5635e16",
"shasum": ""
},
"require": {
@ -1128,7 +1128,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2022-06-07T15:09:06+00:00"
"time": "2022-06-21T14:38:31+00:00"
},
{
"name": "laravel/sanctum",
@ -2995,16 +2995,16 @@
},
{
"name": "symfony/console",
"version": "v5.4.9",
"version": "v5.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb"
"reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb",
"reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb",
"url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000",
"reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000",
"shasum": ""
},
"require": {
@ -3074,7 +3074,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.4.9"
"source": "https://github.com/symfony/console/tree/v5.4.10"
},
"funding": [
{
@ -3090,7 +3090,7 @@
"type": "tidelift"
}
],
"time": "2022-05-18T06:17:34+00:00"
"time": "2022-06-26T13:00:04+00:00"
},
{
"name": "symfony/css-selector",
@ -3525,16 +3525,16 @@
},
{
"name": "symfony/http-foundation",
"version": "v5.4.9",
"version": "v5.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "6b0d0e4aca38d57605dcd11e2416994b38774522"
"reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522",
"reference": "6b0d0e4aca38d57605dcd11e2416994b38774522",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e",
"reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e",
"shasum": ""
},
"require": {
@ -3578,7 +3578,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.9"
"source": "https://github.com/symfony/http-foundation/tree/v5.4.10"
},
"funding": [
{
@ -3594,20 +3594,20 @@
"type": "tidelift"
}
],
"time": "2022-05-17T15:07:29+00:00"
"time": "2022-06-19T13:13:40+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v5.4.9",
"version": "v5.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8"
"reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
"reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948",
"reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948",
"shasum": ""
},
"require": {
@ -3690,7 +3690,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.9"
"source": "https://github.com/symfony/http-kernel/tree/v5.4.10"
},
"funding": [
{
@ -3706,20 +3706,20 @@
"type": "tidelift"
}
],
"time": "2022-05-27T07:09:08+00:00"
"time": "2022-06-26T16:57:59+00:00"
},
{
"name": "symfony/mime",
"version": "v5.4.9",
"version": "v5.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e"
"reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/2b3802a24e48d0cfccf885173d2aac91e73df92e",
"reference": "2b3802a24e48d0cfccf885173d2aac91e73df92e",
"url": "https://api.github.com/repos/symfony/mime/zipball/02265e1e5111c3cd7480387af25e82378b7ab9cc",
"reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc",
"shasum": ""
},
"require": {
@ -3773,7 +3773,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v5.4.9"
"source": "https://github.com/symfony/mime/tree/v5.4.10"
},
"funding": [
{
@ -3789,7 +3789,7 @@
"type": "tidelift"
}
],
"time": "2022-05-21T10:24:18+00:00"
"time": "2022-06-09T12:22:40+00:00"
},
{
"name": "symfony/polyfill-ctype",
@ -4845,16 +4845,16 @@
},
{
"name": "symfony/string",
"version": "v5.4.9",
"version": "v5.4.10",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99"
"reference": "4432bc7df82a554b3e413a8570ce2fea90e94097"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
"reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99",
"url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097",
"reference": "4432bc7df82a554b3e413a8570ce2fea90e94097",
"shasum": ""
},
"require": {
@ -4911,7 +4911,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.4.9"
"source": "https://github.com/symfony/string/tree/v5.4.10"
},
"funding": [
{
@ -4927,7 +4927,7 @@
"type": "tidelift"
}
],
"time": "2022-04-19T10:40:37+00:00"
"time": "2022-06-26T15:57:47+00:00"
},
{
"name": "symfony/translation",
@ -5457,6 +5457,64 @@
"source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
"time": "2022-06-03T18:03:27+00:00"
},
{
"name": "webpatser/laravel-uuid",
"version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/webpatser/laravel-uuid.git",
"reference": "df92ebbc5ea71ee9e0d6e2861178be42ef7eb330"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webpatser/laravel-uuid/zipball/df92ebbc5ea71ee9e0d6e2861178be42ef7eb330",
"reference": "df92ebbc5ea71ee9e0d6e2861178be42ef7eb330",
"shasum": ""
},
"require": {
"php": "^7.0|^8.0"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
"phpunit/phpunit": "^9.3.3"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Webpatser\\Uuid\\UuidServiceProvider"
],
"aliases": {
"Uuid": "Webpatser\\Uuid\\Uuid"
}
}
},
"autoload": {
"psr-4": {
"Webpatser\\Uuid\\": "src/Webpatser/Uuid/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christoph Kempen",
"email": "christoph@downsized.nl"
}
],
"description": "Laravel package to generate and to validate a universally unique identifier (UUID) according to the RFC 4122 standard. Support for version 1, 3, 4 and 5 UUIDs are built-in.",
"homepage": "https://github.com/webpatser/laravel-uuid",
"keywords": [
"UUID RFC4122"
],
"support": {
"issues": "https://github.com/webpatser/laravel-uuid/issues",
"source": "https://github.com/webpatser/laravel-uuid"
},
"time": "2021-03-09T07:19:24+00:00"
}
],
"packages-dev": [
@ -5917,16 +5975,16 @@
},
{
"name": "laravel/sail",
"version": "v1.14.10",
"version": "v1.14.11",
"source": {
"type": "git",
"url": "https://github.com/laravel/sail.git",
"reference": "0ea5d683af4d189071efcdb9e83946c10dab82c3"
"reference": "6edf45a247b3688e0d07e149570a62fd9bc11c73"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/sail/zipball/0ea5d683af4d189071efcdb9e83946c10dab82c3",
"reference": "0ea5d683af4d189071efcdb9e83946c10dab82c3",
"url": "https://api.github.com/repos/laravel/sail/zipball/6edf45a247b3688e0d07e149570a62fd9bc11c73",
"reference": "6edf45a247b3688e0d07e149570a62fd9bc11c73",
"shasum": ""
},
"require": {
@ -5973,7 +6031,7 @@
"issues": "https://github.com/laravel/sail/issues",
"source": "https://github.com/laravel/sail"
},
"time": "2022-06-09T07:10:28+00:00"
"time": "2022-06-13T18:32:48+00:00"
},
{
"name": "mockery/mockery",

View File

@ -3,6 +3,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Carbon\Carbon;
class CreateUsersTable extends Migration
{
@ -25,6 +26,9 @@ class CreateUsersTable extends Migration
$table->string('blurb')->default('Hello!');
$table->rememberToken();
$table->timestamps();
$table->string('last_seen')->default(Carbon::now());
$table->json('badges');
$table->integer('invited_by');
});
}

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBadgesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('badges', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('description');
$table->string('img');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('badges');
}
}

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateInviteKeysTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('invite_keys', function (Blueprint $table) {
$table->id();
$table->string('key', 36)->unique();
$table->integer('created_by');
$table->integer('user_invited');
$table->boolean('active')->default(true);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('invite_keys');
}
}

View File

@ -0,0 +1,3 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDAWrd/TwGJULsVRo06rCpznNmW4zLJK6LwkfTvG3wURFFBj9E9zuaKAOzHVRrHsWKJhq2BxSUze7OClgzgzFLRQHhRQFKn/skLPrV85bFakoK/dnt9h/Jyn2cD2A8Za6q90O3h9FSy9mLvCN07g07IXtauYZfOXvqyqOn4rAeUJQIDAQABAoGBAISbxddZo0iERIW1XtXtLVMI9iUEutVfZPSO2xogi5j5RD97o5gF1H+dhZ8iN9UloDYJiAJn5G6qwCWtxnEPy6NO4lMDgFMQtlpIIW9mafZ7m+AueYJtgO5elLUnFbOA39OcvFUleL9ded42yuB2wfsGdKl85+mHvn8j4zTmT0+9AkEA3H7NBFhIVf3Vj6iLXwPmamhou8T8b+HSXop0krrP/jDw/wHbl0DEJbQv+ypYdoXJo8XS2Hs39z20pCEsUo2/NwJBAN9T5aWXmVnymbdNUCDMjjer2d6Ey9ARyFgB07xHSod+HWlSCES8pcWwZZrP/I4cf2CEiAInfgak0kNNWLOWnYMCQDJEoj7UVaFtHiwDM8r0m6o0pXPxY8+p/wjYrdzpxBNiWv74EHT6Kf2ih7HOJJ7Yv3Cb4AbEiKzQH4evnGgxsp8CQQDRPK+ad/DLn0p5vMvoDv7oFfCoVM8IAMEuA3g3nKutSnGP7bWlgQHnuB9Z7qf3FagZ69HqAspGu0HsoJkMmX61AkAO5wTd+rja0MP7rT5xNVYBALtdYLWowBov4NCN7BVDkd0JzeTjMtDerirvEDuzDBrbyFtKV5rZjZpuotFc+5/t
-----END RSA PRIVATE KEY-----

View File

@ -15,6 +15,33 @@
text-align: center;
background: linear-gradient(#f07575 10%, #e13b3b 49%, #d22 50%, #de2323 100%);
}
.warningtext {
color: red;
}
.popupcontainer {
top: 0%;
position: fixed;
background-color: rgba(0,0,0,0.5);
width: 100%;
height: 100%;
z-index: 100000000;
}
.popup {
color:#000000;
text-align: center;
position: fixed;
top: 50%;
left: 50%;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
transform: translate(-50%, -50%);
width: max-content;
border-radius: 3px;
border: 1px solid #3D414A;
background: linear-gradient(#cacbcc 10%, #99999a 49%, #747474 50%, #2d2d2d 100%);
}
.navbar {
height: 40px;
margin: 0px;
@ -89,7 +116,7 @@ background: linear-gradient(#f07575 10%, #e13b3b 49%, #d22 50%, #de2323 100%);
padding-right: 5px;
width: 50%;
}
.FeedContainerBox {
.FeedContainerBox, .ProfileContainerBox {
border-radius: 1px;
text-align: left;
width: 100%;
@ -97,6 +124,7 @@ background: linear-gradient(#f07575 10%, #e13b3b 49%, #d22 50%, #de2323 100%);
display: inline-flex;
border: 1px solid #000000;
border-width: 1px;
margin-bottom: 5px;
}
#btncontainer {
margin-left: 75%;
@ -294,4 +322,12 @@ a, #navbarusername {
background-color: rgba(255, 255, 255, 0.3);
padding-bottom: 5px;
padding-top: 5px;
}
.w-5 {
display: none;
}
.flex {
display: table;
margin-right: auto;
margin-left: auto;
}

397
public/css/app.js Normal file
View File

@ -0,0 +1,397 @@
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[2]!./resources/css/app.css":
/*!*****************************************************************************************************************************************************************************************!*\
!*** ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[2]!./resources/css/app.css ***!
\*****************************************************************************************************************************************************************************************/
/***/ (() => {
throw new Error("Module build failed (from ./node_modules/css-loader/dist/cjs.js):\nError: Can't resolve '../img/animated.png' in 'C:\\wamp64\\www\\morblox-site\\resources\\css'\n at finishWithoutResolve (C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:309:18)\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:386:15\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:435:5\n at eval (eval at create (C:\\wamp64\\www\\morblox-site\\node_modules\\tapable\\lib\\HookCodeFactory.js:33:10), <anonymous>:16:1)\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:435:5\n at eval (eval at create (C:\\wamp64\\www\\morblox-site\\node_modules\\tapable\\lib\\HookCodeFactory.js:33:10), <anonymous>:27:1)\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\DescriptionFilePlugin.js:87:43\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:435:5\n at eval (eval at create (C:\\wamp64\\www\\morblox-site\\node_modules\\tapable\\lib\\HookCodeFactory.js:33:10), <anonymous>:15:1)\n at C:\\wamp64\\www\\morblox-site\\node_modules\\enhanced-resolve\\lib\\Resolver.js:435:5");
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/*!****************************************************************************!*\
!*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
\****************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
var isOldIE = function isOldIE() {
var memo;
return function memorize() {
if (typeof memo === 'undefined') {
// Test for IE <= 9 as proposed by Browserhacks
// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
// Tests for existence of standard globals is to allow style-loader
// to operate correctly into non-standard environments
// @see https://github.com/webpack-contrib/style-loader/issues/177
memo = Boolean(window && document && document.all && !window.atob);
}
return memo;
};
}();
var getTarget = function getTarget() {
var memo = {};
return function memorize(target) {
if (typeof memo[target] === 'undefined') {
var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
try {
// This will throw an exception if access to iframe is blocked
// due to cross-origin restrictions
styleTarget = styleTarget.contentDocument.head;
} catch (e) {
// istanbul ignore next
styleTarget = null;
}
}
memo[target] = styleTarget;
}
return memo[target];
};
}();
var stylesInDom = [];
function getIndexByIdentifier(identifier) {
var result = -1;
for (var i = 0; i < stylesInDom.length; i++) {
if (stylesInDom[i].identifier === identifier) {
result = i;
break;
}
}
return result;
}
function modulesToDom(list, options) {
var idCountMap = {};
var identifiers = [];
for (var i = 0; i < list.length; i++) {
var item = list[i];
var id = options.base ? item[0] + options.base : item[0];
var count = idCountMap[id] || 0;
var identifier = "".concat(id, " ").concat(count);
idCountMap[id] = count + 1;
var index = getIndexByIdentifier(identifier);
var obj = {
css: item[1],
media: item[2],
sourceMap: item[3]
};
if (index !== -1) {
stylesInDom[index].references++;
stylesInDom[index].updater(obj);
} else {
stylesInDom.push({
identifier: identifier,
updater: addStyle(obj, options),
references: 1
});
}
identifiers.push(identifier);
}
return identifiers;
}
function insertStyleElement(options) {
var style = document.createElement('style');
var attributes = options.attributes || {};
if (typeof attributes.nonce === 'undefined') {
var nonce = true ? __webpack_require__.nc : 0;
if (nonce) {
attributes.nonce = nonce;
}
}
Object.keys(attributes).forEach(function (key) {
style.setAttribute(key, attributes[key]);
});
if (typeof options.insert === 'function') {
options.insert(style);
} else {
var target = getTarget(options.insert || 'head');
if (!target) {
throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
}
target.appendChild(style);
}
return style;
}
function removeStyleElement(style) {
// istanbul ignore if
if (style.parentNode === null) {
return false;
}
style.parentNode.removeChild(style);
}
/* istanbul ignore next */
var replaceText = function replaceText() {
var textStore = [];
return function replace(index, replacement) {
textStore[index] = replacement;
return textStore.filter(Boolean).join('\n');
};
}();
function applyToSingletonTag(style, index, remove, obj) {
var css = remove ? '' : obj.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : obj.css; // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = replaceText(index, css);
} else {
var cssNode = document.createTextNode(css);
var childNodes = style.childNodes;
if (childNodes[index]) {
style.removeChild(childNodes[index]);
}
if (childNodes.length) {
style.insertBefore(cssNode, childNodes[index]);
} else {
style.appendChild(cssNode);
}
}
}
function applyToTag(style, options, obj) {
var css = obj.css;
var media = obj.media;
var sourceMap = obj.sourceMap;
if (media) {
style.setAttribute('media', media);
} else {
style.removeAttribute('media');
}
if (sourceMap && typeof btoa !== 'undefined') {
css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
} // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
while (style.firstChild) {
style.removeChild(style.firstChild);
}
style.appendChild(document.createTextNode(css));
}
}
var singleton = null;
var singletonCounter = 0;
function addStyle(obj, options) {
var style;
var update;
var remove;
if (options.singleton) {
var styleIndex = singletonCounter++;
style = singleton || (singleton = insertStyleElement(options));
update = applyToSingletonTag.bind(null, style, styleIndex, false);
remove = applyToSingletonTag.bind(null, style, styleIndex, true);
} else {
style = insertStyleElement(options);
update = applyToTag.bind(null, style, options);
remove = function remove() {
removeStyleElement(style);
};
}
update(obj);
return function updateStyle(newObj) {
if (newObj) {
if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {
return;
}
update(obj = newObj);
} else {
remove();
}
};
}
module.exports = function (list, options) {
options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
// tags it will allow on a page
if (!options.singleton && typeof options.singleton !== 'boolean') {
options.singleton = isOldIE();
}
list = list || [];
var lastIdentifiers = modulesToDom(list, options);
return function update(newList) {
newList = newList || [];
if (Object.prototype.toString.call(newList) !== '[object Array]') {
return;
}
for (var i = 0; i < lastIdentifiers.length; i++) {
var identifier = lastIdentifiers[i];
var index = getIndexByIdentifier(identifier);
stylesInDom[index].references--;
}
var newLastIdentifiers = modulesToDom(newList, options);
for (var _i = 0; _i < lastIdentifiers.length; _i++) {
var _identifier = lastIdentifiers[_i];
var _index = getIndexByIdentifier(_identifier);
if (stylesInDom[_index].references === 0) {
stylesInDom[_index].updater();
stylesInDom.splice(_index, 1);
}
}
lastIdentifiers = newLastIdentifiers;
};
};
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/nonce */
/******/ (() => {
/******/ __webpack_require__.nc = undefined;
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
/*!*******************************!*\
!*** ./resources/css/app.css ***!
\*******************************/
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[1]!../../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[2]!./app.css */ "./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[2]!./resources/css/app.css");
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_1__);
var options = {};
options.insert = "head";
options.singleton = false;
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()((_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_1___default()), options);
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((_node_modules_css_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_1_node_modules_postcss_loader_dist_cjs_js_ruleSet_1_rules_5_oneOf_1_use_2_app_css__WEBPACK_IMPORTED_MODULE_1___default().locals) || {});
})();
/******/ })()
;

View File

@ -0,0 +1,81 @@
<?php
header("content-type:text/plain");
$port = addslashes($_GET["port"]);
ob_start();
?>
game:Load('rbxasset://temp.rbxl')
local assetPropertyNames = {"Texture", "TextureId", "SoundId", "MeshId", "SkyboxUp", "SkyboxLf", "SkyboxBk", "SkyboxRt", "SkyboxFt", "SkyboxDn", "PantsTemplate", "ShirtTemplate", "Graphic", "Frame", "ImageLabel", "GuiMain", "Image", "LinkedSource", "AnimationId"}
local variations = {"http://www%.roblox%.com/asset/%?id=", "http://www%.roblox%.com/asset%?id=", "http://%.roblox%.com/asset/%?id=", "http://%.roblox%.com/asset%?id="}
function GetDescendants(o)
local allObjects = {}
function FindChildren(Object)
for _,v in pairs(Object:GetChildren()) do
table.insert(allObjects,v)
FindChildren(v)
end
end
FindChildren(o)
return allObjects
end
local replacedProperties = 0--Amount of properties changed
for i, v in pairs(GetDescendants(game)) do
for _, property in pairs(assetPropertyNames) do
pcall(function()
if v[property] and not v:FindFirstChild(property) then --Check for property, make sure we're not getting a child instead of a property
assetText = string.lower(v[property])
for _, variation in pairs(variations) do
v[property], matches = string.gsub(assetText, variation, "http://www%.morblox%.us/asset/%?id=")
if matches > 0 then
replacedProperties = replacedProperties + 1
print("Replaced " .. property .. " asset link for " .. v.Name)
break
end
end
end
end)
end
end
print("DONE! Replaced " .. replacedProperties .. " properties")
game:GetService("NetworkServer"):Start(<?php echo $port; ?>)
game:GetService("RunService"):Run()
game.Lighting.GlobalShadows = true
game.Players.PlayerAdded:connect(function(plr)
Player.Changed:connect(function(Property)
if (Property=="Character") and (Player.Character~=nil) then
local Character=Player.Character
local Humanoid=Character:FindFirstChild("Humanoid")
if (Humanoid~=nil) then
Humanoid.Died:connect(function() delay(RespawnTime,function() Player:LoadCharacter() LoadCharacterNew(newWaitForChild(Player,"Appearance"),Player.Character,Player.Backpack) end) end)
end
end
end)
end)
game.Players.PlayerAdded:connect(onJoined)
game:GetService("NetworkServer"):Start(<?php echo $port; ?>)
game:GetService("RunService"):Run()
game.Lighting.GlobalShadows = true
game.Players.PlayerAdded:connect(function(plr)
Player.Changed:connect(function(Property)
if (Property=="Character") and (Player.Character~=nil) then
local Character=Player.Character
local Humanoid=Character:FindFirstChild("Humanoid")
if (Humanoid~=nil) then
Humanoid.Died:connect(function() delay(RespawnTime,function() Player:LoadCharacter() LoadCharacterNew(newWaitForChild(Player,"Appearance"),Player.Character,Player.Backpack) end) end)
end
end
end)
end)
game.Players.PlayerAdded:connect(onJoined)
<?php
$data = ob_get_clean();
$signature;
$key = file_get_contents("../GameRBLX/PrivKey.pem");
openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA1);
echo "" . sprintf("%%%s%%%s", base64_encode($signature), $data);
?>

BIN
public/img/MORBLOX.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
public/img/badges/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
public/img/badges/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
public/img/badges/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -1,78 +1,6 @@
window.addEventListener('resize', function() {
var logo_full = document.getElementById("logo_full")
var logo_small = document.getElementById("logo_small")
var smallbtn = document.getElementById("smallbtn1")
var smallbtn0 = document.getElementById("smallbtn0")
var smallbtn2 = document.getElementById("smallbtn2")
var smallbtn3 = document.getElementById("smallbtn3")
var smallbtn1 = document.getElementById("smallbtn4")
var smallbtn5 = document.getElementById("smallbtn5")
var viewport_width = window.innerWidth;
if (viewport_width < 900) {
logo_full.className = "invisible";
logo_small.className = "";
} else {
logo_small.className = "invisible";
logo_full.className = "";
}
if (viewport_width < 600) {
smallbtn.className = "invisible";
smallbtn2.className = "invisible";
smallbtn3.className = "invisible";
} else {
smallbtn.className = "navbarbutton";
smallbtn2.className = "navbarbutton";
smallbtn3.className = "navbarbutton";
}
if (viewport_width < 425) {
smallbtn0.className = "invisible";
smallbtn1.className = "invisible";
} else {
smallbtn0.className = "navbarbutton";
smallbtn1.className = "navbarbutton";
}
if (viewport_width < 280) {
smallbtn5.className = "invisible";
} else {
smallbtn5.className = "navbarbutton";
}
});
window.onload = function() {
var logo_full = document.getElementById("logo_full")
var logo_small = document.getElementById("logo_small")
var smallbtn = document.getElementById("smallbtn1")
var smallbtn0 = document.getElementById("smallbtn0")
var smallbtn2 = document.getElementById("smallbtn2")
var smallbtn3 = document.getElementById("smallbtn3")
var smallbtn1 = document.getElementById("smallbtn4")
var smallbtn5 = document.getElementById("smallbtn5")
var viewport_width = window.innerWidth;
if (viewport_width < 900) {
logo_full.className = "invisible";
logo_small.className = "";
} else {
logo_small.className = "invisible";
logo_full.className = "";
}
if (viewport_width < 600) {
smallbtn.className = "invisible";
smallbtn2.className = "invisible";
smallbtn3.className = "invisible";
} else {
smallbtn.className = "navbarbutton";
smallbtn2.className = "navbarbutton";
smallbtn3.className = "navbarbutton";
}
if (viewport_width < 425) {
smallbtn0.className = "invisible";
smallbtn1.className = "invisible";
} else {
smallbtn0.className = "navbarbutton";
smallbtn1.className = "navbarbutton";
}
if (viewport_width < 280) {
smallbtn5.className = "invisible";
} else {
smallbtn5.className = "navbarbutton";
}
};
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/
/******/
/******/ })()
;

View File

@ -1,4 +1,4 @@
{
"/js/app.js": "/js/app.js",
"/css/app.css": "/css/app.css"
"/js/main.js": "/js/main.js?id=9f73e36163448599799c0ba369b82b17",
"/css/app.js": "/css/app.js?id=bea72d76448120e19444500780652630"
}

View File

@ -1,152 +1,333 @@
@keyframes animatedbackground {
from {background-position-x: 0px; animation-timing-function: linear;}
to {background-position-x: 2000px; animation-timing-function: linear;}
from {background-position-x: 0px; animation-timing-function: linear;}
to {background-position-x: 2000px; animation-timing-function: linear;}
}
#alert {
height: fit-content;
margin: 0px;
position: fixed;
top: 72px;
padding-top: 2px;
padding-bottom: 2px;
padding-right: 5px;
padding-left: 5px;
width: 100%;
text-align: center;
background: linear-gradient(#f07575 10%, #e13b3b 49%, #d22 50%, #de2323 100%);
height: fit-content;
margin: 0px;
position: fixed;
top: 72px;
padding-top: 2px;
padding-bottom: 2px;
padding-right: 5px;
padding-left: 5px;
width: 100%;
text-align: center;
background: linear-gradient(#f07575 10%, #e13b3b 49%, #d22 50%, #de2323 100%);
}
.warningtext {
color: red;
}
.popupcontainer {
top: 0%;
position: fixed;
background-color: rgba(0,0,0,0.5);
width: 100%;
height: 100%;
z-index: 100000000;
}
.popup {
color:#000000;
text-align: center;
position: fixed;
top: 50%;
left: 50%;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
transform: translate(-50%, -50%);
width: max-content;
border-radius: 3px;
border: 1px solid #3D414A;
background: linear-gradient(#cacbcc 10%, #99999a 49%, #747474 50%, #2d2d2d 100%);
}
.navbar {
height: 40px;
margin: 0px;
padding-right: 5px;
padding-left: 5px;
padding-top: 2px;
position: fixed;
top: 0px;
padding-bottom: 2px;
color: white;
line-height: normal;
display: inline-flex;
vertical-align: middle;
width: 100%;
background: linear-gradient(#759CF0 10%, #3B72E1 49%, #2260DD 50%, #2362DE 100%);
height: 40px;
margin: 0px;
padding-right: 5px;
padding-left: 5px;
padding-top: 2px;
position: fixed;
top: 0px;
padding-bottom: 2px;
color: white;
line-height: normal;
display: inline-flex;
vertical-align: middle;
width: 100%;
background: linear-gradient(#759CF0 10%, #3B72E1 49%, #2260DD 50%, #2362DE 100%);
}
.navbarbuttoncontainer, .smallnavbarbuttoncontainer, .navbarlogincontainer {
padding-left: 5px;
display: table-cell;
vertical-align: middle;
padding-left: 5px;
display: table-cell;
vertical-align: middle;
}
#navbarlogincontainer, #navbarsignedincontainer {
position: relative;
padding-right: 10px;
margin-right: 3%;
margin-left: auto;
float: inline-end;
top: 11px;
position: relative;
padding-right: 10px;
margin-right: 3%;
margin-left: auto;
float: inline-end;
top: 11px;
}
#profilefriendscontainer p, #profilefriendscontainer a {
display: inline;
display: inline;
}
#profiletopcontainer {
margin-bottom: 30px;
display: block;
width: 100%;
margin-bottom: 30px;
display: block;
width: 100%;
}
#profilemiddlecontainer {
text-align: center;
margin-right: 50%;
.onlinestatus_website {
color: #2260DD;
}
.onlinestatus_ingame {
color: green;
}
.onlinestatus_offline {
color: black;
}
#yes, #no {
width: 50%;
}
#FeedBox {
width: 100%;
height: 22px;
}
#FeedButton {
width: 100%;
height: 22px;
}
#logo_signup, #logo-signup p {
margin: auto;
text-align: center;
width: 200px;
}
#feed, #profileleftcontainer {
text-align: center;
padding-left: 5px;
padding-right: 5px;
width: 50%;
}
#gamesframe, #profilerightcontainer {
text-align: center;
padding-left: 5px;
padding-right: 5px;
width: 50%;
}
.FeedContainerBox, .ProfileContainerBox {
border-radius: 1px;
text-align: left;
width: 100%;
vertical-align: top;
display: inline-flex;
border: 1px solid #000000;
border-width: 1px;
margin-bottom: 5px;
}
#btncontainer {
margin-left: 75%;
margin-left: 75%;
}
.navbarbutton {
position: relative;
top: 10px;
text-align: center;
font-size: 18px;
position: relative;
top: 10px;
text-align: center;
font-size: 18px;
}
.smallnavbarbutton {
position: relative;
text-align: center;
font-size: 15px;
position: relative;
text-align: center;
font-size: 15px;
}
.smallnav {
height: 25px;
margin: 0px;
padding-left: 5px;
padding-right: 5px;
position: fixed;
top: 43px;
padding-top: 2px;
padding-bottom: 2px;
display: inline-table;
vertical-align: middle;
width: 100%;
line-height: normal;
color: rgb(255, 255, 255);
text-size-adjust: auto;
text-align: left;
background-color: black;
height: 25px;
margin: 0px;
padding-left: 5px;
padding-right: 5px;
position: fixed;
top: 43px;
padding-top: 2px;
padding-bottom: 2px;
display: inline-table;
vertical-align: middle;
width: 100%;
line-height: normal;
color: rgb(255, 255, 255);
text-size-adjust: auto;
text-align: left;
background-color: black;
}
.invisible {
display: none !important;
.invisible, #invisible {
display: none !important;
}
html {
margin: 0px;
font-family: "Helvetica";
src: url('Helvetica.ttf') format('truetype'),;
font-style: normal;
background-color: #2e7eff;
color: white;
animation-name: animatedbackground;
animation-duration: 50s;
animation-iteration-count: infinite;
background-image: url(animated.png);
background-position: center 100%;
background-repeat: repeat-x;
background-attachment: fixed;
margin: 0px;
font-family: "Helvetica";
src: url('Helvetica.ttf') format('truetype'),;
font-style: normal;
background-color: rgb(49, 107, 223);
color: white;
animation-name: animatedbackground;
animation-duration: 50s;
animation-iteration-count: infinite;
background-image: url('../img/animated.png');
background-position: center 100%;
background-repeat: repeat-x;
background-attachment: fixed;
}
body {
margin-left: 0px;
margin-right: 0px;
margin-top: 0px;
margin-bottom: 35px;
padding-bottom: 0px;
margin-left: 0px;
margin-right: 0px;
margin-top: 0px;
margin-bottom: 35px;
padding-bottom: 0px;
}
.content_special, #content_special {
display: inline-flex;
width: 100%;
flex-wrap: nowrap;
flex-direction: row;
align-content: center;
justify-content: flex-start;
align-items: flex-start;
}
.content {
color: black;
max-width: 1000px;
margin: auto;
margin-top: 105px;
padding-left: 5px;
padding-right: 5px;
min-height: 300px;
background-color: rgba(255, 255, 255, 0.8);
padding-bottom: 5px;
padding-top: 5px;
color: black;
max-width: 1000px;
margin: auto;
margin-top: 105px;
padding-left: 5px;
padding-right: 5px;
min-height: 300px;
background-color: rgba(255, 255, 255, 0.8);
padding-bottom: 5px;
padding-top: 5px;
}
.content p a, .content a {
color: black
.content_signup {
color: black;
max-width: 500px;
margin: auto;
margin-top: 30px;
padding-left: 5px;
padding-right: 5px;
background-color: rgba(255, 255, 255, 0.8);
padding-bottom: 5px;
padding-top: 5px;
}
.content_signup input, .content_signup button {
width: 90%;
}
.content p a, .content a, .content_signup p a, .content_signup a, .content_special p a, .content_special a {
color: black
}
#footer {
text-align: center;
max-width: 1000px;
margin: auto;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 5px;
padding-top: 5px;
background-color: rgba(172, 172, 172, 0.8);
min-height: fit-content;
text-align: center;
max-width: 1000px;
margin: auto;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 5px;
padding-top: 5px;
background-color: rgba(172, 172, 172, 0.8);
min-height: fit-content;
}
#footer p, #footer a {
color: black;
button {
font-weight: 400;
text-align: center;
border-radius: 3px;
border: 1px solid #3D414A;
font-family: "Helvetica";
color: #fff;
}
p,h1 {
margin: 0px;
button.bluebutton {
background: linear-gradient(#759CF0 10%, #3B72E1 49%, #2260DD 50%, #2362DE 100%);
}
button:hover.bluebutton {
background: linear-gradient(#7ca1ef 10%, #4a7de4 49%, #396fdb 50%, #3168d6 100%);
cursor: pointer;
}
button:disabled.bluebutton {
background: linear-gradient(#759CF0 10%, #3B72E1 49%, #2260DD 50%, #2362DE 100%);
opacity: 0.5;
cursor: not-allowed;
}
button.greybutton {
background: linear-gradient(#cacbcc 10%, #99999a 49%, #747474 50%, #2d2d2d 100%);
}
button:hover.greybutton {
background: linear-gradient(#d1d8e6 10%, #b3b8c2 49%, #868a91 50%, #393b3e 100%);
cursor: pointer;
}
button:disabled.greybutton {
background: linear-gradient(#cacbcc 10%, #99999a 49%, #747474 50%, #2d2d2d 100%);
opacity: 0.5;
cursor: not-allowed;
}
button.redbutton {
background: linear-gradient(#e65a5a 10%, #e13535 49%, #d92c2c 50%, #df1818 100%);
}
button:hover.redbutton {
background: linear-gradient(#e56c6c 10%, #dd4e4e 49%, #d14343 50%, #da2e2e 100%);
cursor: pointer;
}
button:disabled.redbutton {
background: linear-gradient(#e65a5a 10%, #e13535 49%, #d92c2c 50%, #df1818 100%);
opacity: 0.5;
cursor: not-allowed;
}
button.greenbutton {
background: linear-gradient(#5acf77 10%, #3abc44 49%, #359c32 50%, #1a5c2e 100%);
}
button:hover.greenbutton {
background: linear-gradient(#75f094 10%, #39d746 49%, #21b71c 50%, #137a32 100%);
cursor: pointer;
}
button:disabled.greenbutton {
background: linear-gradient(#75f094 10%, #39d746 49%, #21b71c 50%, #137a32 100%);
opacity: 0.5;
cursor: not-allowed;
}
#footer_signup {
text-align: center;
max-width: 500px;
margin: auto;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 5px;
padding-top: 5px;
background-color: rgba(172, 172, 172, 0.8);
min-height: fit-content;
}
#footer p, #footer a, #footer_signup p, #footer_signup a {
color: black;
}
p,h1,h2,h3,h4,h5,h6 {
margin: 0px;
}
a, #navbarusername {
color: white;
text-decoration: none;
font-weight: bolder;
color: white;
text-decoration: none;
font-weight: bolder;
}
.nonbolded {
font-weight: normal !important;
}
.logoutframe {
color: black;
max-width: fit-content;
margin: auto;
padding-left: 5px;
padding-right: 5px;
background-color: rgba(255, 255, 255, 0.3);
padding-bottom: 5px;
padding-top: 5px;
}
.w-5 {
display: none;
}
.flex {
display: table;
margin-right: auto;
margin-left: auto;
}

View File

@ -3,18 +3,21 @@
<head>
<title>Login - {{ env('APP_NAME') }}</title>
<meta content="morblox.us - Log In" property="og:title" />
<meta charset="utf-8">
<meta content="Login - Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="apple-touch-icon" href="MORBLOX.png" />
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png" />
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/main.js') }}"></script>
</head>
<body>
@ -33,13 +36,12 @@
<form method="POST" action="{{ route('login') }}">
@csrf
<h3>Username/E-Mail Address</h3>
<input id="email" type="email" name="email" value="{{ old('email') }}" required
autocomplete="email" autofocus>
@error('email')
<input id="login" type="text" name="login" value="{{ old('login') }}" required autofocus>
@if ($errors->has('name') || $errors->has('email'))
<span style="color:red" role="alert">
<strong>{{ $message }}</strong>
<strong>{{ $errors->first('name') ?: $errors->first('email') }}</strong>
</span>
@enderror
@endif
<h3>Password</h3>
<input id="password" type="password" name="password" required autocomplete="current-password">
@error('password')
@ -65,8 +67,10 @@
</form>
</div>
<div id="footer_signup">
<p>MORBLOX is not affiliated with Roblox Corp, Lego, Sony, SEGA, Microsoft, Nintendo and Morbius. It's Morbin time!</p>
<p><a href="{{ route('privacy') }}">Privacy Policy</a> <a href="{{ route('tos') }}">Terms of Service</a></p>
<p>MORBLOX is not affiliated with Roblox Corp, Lego, Sony, SEGA, Microsoft, Nintendo and Morbius. It's Morbin
time!</p>
<p><a href="{{ route('privacy') }}">Privacy Policy</a> <a href="{{ route('tos') }}">Terms of Service</a>
</p>
</div id="footer">
</body>

View File

@ -3,18 +3,21 @@
<head>
<title>Register - {{ env('APP_NAME') }}</title>
<meta content="morblox.us - Sign Up" property="og:title" />
<meta charset="utf-8">
<meta content="Register - Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="apple-touch-icon" href="MORBLOX.png" />
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png" />
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/main.js') }}"></script>
</head>
<body>
@ -29,8 +32,8 @@
<h1>Welcome to MORBLOX!</h1>
<p>Have an account already? <a href="{{ route('login') }}">Click here</a> to log in.</p>
<ul></ul>
<p>Before entering anything, please read the <a href="privacy_signup.html">Privacy Policy</a> and the <a
href="tos_signup.html">Terms of Service</a>.</p>
<p>Before entering anything, please read the <a href="{{ route('privacy') }}">Privacy Policy</a> and the <a
href="{{ route('tos') }}">Terms of Service</a>.</p>
<ul></ul>
<form method="POST" action="{{ route('register') }}">
@csrf
@ -39,34 +42,34 @@
value="{{ old('name') }}" required autocomplete="name" autofocus>
<p>Usernames must be 3-20 characters, and must not break the rules.</p>
@error('name')
<span class="invalid-feedback" role="alert">
<div class="invalid-feedback" style="color:red">
<strong>{{ $message }}</strong>
</span>
</div>
@enderror
<ul></ul>
<h3>E-Mail Address</h3>
<input id="email" type="email" name="email" value="{{ old('email') }}" required
autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<div class="invalid-feedback" style="color:red">
<strong>{{ $message }}</strong>
</span>
</div>
@enderror
<h3>Confirm E-Mail Address</h3>
<input id="email-confirm" type="email" name="email_confirmation" value="{{ old('email_confirmation') }}"
required autocomplete="email">
@error('email_confirmation')
<span class="invalid-feedback" role="alert">
<div class="invalid-feedback" style="color:red">
<strong>{{ $message }}</strong>
</span>
</div>
@enderror
<ul></ul>
<h3>Date of Birth</h3>
<input id="dob" type="date" name="dob" value="{{ old('dob') }}" required>
@error('dob')
<span class="invalid-feedback" role="alert">
<div class="invalid-feedback" style="color:red">
<strong>{{ $message }}</strong>
</span>
</div>
@enderror
<ul></ul>
<h3>Password</h3>
@ -74,14 +77,19 @@
<p>Don't reuse passwords, and don't use a simple one!</p>
<p>Passwords must be 8 or more charactes, with 1 number and 1 symbol.</p>
@error('password')
<span class="invalid-feedback" role="alert">
<div class="invalid-feedback" style="color:red">
<strong>{{ $message }}</strong>
</span>
</div>
@enderror
<ul></ul>
<h3>Invite Key</h3>
<input id="key" type="text" name="key" placeholder="Invite Key" value="{{ old('key') }}"
required>
@error('key')
<div class="invalid-feedback" style="color:red">
<strong>Incorrect invite key.</strong>
</div>
@enderror
<p>An Invite Key is required to sign up. You can obtain one from a person that has played MORBLOX.</p>
<p>Don't beg for keys.</p>
<ul></ul>

View File

@ -3,18 +3,21 @@
<head>
<title>{{ env('APP_NAME') }} - It's MORBLOX time.</title>
<meta content="It's MORBLOX time." property="og:title" />
<meta charset="utf-8">
<meta content="Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="MORBLOX.png" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png" />
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/main.js') }}"></script>
</head>
<body>
@ -35,24 +38,9 @@
here!</a></p>
<p id="discord">Also, <a href="https://discord.gg/nudzQ7hkWY">Join our Discord!</a></p>
<ul></ul>
<h2>DEBUG SETTINGS BELOW!</h2>
<p>Feel free to toy around with these, before they're gone forever!</p>
<ul></ul>
<h3>Page Links</h3>
<a href="{{ route('home') }}">Home</a>
<a href="games.html">Games</a>
<a href="profile.html">Profile</a>
<a href="404.html">404</a>
<a href="logout.html">Logout</a>
<ul></ul>
<h3>Set LocalStorage Data</h3>
<ul></ul>
<form>
<input id="UsernameSet" type="text" name="username" placeholder="Enter a Username">
<button class="bluebutton" id="SaveButton">Save to LocalStorage...</button>
<p id="UsernameContainer">Saved Username:</p>
</form>
<ul></ul>
<h3>User Count</h3>
<p>There are <strong>{{ App\Models\User::count() }}</strong> users registered</p>
</div>
<div id="footer_signup">
<p>MORBLOX is not affiliated with Roblox Corp, Lego, Sony, SEGA, Microsoft, Nintendo and Morbius. It's Morbin

View File

@ -0,0 +1,43 @@
@extends('layouts.app')
@section('title')
<title>
Create Invite - {{ env('APP_NAME') }}</title>
@endsection
@section('content')
<h1 id="usernameframe">Create a Key</h1>
@if ($data['canCreate'] || App\Models\User::isAdmin())
<p>You may create @if ($data['fetchKeys']->isEmpty()) your first key below!
@else
@if (App\Models\User::isAdmin()) as many keys as you wish because you're an admin. @else a new key because it's been 1 week since creating your last key. @endif @endif
</p>
@else
<p>You cannot create a new key because 1 week hasn't passed since creating your last key. You can find your
key(s) below.</p>
@endif
<br>
@if ($data['canCreate'] || App\Models\User::isAdmin())
<form method="POST" action="{{ route('key_create') }}">
@csrf
<button class="bluebutton" type="submit">Create Invite Key</button>
</form>
<br>
@endif
@foreach ($data['fetchKeys'] as $fKey)
<div class="FeedContainerBox" id="FeedContainerBox1">
<div id="ProfileContainerBox1TextContainer">
<h3>Invite Key - @if (!$fKey->active)
You Invited: <a href="{{ route('profile', App\Models\User::find($fKey->user_invited)->id) }}"
style="font-weight:normal;color:blue">{{ App\Models\User::find($fKey->user_invited)->name }}</a>
-
@endif Created {{ $fKey->created_at->format('d/m/Y') }}</h3>
@if ($fKey->active)
<h5 style="color:green">Status: Active</h5>
@else
<h5 style="color:red">Status: Inactive</h5>
@endif
<address>{{ $fKey->key }}</address>
</div>
</div>
@endforeach
@endsection

View File

@ -6,14 +6,14 @@
<meta charset="utf-8">
<meta content="Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url" />
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="MORBLOX.png" />
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@ -31,8 +31,8 @@
<a class="navbarbutton" id="smallbtn4" href="catalog.html">Catalog</a>
<a class="navbarbutton" id="smallbtn0" href="build.html">Build</a>
<a class="navbarbutton" id="smallbtn1" href="forum.html">Forum</a>
<a class="navbarbutton" id="smallbtn2" href="{{ route('profile', Auth::user()->id) }}">Profile</a>
<a class="navbarbutton" id="smallbtn3" href="forum.html">Settings</a>
<a class="navbarbutton" id="smallbtn2" href="@guest {{ route('login') }} @else {{ route('profile', Auth::id()) }} @endguest">Profile</a>
<a class="navbarbutton" id="smallbtn3" href="{{ route('settings') }}">Settings</a>
</div>
@guest
<div id="navbarlogincontainer">
@ -54,6 +54,7 @@
<a class="smallnavbarbutton" href="friends.html">Friends</a>
<a class="smallnavbarbutton" href="avatar.html">Avatar</a>
<a class="smallnavbarbutton" href="Settings.html">Transactions</a>
<a class="smallnavbarbutton" href="{{ route('users') }}">Users</a>
</div>
</div>
@yield('alert')

View File

@ -2,18 +2,20 @@
<html lang="en-us">
<head>
<title>Privacy Policy - {{ env('APP_NAME') }}</title>
<meta content="morblox.us - Privacy Policy" property="og:title"/>
<meta content="MORBLOX is a work in progress revival." property="og:description"/>
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url"/>
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image"/>
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color"/>
<meta charset="utf-8">
<meta content="Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<link rel="apple-touch-icon" href="MORBLOX.png"/>
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png"/>
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/main.js') }}"></script>
</head>
<body>
<ul></ul>

View File

@ -0,0 +1,36 @@
@extends('layouts.app')
@section('title')
<title>Settings - {{ env('APP_NAME') }}</title>
@endsection
@section('content')
<h1>Settings</h1>
<div class="content_special" style="align-content: flex-end; align-items: flex-start;">
<div class="content_special" style="flex-wrap: wrap; flex-direction: column; width: 50%;">
<h3>Bio</h3>
<textarea style="resize: none; width: 100%; height: 75px;" placeholder="Hello!"></textarea>
<button class="bluebutton">Save</button>
<br>
</div>
<div class="content_special" style="flex-wrap: wrap; flex-direction: column; width: 50%; text-align: end;">
<p>Username: OnlyTwentyCharacters <button class="bluebutton">Edit</button></p>
<p>E-Mail: t****@ex********.com <button class="bluebutton">Edit</button></p>
<p>Date of Birth: 01/01/01 <button class="bluebutton">Edit</button></p>
<p>Password: ******** <button class="bluebutton">Edit</button></p>
<p>Date Display Preference: D/M/YY <button class="bluebutton">Edit</button></p>
<p>Time Display Preference: 12 Hour <button class="bluebutton">Edit</button></p>
</div>
</div>
<div>
<h3>Invite Keys</h3>
<p>You can only create 1 invite every week. <br>Manage your keys and key history below.</p>
<p><button class="bluebutton"><a href="{{ route('key_index') }}" style="font-weight:normal;color:#fff">Create Invite Key</a></button></p>
</div>
<br>
<div style="flex-wrap: wrap; flex-direction: column;">
<h3>DANGER ZONE - These are inactive for now</h3>
<p>These buttons can fully delete data. Use with caution!</p>
<p><button class="redbutton" disabled>Delete Account</button> <button class="redbutton" disabled>Delete All Places</button> <button
class="redbutton" disabled>Delete All Avatar Items</button></p>
</div>
@endsection

View File

@ -2,18 +2,20 @@
<html lang="en-us">
<head>
<title>Terms of Service - {{ env('APP_NAME') }}</title>
<meta content="morblox.us - Terms of Service" property="og:title"/>
<meta content="MORBLOX is a work in progress revival." property="og:description"/>
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/" property="og:url"/>
<meta content="https://thomasluigi07.github.io/MORBLOX-WEBSITE/MORBLOXlogo.png" property="og:image"/>
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color"/>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<link rel="apple-touch-icon" href="MORBLOX.png"/>
<link rel="apple-touch-startup-image" href="MORBLOXSplash.png"/>
<meta charset="utf-8">
<meta content="Morblox" property="og:title" />
<meta content="MORBLOX is a work in progress revival." property="og:description" />
<meta content="https://morblox.us" property="og:url" />
<meta content="https://morblox.us/img/MORBLOXlogo.png" property="og:image" />
<meta content="#4b4b4b" data-react-helmet="true" name="theme-color" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="{{ asset('img/MORBLOX.png') }}" />
<link rel="apple-touch-startup-image" href="{{ asset('img/MORBLOXsplash.png') }}" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}">
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
<script src="{{ asset('js/main.js') }}"></script>
</head>
<body>
<ul></ul>

View File

@ -1,38 +1,53 @@
@extends('layouts.app')
@section('title')
<title>{{ $user->name }} - {{ env('APP_NAME') }}</title>
<title>{{ $data['user']->name }} - {{ env('APP_NAME') }}</title>
@endsection
@section('content')
<div id="profiletopcontainer">
<h1 id="usernameframe">{{ $user->name }}</h1>
<p id="onlinestatus" class="onlinestatus_website">Website</p>
</div>
<div id="content_special">
<div id="profileleftcontainer">
<p id="status">"I'm new to MORBLOX!"</p>
<img alt="profile image" src="{{ asset('img/reviewpending.png') }}" width="75%">
<p id="bio">{{ $user->blurb }}</p>
<ul></ul>
<div id="stats">
<h3>Joined: {{ $user->created_at->format('d/m/Y') }}</h3>
<p>(day/month/year)</p>
<h3>Place Visits: 0</h3>
<div id="profiletopcontainer">
<h1 id="usernameframe">{{ $data['user']->name }}</h1>
@if (Cache::has('is_online_' . $data['user']->id))
<p id="onlinestatus" class="onlinestatus_website">Website</p>
@else
<p id="onlinestatus" class="onlinestatus_offline">Offline</p>
@endif
</div>
<div id="content_special">
<div id="profileleftcontainer">
<p id="status">"I'm new to MORBLOX!"</p>
<img alt="profile image" src="{{ asset('img/reviewpending.png') }}" width="75%">
<p id="bio">{{ $data['user']->blurb }}</p>
<ul></ul>
<div id="stats">
<h3>Joined: {{ $data['user']->created_at->format('d/m/Y') }}</h3>
<p>(day/month/year)</p>
<h3>Place Visits: 0</h3>
</div>
<ul></ul>
<h2>MORBLOX Badges</h2>
<div style="white-space:nowrap">
@foreach ($data['badges'] as $badge)
@foreach ($data['user']->badges as $user_badge)
@if ($badge->id == $user_badge)
<div style="width:120px;display:inline-block">
<img src="/img/badges/{{ $badge->id }}.png" width="75px" height="75px" />
<h3>{{ $badge->title }}</h3>
</div>
@endif
@endforeach
@endforeach
</div>
<ul></ul>
<h2>Game Badges</h2>
<p>This user has not collected any game badges yet!</p>
</div>
<div id="profilerightcontainer">
<h2>Games</h2>
<p>This user hasn't made any games yet!</p>
<ul></ul>
<h2>Friends</h2>
<p>This user hasn't made friends with anyone!</p>
</div>
<ul></ul>
<h2>MORBLOX Badges</h2>
<p>This user has not collected any MORBLOX badges yet!</p>
<ul></ul>
<h2>Game Badges</h2>
<p>This user has not collected any game badges yet!</p>
</div>
<div id="profilerightcontainer">
<h2>Games</h2>
<p>This user hasn't made any games yet!</p>
<ul></ul>
<h2>Friends</h2>
<p>This user hasn't made friends with anyone!</p>
</div>
<ul></ul>
</div>
@endsection

View File

@ -0,0 +1,43 @@
@extends('layouts.app')
@section('title')
<title>Users - {{ env('APP_NAME') }}</title>
@endsection
@section('content')
@if (request()->query('q'))
<h1 id="usernameframe">Users -
{{ DB::table('users')->where('name', 'LIKE', '%' . request()->query('q') . '%')->count() }} found</h1>
<a href="{{ route('users') }}" style="color:#2260DD">Clear Search</a>
@else
<h1 id="usernameframe">Users</h1>
@endif
<ul></ul>
<ul></ul>
<form method="GET" action="{{ route('users') }}">
<p><input type="text" id="q" name="q" placeholder="Enter a Username..." value="{{ request()->q }}">
<button class="greybutton" type="submit">Search</button>
</p>
</form>
<ul></ul>
<div id="SearchContainer">
@foreach ($users as $user)
<div class="ProfileContainerBox" id="ProfileContainerBox1">
<div id="ProfileContainerBox1ImageContainer">
<a href="{{ route('profile', $user->id) }}"><img alt="Profile Image"
src="{{ asset('img/reviewpending.png') }}" width="60px" height="100%"></a>
</div>
<div id="ProfileContainerBox1TextContainer">
<a href="{{ route('profile', $user->id) }}" id="FeedContainerBox1Username">{{ $user->name }}</a>
<p>"I'm new to MORBLOX!"</p>
@if (Cache::has('is_online_' . $user->id))
<p id="onlinestatus" class="onlinestatus_website">Website</p>
@else
<p id="onlinestatus" class="onlinestatus_offline">Offline</p>
@endif
</div>
</div>
@endforeach
</div>
<ul></ul>
{{ $users->appends($_GET)->links() }}
@endsection

View File

@ -23,8 +23,13 @@ Auth::routes();
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('index');
Route::get('/privacy', [App\Http\Controllers\PageController::class, 'privacy'])->name('privacy');
Route::get('/tos', [App\Http\Controllers\PageController::class, 'tos'])->name('tos');
Route::get('/user/{id}', [App\Http\Controllers\PageController::class, 'profile'])->name('profile');
Route::middleware(['auth'])->group(function () {
Route::get('/home', [App\Http\Controllers\HomeController::class, 'home'])->name('home');
Route::get('/user/{id}', [App\Http\Controllers\PageController::class, 'profile'])->name('profile');
Route::get('/users', [App\Http\Controllers\PageController::class, 'users'])->name('users');
Route::post('/users', [App\Http\Controllers\PageController::class, 'users'])->name('users');
Route::get('/my/settings', [App\Http\Controllers\PageController::class, 'settings'])->name('settings');
Route::get('/my/invites', [App\Http\Controllers\KeyController::class, 'index'])->name('key_index');
Route::post('/my/invites', [App\Http\Controllers\KeyController::class, 'create'])->name('key_create');
});

View File

@ -13,4 +13,4 @@ const mix = require('laravel-mix');
mix.js('resources/js/app.js', 'public/js')
.vue()
.sass('resources/sass/app.scss', 'public/css');
.sass('resources/sass/app.scss', 'public/css');