Git Product home page Git Product logo

msgraph-sample-phpapp's People

Contributors

bplus avatar dependabot[bot] avatar dodaromike avatar github-actions[bot] avatar jasonjoh avatar justinbyrne avatar microsoft-github-policy-service[bot] avatar nicolas-sanch avatar paulhennell avatar rick-va avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

msgraph-sample-phpapp's Issues

Composer microsoft/microsoft-graph version bug

Where did you get the code?

Describe the bug

Composer cannot install the project, because of the invalid microsoft-graph version. This is located in the composer.json file https://github.com/microsoftgraph/msgraph-training-phpapp/blob/68bfcb823cf5b8c74e3c9ed47c630ccbf35bbbe4/demo/graph-tutorial/composer.json#L18

To Reproduce

Steps to reproduce the behavior:
Following the quick start guide for PHP: https://developer.microsoft.com/en-us/graph/quick-start

  1. Unzip the downloaded package to a directory, and go to the graph-tutorial directory in your command-line tool.
  2. Type composer install to install the project dependencies.

Expected behavior

The composer install process should complete package installation without error.

Screenshots

If applicable, add screenshots to help explain your problem.

Desktop

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Dependency versions

microsoft/microsoft-graph: "^1.49"
https://github.com/microsoftgraph/msgraph-sdk-php

Additional context

The bug was corrected using a valid version number, "^1.49"

error 404; Not found - after clicking step 3 button in quick start example

Where did you get the code?

Actually, the issue is, that I am NOT getting the code!

Describe the bug

After successfully generating the app secret and entering it in step 2 here
Microsoft Graph Quick Start
I press the button below step 3:
image

which produces an error 404: Not Found.

To Reproduce

see above

Expected behavior

I expected to get the quick start code!

Screenshots

image

Desktop

  • iOS
  • safari
  • version 14.01

Dependency versions

Additional context

Question: How do I update a calendar event?

Hi

Using your code:-

https://docs.microsoft.com/en-us/graph/tutorials/php?tutorial-step=1

I have managed to create an event in my outlook calendar, for identification purposes, I place our appointment_id into transactionId - I don't save the ID returned by your API - firstly - should I?

Secondly, does this plugin allow the following:-

Update an existing event and if so, is there an example or documentation?
Delete an existing event and if so, is there an example or documentation?

Thirdly, do you have, or is there, any examples of working with recurring events, as above really, to be able to create, update, delete the series?

If this is the wrong place to ask, can you please provide a link to where is best to ask the above?

Kind regards in advance.
Carl.

Updating an event getting error 'The specified object was not found in the store'

Hi

In my Laravel system, we have a diary and can create single item diary appointments and recurring. When I edit an appointment that is a single item, the code works, when I then edit a recurring sequence, the update fails.

The code to do the update is:-

$response = $graph->createRequest('PATCH', '/me/events/' . $existing_appointment->MicrosoftID)
	->attachBody($newEvent)
	->setReturnType(Model\Event::class)
	->execute();

The exception error that is displayed on screen is

 Client error: `PATCH https://graph.microsoft.com/v1.0/me/events/{id}` resulted in a `404 Not Found` response: ◀
      {"error":{"code":"ErrorItemNotFound","message":"The specified object was not found in the store.","innerError":{"date":"2021-11-16T09:51:35","request-id":"{request_id}","client-request-id":"{client_request_id}"}}} ◀

I've removed the id's for security purposes.

Also, i've double checked the ID (by pulling the events from the calendar - using your test code) and the ID is exact!

Any idea why this error occurs?

Also, I've tried to DELETE the event and re-create a new one but the delete fails with the not found in store. BUT, I know it exists as my laptop displays it!

Thanks for any help in fixing this issue.
Regards
Carl.

getDisplayName() is not work for core php

Hi sir
Hope you are doing well.I read the documentation : https://docs.microsoft.com/en-us/graph/tutorials/php
and implement the PHP apps with Microsoft Graph.
Everything is right but a issue come when i send the get request using graph then it returned Microsoft\Graph\Http\GraphResponse Object when i use the method getDisplayName() it return Call to undefined method Microsoft\Graph\Http\GraphResponse::getDisplayName().
I just need to get the name and email.

So kindly help me in this regard
I shall be very thankful to you.Please🙏

Action App\Http\Controllers\CalendarController@getNewEventForm not defined.

Where did you get the code?

Describe the bug

The exeption rises following step 4 of the tutorial: Get a calendar view, paragraph "Display the results".

