Cosmic Github
| Let's Get Started
Install facebook/graph-sdk with composer, with cmd locate your CMS and run the following command:
Code:
composer require facebook/graph-sdk
| Step 1 - Add Facebook App Configuration
Let's go to App/Config.php
And right below 'const site' we add up this facebook array:
PHP Code:
/**
* Website settings
* recaptcha v2: Create a inisible reCAPTCHA V2 [MENTION=848466]GoOgl[/MENTION]e website
* Set null if you dont want a reCAPTCHA.
*/
const site = array(
'domain' => 'Kubbo.me',
'cpath' => 'https://swfs.kubbo.us',
'fpath' => 'https://habbo.com.br/habbo-imaging',
'shortname' => 'Kubbo',
'sitename' => 'Kubbo'
);
const facebook = array(
'id' => 'YOUR APP ID',
'secret_key' => 'YOUR SECRET KEY'
);
const language = 'ES';
| Step 2 - Adding Facebook Id to our Users Table
On your database, edit table users and add column fb_id
Just like so:
| Step 3 - Adding up Facebook Button to Login
On App/Controllers/Home/Index.php file let's add our new Facebook Array to our rendered template:
PHP Code:
View::renderTemplate('Home/home.html', [
'title' => !request()->player ? Locale::get('core/title/home') : request()->player->username,
'page' => 'home',
'rooms' => $rooms,
'groups' => $groups,
'news' => $news,
'oftw' => $oftw,
'currencys' => isset($currencys) ? $currencys : null,
'random' => isset($random) ? $random : null,
'facebook' => Config::facebook
], 10);
With this, we have access to write {{facebook.X}} on our HTMLs files.
Then we go to App/View/base.html file and we add the next script
Code:
<div id="fb-root"></div>
<script type="text/javascript">
function DeleteCookie(name)
{
document.cookie = name + '=; Max-Age=0';
}
function SetCookie(cname, cvalue, exdays)
{
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
window.fbAsyncInit = function() {
DeleteCookie("fbhb_val_{{facebook.id}}");
FB.init({
appId: "{{facebook.id}}",
version : 'v2.4',
channelUrl : '/fbchannel',
status: true,
cookie: true,
xfbml: true
});
$(document).fire("fbevents:scriptLoaded");
};
window.assistedLogin = function(FBobject, optresponse) {
DeleteCookie("fbhb_val_{{facebook.id}}");
FBobject.init({
appId: '{{facebook.id}}',
version : 'v2.4',
channelUrl : '/fbchannel',
status: true,
cookie: true,
xfbml: true
});
permissions = 'email';
defaultAction = function(response) {
if (response.authResponse) {
fbConnectUrl = "/facebook?connect=true";
DeleteCookie("fbhb_val_{{facebook.id}}");
SetCookie("fbhb_val_{{facebook.id}}", response.authResponse.accessToken, 1);
DeleteCookie("fbhb_expr_{{facebook.id}}");
SetCookie("fbhb_expr_{{facebook.id}}", response.authResponse.expiresIn, 1);
window.location.replace(fbConnectUrl);
}
};
if (typeof optresponse == 'undefined')
FBobject.login(defaultAction, {scope:permissions});
else
FBobject.login(optresponse, {scope:permissions});
};
(function() {
var e = document.createElement('script');
e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/es_ES/sdk.js#version=v2.4';
document.getElementById('fb-root').appendChild(e);
}());
</script>
And right below our Login button, add your facebook connect button:
PHP Code:
<button type="submit" class="rounded-button blue plain" id="login-request">Log in</button>
<button class="rounded-button blue plain" onclick="assistedLogin(FB); return false; " id="fb-login-request">Login with Facebook!</button>
| Step 3 - Facebook Route
Cosmic already has this route coded, although it doesn't work
You may see this on Core/Routes.php
PHP Code:
Router::get('/facebook', 'Home\Login@facebook');
This is calling facebook() function on Login Controller.
| Step 3 - Facebook Function
Create facebook() function on App/Controllers/Home/Login.php file below googleAuthentication function
This part can be modified with medium level PHP knowledge, this function what it does is:
Logs In or Registers the user depending if the user exists or doesn't.
PHP Code:
public function facebook()
{
$settings = Core::settings();
$fb = new Facebook([
'app_id' => Config::facebook['id'],
'app_secret' => Config::facebook['secret_key'],
'default_graph_version' => 'v2.10'
]);
$response = $fb->get('/me?fields=id,name,email,gender,birthday', $_COOKIE['fbhb_val_' . Config::facebook['id']]);
$user_profile = $response->getGraphObject()->asArray();
$player = Player::getDataByFacebookID($user_profile['id'], array('id', 'username', 'password', 'rank', 'secret_key', 'pincode'));
if($player == null)
{
$getMaxIp = Player::checkMaxIp(request()->getIp());
if ($getMaxIp != 0 && $getMaxIp >= $settings->registration_max_ip) {
response()->json(["status" => "error", "message" => Locale::get('register/too_many_accounts')]);
}
$email = isset($user_profile['email']) ? $user_profile['email'] : $user_profile['id'] . '@facebook.com';
if (isset($user_profile['gender']) && $user_profile['gender'] === 'male')
{
$gender = 'M';
$look = 'ch-210-1211.sh-300-63.lg-285-64.ha-1002-63.hr-828-1061.hd-180-1';
}
else
{
$gender = 'F';
$look = 'hd-600-1.ch-813-1211.ha-1005-63.lg-720-64.hr-890-1061.sh-735-63';
}
$playerData = (object)[
'username' => Player::GenerateName($email),
'fb_id' => $user_profile['id'],
'password' => '',
'email' => '',
'account_created' => time(),
'credits' => Core::settings()->start_credits,
'figure' => $look,
'birthdate_day' => 17,
'birthdate_month' => 06,
'birthdate_year' => 2020,
'gender' => $gender,
'last_login' => time(),
'ip_register' => request()->getIp(),
'ip_current' => request()->getIp()
];
if (!Player::create($playerData)) {
response()->json(["status" => "error", "message" => Locale::get('core/notification/something_wrong'), "captcha_error" => "error"]);
}
$player = Player::getDataByFacebookID($user_profile['id'], array('id', 'username', 'password', 'rank', 'secret_key', 'pincode'));
$freeCurrencys = Core::getCurrencys();
if($freeCurrencys) {
foreach($freeCurrencys as $currency) {
Player::createCurrency($player->id, $currency->type);
Player::updateCurrency($player->id, $currency->type, $currency->amount);
}
}
}
Auth::login($player);
redirect('/home');
}
Do not forget to import facebook/graph-sdk and use it on the controller:
PHP Code:
...
use Library\Json;
use Library\HotelApi;
use Facebook\Facebook;
use Sonata\GoogleAuthenticator\GoogleAuthenticator;
...
Also I forgot, on the same imports:
You can delete: And add:
PHP Code:
use App\Models\Core;
Because Facebook Function uses:
PHP Code:
$settings = Core::settings();
Reading the code, we can see that we are using some functions of Player Model that do not exist yet such as:
Player::getDataByFacebookID() or Player::GenerateName()
| Step 4 - Players Model Modification
Now we are going to edit App/Models/Player.php file
Add a function to search user by using the fb_id on Step 2.
PHP Code:
public static function getDataByFacebookID($fb_id, $data = null)
{
return QueryBuilder::table('users')->select($data ?? static::$data)->setFetchMode(PDO::FETCH_CLASS, get_called_class())->where('fb_id', $fb_id)->first();
}
Add a function to Generate a Random Name based on Facebook Email Address
PHP Code:
public static function GenerateName($e, $t = 0)
{
$e = $E = substr(strstr($e, '@') ? explode('@', $e)[0] : $e, 0, 18);
$c = ['.', '-', '_'];
if (strlen($e) > 6)
foreach ($c as $C)
{
if (strstr($e, $C) === FALSE) continue;
$n = rand(0, 1);
$e = explode($C, $e);
$e = strlen($e[$n]) < 3 ? ($e[($n === 1) ? 0 : 1]) : $e[$n];
break;
}
$r = self::exists($e);
if ($r === null) return null;
if ($r === false) return $e;
$c = strlen($e);
$r = ($c > 10) ? rand(rand(1, 2 + $t), rand(2, 3 + $t)) : ($c > 8) ? rand(rand(2, 2 + $t), rand(3, 3 + $t)) : rand(rand(3, 4 + $t), rand(3, 4 + $t));
$e .= self::Random($r, true, false, '-_=?!@:.,');
$r = self::exists($e);
if ($r === null) return null;
if ($r === false) return $e;
self::GenerateName($E, $t++);
}
PHP Code:
public static function Random($l, $n = true, $L = true, $o = '')
{
$c = '';
$c .= $n ? '0123456789' : '';
$c .= $L ? 'QWERTYUIOPASDFGHJKLLZXCVBNMqwertyuiopasdfghjklzxcvbnm' : '';
$c .= $o;
$s = '';
$C = 0;
while ($C < $l)
{
$s .= substr($c, rand(0, strlen($c) -1), 1);
$C++;
}
return $s;
}
Modify function create($data) to add fb_id in case of Facebook Registration
PHP Code:
public static function create($data)
{
$data = array(
'username' => $data->username,
'password' => Hash::password($data->password),
'mail' => $data->email,
'fb_id' => $data->fb_id,
'account_created' => time(),
....
| Step 5 - Registration File Modification
Since now we are requiring an extra field on the create function, let's just add it on the $playerData in App/Controllers/Home/Registration.php file
PHP Code:
$playerData = (object)input()->all();
$playerData->figure = input()->post('figure')->value;
$playerData->fb_id = '';
$getMaxIp = Player::checkMaxIp(request()->getIp());
| Notes
This approach doesn't give user an email to connect via Cosmic Login Process nor a password. Doesn't check if facebook email is already registered on Cosmic users simply doesn't give Facebook Account an email. I would suggest to modify facebook function to add code to enable "can_change_name" on Arcturus users_settings. And I guess that's it. Any issues or suggestions just comment on the section below. Thank you!
| Forgot Password Tips
Set up your App/Config.php file, only change your support email and the password
PHP Code:
const mailHost = 'smtp.gmail.com';
const mailFrom = 'SUPPORT-EMAIL@gmail.com';
const mailUser = 'SUPPORT-EMAIL@gmail.com';
const mailPass = 'YOUR-GMAIL-PASSWORD';
const mailPort = 465;
Then log into your GMAIL and allow less secure apps
https://www.google.com/settings/u/1/...lesssecureapps
https://accounts.google.com/b/0/DisplayUnlockCaptcha