InvalidArgumentException
Action App\Http\Controllers\CalendarController@getNewEventForm not defined. (View: /path_to_project_dir/resources/views/calendar.blade.php) 

It is caused by this line (in my case line 6) in the resources/views/calendar.blade.php source file.

<a class="btn btn-light btn-sm mb-3" href={{action('CalendarController@getNewEventForm')}}>New event</a>

To Reproduce

Follow the tutorial until "Display the results" paragraph, included.

Expected behavior

Refreshing the browser view/tab should display calendar events list instead of the exception.

The route Route::get('/calendar/new', 'CalendarController@getNewEventForm'); should be added before "Display the results" paragraph and not in the next step (step 5) of the tutorial.

Screenshots

Desktop

  • OS: MacOS Sierra 10.12.6
  • Browser: Firefox
  • Version: 84.0.1 (64-bit)
  • Apache 2.4.46
  • PHP 7.4.10

Dependency versions

    "require": {
        "php": "^7.3|^8.0",
        "fideloper/proxy": "^4.4",
        "fruitcake/laravel-cors": "^2.0",
        "laravel/framework": "^8.12",
        "laravel/tinker": "^2.5",
        "league/oauth2-client": "^2.6",
        "microsoft/microsoft-graph": "^1.25"
    },
    "require-dev": {
        "facade/ignition": "^2.5",
        "fakerphp/faker": "^1.9.1",
        "laravel/sail": "^0.0.5",
        "mockery/mockery": "^1.4.2",
        "nunomaduro/collision": "^5.0",
        "phpunit/phpunit": "^9.3.3"
    },

Additional context

Get access without a user

Hey,

First of all, thanks for this guide which is really a great way to start with ms graph
Is there a version of it to integrate the functionality of a no-user connection ?

Thank you

Impossible authentication (TOO_MANY_REDIRECT)

I met issues with the signin method. It worked well at th beginning and then stopped working (TOO_MANY_REDIRECTS)....

By investigation, I realised that the array given for initializing the OAuth client was empty. Actually, the .env keys where not read. This is a problem that I already met in other Laravel projects : env(...) function does not work after the config is cached.

This can be solved declaring these variables in the config/app.php file and then calling them in the controller with the global config helper.

In our case, add these lines in the config/app.php file :

/*
|--------------------------------------------------------------------------
| Microsoft OAUTH
|--------------------------------------------------------------------------
*/
'clientId'                => env('OAUTH_APP_ID'),
'clientSecret'            => env('OAUTH_APP_PASSWORD'),
'redirectUri'             => env('OAUTH_REDIRECT_URI'),
'urlAuthorize'            => env('OAUTH_AUTHORITY').env('OAUTH_AUTHORIZE_ENDPOINT'),
'urlAccessToken'          => env('OAUTH_AUTHORITY').env('OAUTH_TOKEN_ENDPOINT'),
'scopes'                  => env('OAUTH_SCOPES'),

In the AuthController.php file, initialize the OAuth client this way :

    // Initialize the OAuth client
    $oauthClient = new \League\OAuth2\Client\Provider\GenericProvider([
        'clientId'                => config('app.clientId'),
        'clientSecret'            => config('app.clientSecret'),
        'redirectUri'             => config('app.redirectUri'),
        'urlAuthorize'            => config('app.urlAuthorize'),
        'urlAccessToken'          => config('app.urlAccessToken'),
        'urlResourceOwnerDetails' => '',
        'scopes'                  => config('app.scopes'),
    ]);

Then, run the command php artisan config:clear

I hope this can help

AADSTS50194: Application '3b79e557-4d51-4b78-a1b0-82f9dd'(Testing for mail read) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-

AADSTS50194: Application '3b79e557-4d51-4b78-a1b0-82f9dd'(Testing for mail read) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant.

Sign out not clearing or removing token data from session.

Where did you get the code?

Describe the bug

When we click on sign out, its not clear access token, and when we again sign in its not ask showing credentials window and direct giving login to session user.

I have also calling session flush fucntion from signout function.

like -

Session::forget('_token');
session()->forget('_token');

but its not working.

To Reproduce

Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior

Sign out must clear session data but its skip token in session as it is.

Screenshots

If applicable, add screenshots to help explain your problem.

Desktop

  • PHP 8 Laravel 8
  • Browser Chrome
  • Version Latest

Dependency versions

  • Authentication library (MSAL, etc.) version:
  • Graph library (Graph SDK, REST library, etc.) version:

Additional context

Add any other context about the problem here.

invalid_client

Where did you get the code?

Describe the bug

League\OAuth2\Client\Provider\Exception\IdentityProviderException
invalid_client
http://localhost:8000/callback?code=M.R3_BAY.4b726340-f363-8457-798b-3b54b282f833&state=6e71605213561ac6f226ac06d5e73219

Followed the simple steps as outlined. Tried clearing config and app cache.
Getting the same issue as #53 and #6

OR I'm just getting the default home page after the callback.

To Reproduce

Steps to reproduce the behavior:

Follow the steps as outlined in the https://developer.microsoft.com/graph/quick-start

Expected behavior

I don't know, never got to that point - I suppose I should see a UI showing my calendar.

Screenshots

If applicable, add screenshots to help explain your problem.

Desktop

  • OS: OS X
  • Browser Chrome
  • Version 88

Dependency versions

Laravel version 7.30.4
PHP version 7.3.24

No access token has been provided. in CalendarController

I am following the tutorial and found that the "No access token has been provided." error from Laravel in the Calendar chapter.

The Calendar controller will get the access token and set it in the graph api.

        // Get the access token from the cache
        $tokenCache = new TokenCache();
        $accessToken = $tokenCache->getAccessToken();

        // Create a Graph client
        $graph = new Graph();
        $graph->setAccessToken($accessToken);

However, if the session never expired and never refresh the token, the session('refreshToken') valuw will be null and the function getAccessToken() returning the empty string to the CalendarController.

public function getAccessToken() {
  // Check if tokens exist
  if (empty(session('accessToken')) ||
      empty(session('refreshToken')) ||
      empty(session('tokenExpires'))) {
    return '';
  }

Is this a bug or I missed some steps?

Redirected too many times

Hi,
I tried replicating the project on Laravel 10 after generating the key via artisan when I click on sign in I get: 127.0.0.1 redirected you too many times.(this error). After clearing the cache still the same error persist. Can you give guidance on how can I resolve this.

How to access $count=true result ?

Is there a way to return the raw JSON instead of converting it to an object?
Once converted to a specific object you lose the $count result.

Create Calendar event - exclude organiser

Hi

When I create an event in the calendar (an appointment) and am creating it for another office 365 user, how to I set the attendees so that me (the creator) either doesn't see it in my calendar OR make me an optional attendee?

I've tried

$attendees[] = [
	'emailAddress' => [
		'address' => $staffOrganiser->StaffEmail,
	],
	'type' => 'optional',
	];
$staffAttendee = \UserHelpers::getStaffById($app_user->StaffID);
$attendees[] = [
	'emailAddress' => [
		'address' => $staffAttendee->StaffEmail,
	],
	'type' => 'required',
];

I've currently just set the attendees to

	$staffAttendee = \UserHelpers::getStaffById($app_user->StaffID);
	$attendees[] = [
		'emailAddress' => [
			'address' => $staffAttendee->StaffEmail,
		],
		'type' => 'required',
	];

I'd prefer NOT to show in the organisers calendar if the event is for another person!

Thanks for any and all help in advance
Carl.

Getting "invalid_client" error

Hi,
I just tried to implement your tutorial but it seems that I get an error "invalid_client".
`:\xampp\htdocs\vendor\league\oauth2-client\src\Provider\GenericProvider.php
protected function getScopeSeparator()
{
return $this->scopeSeparator ?: parent::getScopeSeparator();
}

/**
 * @inheritdoc
 */
protected function checkResponse(ResponseInterface $response, $data)
{
    if (!empty($data[$this->responseError])) {
        $error = $data[$this->responseError];
        if (!is_string($error)) {
            $error = var_export($error, true);
        }
        $code  = $this->responseCode && !empty($data[$this->responseCode])? $data[$this->responseCode] : 0;
        if (!is_int($code)) {
            $code = intval($code);
        }
        **throw new IdentityProviderException($error, $code, $data);**
    }
}

/**
 * @inheritdoc
 */
protected function createResourceOwner(array $response, AccessToken $token)
{
    return new GenericResourceOwner($response, $this->responseResourceOwnerId);
}

}
`

401 Unauthorized while accessing calendars

I have a token generated for oAuth and added calendars.readwrite to my scope in my constants and scope for the web app and calendars works in my development but when i pushed it to productions gives me a 401.

my oauth:

$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => OAuthConstants::CLIENT_ID,
    'clientSecret'            => OAuthConstants::CLIENT_SECRET,
    'redirectUri'             => OAuthConstants::REDIRECT_URI,
    'urlAuthorize'            => OAuthConstants::AUTHORITY_URL . OAuthConstants::AUTHORIZE_ENDPOINT,
    'urlAccessToken'          => OAuthConstants::AUTHORITY_URL . OAuthConstants::TOKEN_ENDPOINT,
    'urlResourceOwnerDetails' => '',
    'scopes'                  => OAuthConstants::SCOPES
]);

if ($_SERVER['REQUEST_METHOD'] === 'GET' && !isset($_GET['code'])) {
    $authorizationUrl = $provider->getAuthorizationUrl();

    // The OAuth library automaticaly generates a state value that we can
    // validate later. We just save it for now.
    $_SESSION['state'] = $provider->getState();

    header('Location: ' . $authorizationUrl);
    exit();
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['code'])) {
    // Validate the OAuth state parameter
    if (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['state'])) {
        unset($_SESSION['state']);
        exit('State value does not match the one initially sent');
    }

    // With the authorization code, we can retrieve access tokens and other data.
    try {
        // Get an access token using the authorization code grant
        $accessToken = $provider->getAccessToken('authorization_code', [
            'code'     => $_GET['code']
        ]);

        $_SESSION['access_token'] = $accessToken->getToken();

        if ($accessToken->hasExpired()) {
            $accessToken = $provider->getAccessToken('refresh_token', [
                'refresh_token' => $existingAccessToken->getRefreshToken()
            ]);
        }


Test calendar

`require_once "vendor/autoload.php";
use Microsoft\Graph\Connect\Constants;
use Microsoft\Graph\Graph;
$accessToken = $_SESSION['access_token'];

$user=false;

$graph = new Graph();
$graph->setAccessToken($accessToken);
//the sesion token for calendars expires faster than our token to stay in connect, so if it expires have the user sign back in
try {
  $user = $graph->createRequest("GET", "https://graph.microsoft.com/v1.0/me/calendars")
                ->execute();
} catch (Exception $e) {      <-------FAILS HERE
  // sessionTimeout(); exit;
  var_dump($e);
}



$ids = $user->getBody()['value'];

$selection = "";
foreach ($ids as $id) {
  $calendarName = $id['name'];
  $calendarId = $id['id'];
  $selection .= '<option value="'.$calendarId.'">'.$calendarName.'</option>';
}`

Microsoft graph does not seem to return state

Where did you get the code?

Describe the bug

The reply given after accessing

//Line breaks are for readability only

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
state={state}
&scope=openid%20profile%20offline_access%20user.read%20mailboxsettings.read%20calendars.readwrite
&response_type=code
&approval_prompt=auto
&redirect_uri=https%3A%2F%2{url}%2Fcallback
&client_id={clientID}

Contains only a code as shown

//Line breaks are for readability only
https://{url}/callback?
code={code}

As opposed to the expected

//Line breaks are for readability only
https://{url}/callback?
code={code}
&state={state}

This means that the 'Invalid auth state' error is generated

To Reproduce

Steps to reproduce the behavior:

  1. Follow tutorial up until the end of 'Add Azure AD authentication'
  2. Deploy code to server with correct .env and redirect variables
  3. Try to login

Expected behavior

The user is logged in and their details are displayed.

Desktop

  • Server: VPS running Ubuntu 20.04 x64, Nginx 1.18.0, php 7.4.3
  • OS: Windows 10, macOS12.1
  • Browser: Firefox 96.0.3, Safari 15.2

Additional context

I found this by seperating this check

if (!isset($providedState) || $expectedState != $providedState) {
      return redirect('/')
        ->with('error', 'Invalid auth state')
        ->with('errorDetail', 'The provided auth state did not match the expected value');
    }

Into

if (!isset($providedState)) {
      return redirect('/')
        ->with('error', 'Invalid auth state')
        ->with('errorDetail', 'No provided state');
    }
if ($expectedState != $providedState) {
      return redirect('/')
        ->with('error', 'Invalid auth state')
        ->with('errorDetail', 'The provided auth state did not match the expected value');
    }

when logging in with org tennent i get this error GuzzleHttp\Exception\ClientException

hi I have followed the tutorial and I'm getting this error when I try to login with my organizations azure ad

Client error: GET https://graph.microsoft.com/v1.0/me?$select=displayName,mail,mailboxSettings,userPrincipalName resulted in a 403 Forbidden response: { "error": { "code": "UnknownError", "message": "\n<htm (truncated...)

when I log in with my personal Microsoft account all seem fine and it works as expected. I think it might have something to do with the API permissions for the owned app in azure ad, also how would I limit this to only allow logins for my organizational tenet only and not logins for personal accounts. thank you in advance for any help I'm new to the graph environment and laravel also please bear with me as it might take a bit of explaining for me to understand

Can you read the list of AD users?

sorry if it is not the right place to ask, but he found 100 libraries with 100 different functionalities, is it possible in this example to list the users of the domain to have the IDs, and thus validate with the users of another bd?

Getting Invalid auth state: The provided auth state did not match the expected value

Hi!
I'm doing the Tutorial and when I sign in, the Php App shows me a welcome message with my name, but also, before the welcome message, appears "Invalid auth state" -"The provided auth state did not match the expected value".

image

Looking at the code, this message comes from callback() function from AuthController. The message shows up because sesession('oauthState') is null.

So..... at the same controller AuthController, when signing in with function signin(), the value of
sesession('oauthState') is set, is not null. But later, at the callback it has changed to null....

Please help....

It's possibility access ADFS with this example?

Hi,
I try using this example with ADFS, but I receive error after the application forwarded to the adfs portal.
This error code is the 500 and I no have access to client ADFS.
Could someone help me please.

getting error ERR_TOO_MANY_REDIRECTS

I'm getting error ERR_TOO_MANY_REDIRECTS when trying to log in, the request return statut 302 in an endless loop, it worked fine yesterday, today it's not working anymore, i tried it in private tab, clear cache and cookies still getting error

Tutorial without the bloatware?

Is it possible to get this information without all of the Laravel bloatware?

I would love to be able to learn how to use this but I can't understand where the actual code resides within all the bloatware added by Laravel.

A simple and plain PHP project would be greatly appreciated.

Issues:

  1. Laravel's web server doesn't use SSL because it uses the native PHP dev server.

This means that it simply doesn't work because Azure doesn't work with plain HTTP in its response.

  1. This project doesn't build with a plain installation of IIS and PHP 7.3.7. because it is written to work with Laravel's routing and structure.

Is there any exception handling method?

Hi,

I have gone through the example code and I noticed that there are only try functions but never an exception catching function? Will it throw any exceptions at all?

I am using the createRequest function and I encountered errors but there is no exception.

Regards,

Dennis

trying to adapt to REST API (laravel) to get mail messages for all users

Hi there,
I'm trying to adapt the blade version you made to a rest one.
The purpose of the application is to get sent/received mail messages to put in a CRM database account.
in our endPoint method the user (Sales Rep) will provide his user/password, so then I used the post like this:
https://login.microsoftonline.com/{myTenantID}/oauth2/token
with the parameters:
grant_type=password,
client_id=myAppId,
client_secret=mySecret,
username=[email protected],
password=salesreppwd,
resource=https://graph.microsoft.com/,
scope=user.read,calendars.read,MailboxSettings.Read,Mail.read,Mail.Send
it works,I received access token and also refresh token, but I can only receive User.Read scope.
How can I change that to receive also calendars read/write and emails read/write scopes?

Thanks in advance

invalid_client

Hi!
I did everything according to the tutorial, but when I try to log in, I get an error:

League\OAuth2\Client\Provider\Exception\IdentityProviderException
invalid_client

Screenshot 2021-02-03 155339

Session expiring

As per @jasonjoh 's suggestion to create a sepparate issue:
After signing in and navigating to calender and then letting it idle for a long time, I was greeted with a

'Undefined index: userTimeZone' in app/Http/Controllers/CalendarController.php
` // Get user's timezone

$timezone = TimeZones::getTzFromWindows($viewData['userTimeZone']);`

After digging around in code and google for some days i came to conclusion ( with my limited know-how in oop and even less in graph / laravel ) that its not an actual issue or bug, but rather a result of something not implemented in the demo (correct me If i'm wrong).

I think replicating the issue should be as simple as deleting cookies from browser that hold the session data to ones demo app.

As for solution i found a suggestion somewhere about creating a Laravel Middleware 'piece' that checks if the token is expired and then act accordingly.

I do have a workaround that works for me atm, but i dont feel like posting it... I'd rather copy good code than spread something that i'm not sure is safe.
So if a kind soul with the know-how could implement that into the demo

Edit: found the middleware suggestion.... It was the issue #4 from two and a half years ago.... :-/

How do you redirect a user if they reach a URL and do not have a valid access token

If a user has not logged in using their Microsoft credentials and attempts to go to the url http://localhost:8000/calendar by directly typing the URL into the address bar, the tutorial simply throws an error message saying No access token has been provided.

What would be the best way to redirect to another URL when there is not a valid access token? For example, what if we wanted to redirect the user back to http://localhost:8000?

screen shot 2018-12-05 at 5 27 01 pm

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.