Giter VIP home page Giter VIP logo

tools's People

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  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

tools's Issues

Getting: Get server node failed [NO_AUTHORIZED] when tried to use a token created from Server [PHP]

$appID = APP_ID
$appCertificate =CERTIFICATE_KEY;
$channelName = "test";
$uid = uniqid();
$uidStr = "$uid";
$role = RtcTokenBuilder::RolePublisher;
$expireTimeInSeconds = 3600;
$currentTimestamp = (new DateTime("now", new DateTimeZone('GMT+5:30')))->getTimestamp();
$privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;
$token = RtcTokenBuilder::buildTokenWithUid($appID, $appCertificate, $channelName, $uid, $role, $privilegeExpiredTs);

I don't know what is wrong in token generated dynamic, does not allow to broadcast : Join failed: NO_AUTHORIZED.

If I only change $token variable to static temp token then it worked.

Console mode is testing :
Certificate is enabled.

generated_token = "006f605e69e63244441a70236c910865104IACFCvNqL1ODQuA2Lmf6Ig8KmXsT630UaZYLHTjVNbhRNvadZ7nomGXdIgBw0AAA3SoSYAQAAQBt5xBgAwBt5xBgAgBt5xBgBABt5xBg"

Thanks

PHP使用SimpleTokenBuilder生成的token不能用?临时token就没问题。

客户端:Android SDK 2.3
服务器:PHP5 Or PHP7

文件:https://github.com/AgoraIO/Tools/tree/master/DynamicKey/AgoraDynamicKey/php/src
方法:SimpleTokenBuilder.php
$builder = new SimpleTokenBuilder($appID, $appCertificate, $channelName, $uid); $builder->initPrivilege(SimpleTokenBuilder::Role["kRoleAdmin"]); $token = $builder->buildToken();
生成的token不能用,临时token就没问题,而且发现长度也不一致。

Receiving 110 error when using `buildTokenWithAccount`

Hello,

I'm creating a token on a Node server and then attempting to join from a React Native client with the following lines:

Server:
RtcTokenBuilder.buildTokenWithAccount(AGORA_CONFIG.appId, AGORA_CONFIG.appCertificate, channelName, 'user-id-1', AGORA_CONFIG.role, AGORA_CONFIG.privilegeExpiredTs),
Client:
await audioEngine.current.joinChannelWithUserAccount(m.callToken, m.groupId, 'user-id-1')

I receive a 110 error callback with the above when I expect to join successfully. I am successfully able to join when using uids like below:

Server:
RtcTokenBuilder.buildTokenWithUid(AGORA_CONFIG.appId, AGORA_CONFIG.appCertificate, channelName, 0, AGORA_CONFIG.role, AGORA_CONFIG.privilegeExpiredTs),
Client:
await audioEngine.current.joinChannelWithAccount(m.callToken, m.groupId, null, 0)

Security issue: RtcTokenBuilder token's role can overridden by the client

i have an project in agora with the app certificate enabled.
the problem is , if i set the role in the RtcTokenBuilder to RtcRole.SUBSCRIBER and then set it to "host" in AgoraRTC.createClient on the client , then the client we be able to publish video and audio like i host .
and vice versa if the token has the role of PUBLISHER, and the client has the role of "audience" it will throw an error when i try to publish video or audio.

 Uncaught (in promise) i {name: "AgoraRTCException", code: "INVALID_OPERATION", message: "AgoraRTCError INVALID_OPERATION: audience can not publish stream", data: undefined

it should be there other way around.

token server : "agora-access-token": "^2.0.4"
client : "agora-rtc-sdk-ng": "^0.1.9"

Token expiration

Hi i'm using node js version of the repository to generate token. I have some questions about token generation and expiration time:

  • Expiration time is always 3600? => My implementation needs to "save token call for later" so with this scenario I was generating my token like this:
    Date of call in Timestamp + current time in Timestamp and this is not working. Then i tried to assign 1 year durationin timestamp (I know it's exagerated, it was only testing purposes)
    So my question is: if I should generate my token with 3600 as duration and not save this token in DB and instead use it once per "connection"=> (video call with one hour duration) because it's useless after.
    Correct me if I'm wrong or give me some advice.
    Thanks in advance

Ruby gem

I see you've setup a Ruby gemspec for agora_dynamic_key and have referenced rubygems. Do you have plans in the near future to publish this gem there? If it should already be there, I am unable to locate it.

Screen Shot 2020-05-05 at 5 11 15 PM

How to test RtcTokenBuilder?

Is there a way to write tests for RtcTokenBuilder? I want to validate if the parameters are correct, like you can do it with JWTs:

import { verify } from "jsonwebtoken";

it("generates token with valid payload", () => {
        const currentTimestamp = getCurrentTimestampInSec();
        const token = new JitsiJwtGenerator(app_secret, app_id, hostname).generateJwt({
            meetingId: meetingId,
            isJitsiModerator: isModerator,
            expiresInMinutes: 1,
            userName: userName,
            userId: userId,
            groupId: groupId
        });

        const parsedToken = parseToken(token);

        expect(parsedToken.room).equals(meetingId)
        // expect(parsedToken.moderator).equals(isModerator) <-- We test this below
        expect(parsedToken.exp).equals(currentTimestamp + 60)
        expect(parsedToken.context.group).equals(groupId)
        expect(parsedToken.context.user.id).equals(userId)
        expect(parsedToken.context.user.name).equals(userName)
    });

Create dynamic token creation by php code

Hello,
I have use below code but it's not working. I got error "client join failed NO_AUTHORIZED".

include("../src/RtcTokenBuilder.php");

$appID = "d6e3xxxxxxxxxxxxxxxxxxxx990f4e8b";
$appCertificate = "6dbcxxxxxxxxxxxxxxxxxxxx7cf3c92a";
echo $channelName = "7d7236545jh234u6h54n34393460bdda";
$uid = 9854785632;
$uidStr = "9854785632";
echo '
'.$role = RtcTokenBuilder::RolePublisher;
$expireTimeInSeconds = 3600;
echo '
'.$currentTimestamp = (new DateTime("now", new DateTimeZone('UTC')))->getTimestamp();
echo '
'.$privilegeExpiredTs = $currentTimestamp + $expireTimeInSeconds;

$token = RtcTokenBuilder::buildTokenWithUid($appID, $appCertificate, $channelName, $uid, $role, $privilegeExpiredTs);
echo '
Token with int uid: ' . $token . PHP_EOL;

$token = RtcTokenBuilder::buildTokenWithUserAccount($appID, $appCertificate, $channelName, $uidStr, $role, $privilegeExpiredTs);
echo '

Token with user account: ' . $token . PHP_EOL;

Please help us with the resolution of this critical point

successful Joining on live demo but no video

Hi , please help .

i created successfully to host and join a channel , i couldn't get the video to display on the audience side.

i m testing with chrome browser as host and ingconito as audience .

please any help will be appreciated

Invalid Token

I try this class to create a token :

https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/csharp/src/AgoraIO/Media/DynamicKey4.cs

    public static string GenerateMediaChannelKey() //throws Exception
    {
        String appID = "xxxxxxxx";
        String appCertificate = "xxxxxxxx";
        String channel = "1234";

        int ts = GetTime(); // The timestamp, represented by the number of seconds elapsed since 1 / 1 / 1970
        int r = new Random().Next();
        string uid = 0.ToString();
        int expiredTs = 0; //Call Expiration Timestamp , 0 for no limit

        return DynamicKey4.generateMediaChannelKey(appID, appCertificate, channel, ts, r, uid, expiredTs);
    }

    public static int GetTime()
    {
        var ts = DateTime.UtcNow - new DateTime(1970, 1, 1);
        return (int)ts.TotalSeconds;
    }

I get this error on console

Agora-SDK [ERROR]: [B643A] Get server node failed [NO_AUTHORIZED] https://webrtc2-ap-web-1.agora.io/api/v1 NO_AUTHORIZED

When i create a temp token from console.agora.io is working without error.

Follow go modules rule, import path should be domain format

Hi,
We're using Agora's Go SDK and we're now migrating our code from vendor to go modules since golang 1.14 had been released and go modules now is official on production.

Note that, from golang 1.13, requires that all import path should start with a domain.
For example, RtcTokenBuilder import accesstoken should be:

github.com/AgoraIO/DynamicKey/AgoraDynamicKey/go/src/AccessToken

not simple accesstoken, even it's an internal package.
https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/go/src/RtcTokenBuilder/RtcTokenBuilder.go#L4

Would you please revise Golang's SDK for following the rules? Thank you very much!

Reference: https://blog.csdn.net/qq_23109825/article/details/103604685

Suggestion: Tag your releases

Would be great if you could tag your releases. This way I, as a user, can easily see changes introduced and decide whether I like to deploy that new version or not.

无力吐槽github下载极慢,文件又太大,文档中链接404!

404了

PHP
https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/php/src/SimpleTokenBuilder.php
https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/php/src/AccessToken.php

用阿里云ecs机器 git clone 10kb每秒.. 这得下到猴年马月

为啥不每个语言弄个下载包?

为啥没有composer版本?

CAN_NOT_GET_GATEWAY_SERVER

I generate token with php
But When I use it in the video call get this error
https://share.getcloudapp.com/GGu6B7eX

Code tedails
https://share.getcloudapp.com/6quQobA4

Token generated
Token with int uid:
006bd8bb407beab44c3b5c09579820716a2IACaoDsMG7kqVN3gczWqBcs5Y0PPg0RB9CfXk6p3VhmA/gx+f9hiBTIMIgCOQ5IFHvtBYAQAAQCut0BgAwCut0BgAgCut0BgBACut0Bg
Token with user account:
006bd8bb407beab44c3b5c09579820716a2IACLD/sILkveQhcGYxeK04BIifb1l+1D735ujSYAgA1w/gx+f9hiBTIMIgDIrKEEHvtBYAQAAQCut0BgAwCut0BgAgCut0BgBACut0Bg

使用SimpleTokenBuilder生成的token不能用

根据官方的token generator文档,文档中参考了github上的路径为(agoraIO/toolsDynamicKey/AgoraDynamicKey/java)的代码,生成的token不可用。
操作步骤:
1.运行sample(sample/io/agora/media/sample/)下的BuilderTokenSimple生成token。
2.运行路径为(Basic-Audio-Call/One-to-One-Voice/Agora-Android-Voice-Tutorial-1to1)的安卓项目,(appId和token都已经设置好了),看不到视频界面。
3.使用官网提供的临时token,一切正常。

不知道原因在哪,希望大神们给点意见

How to generate dynamic AccessToken for voice calling in java

How to generate dynamic AccessToken for voice calling in java agora.io

I generated successfully but that's not working

image

code
AccessToken accessToken = new AccessToken(context.getString(R.string.agora_app_id),APP_CERTIFICATE,CHANNEL_NAME,UUID_ID); accessToken.addPrivilege(AccessToken.Privileges.kJoinChannel,(int)(System.currentTimeMillis() / 1000 + 40000)); accessToken.addPrivilege(AccessToken.Privileges.kPublishAudioStream,(int)(System.currentTimeMillis() / 1000 + 40000)); token = accessToken.build();

My generated token results in `invalid token, authorized failed`

When I generate a token for a web call in the agora.io web console I can run the call normally.
But I can't create a web call using my own generated token.

This is the code I used:

new RtcTokenBuilder().buildTokenWithUid(
      "my app id",          // copied from console
      "my app certificate", // copied from console
      "channel name",       // channel name
      12345,                // uid
      RtcTokenBuilder.Role.Role_Admin, // I used this one, I also tried null; Didn't work.
      (int)(System.currentTimeMillis() / 1000 + 3600));

This is the error that I got:

AgoraRTCError CAN_NOT_GET_GATEWAY_SERVER: invalid token, authorized failed

I made some searching and people told that I must ensure that I use the same channel name. Well I do, I use the same channel name. And the same app ID too.

I use Java SDK.

Java 使用官方案例生成token之后,IOS无法使用

使用官方文档生成token(使用string 类型的 uid),在IOS端没办法建立连接;
后面通过将传递的string类型的uid干掉,传入默认值0解决问题;另外IOS端建立连接不能使用string类型的uid;该方法是不是有问题。

rtm的Node签名,Role取值问题

Node签名中,
但是服务端代码
https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/nodejs/src/RtmTokenBuilder.js
这里这么写的
const Role = {
Rtm_User: 1
}
这个部分是rtm的签名功能。
那么
https://docs.agora.io/cn/Real-time-Messaging/rtm_token?platform=All%20Platforms
这里写着“ privilege :RTM Client 暂时只支持一种角色,将该值设为 1000”
这两个说的是一回事吗?这个取值怎么理解?
另外rtm目前也会有客户端那边需要renew token的问题嘛?这个我在两边的文档上都没看到解释。

Getting: Get server node failed [NO_AUTHORIZED] when tried to use a token created from Server [Golang]

Hi Team,

I tried creating the token with UUID using the Golang library as below:

package main

import (
	"fmt"
	rtctokenbuilder "github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src/RtcTokenBuilder"
	"github.com/google/uuid"
)

func main() {

	appId := "<app-id>"
	appCertificate := "<app-secret>"

	result, err := rtctokenbuilder.BuildTokenWithUID(appId, appCertificate, "one1", uuid.New().ID(), rtctokenbuilder.RoleAttendee, 0)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Printf("Token with userAccount: %s\n", result)
	}
}

I got the token successfully too, but when I tried to verify it using the UI available: https://webdemo.agora.io/agora-web-showcase/examples/Agora-Web-Tutorial-1to1-Web, I am getting NOT_AUTHORIZED error as below:

00:20:26:928 Agora-SDK [ERROR]: [8AB3F] Get server node failed [NO_AUTHORIZED] https://webrtc2-ap-web-1.agora.io/api/v1 NO_AUTHORIZED (attached the screenshot for the reference as well)

Screenshot 2020-07-04 at 12 25 36 AM

For reference, I took the appId and appCertificate from here, attached in the screenshot:
Screenshot 2020-07-04 at 12 22 53 AM

Could anybody help me, what is going wrong here? What is the solution to fix this issue?

Add more detailed guides in ReadMe for Csharp.

Could you please add the following lines to Csharp sample code ReadMe? Customer firstly hits the issues easily.
1- There are 2 different classes, one to generate key and another one to generate token (generated token start with 006)
2- UID string parameter preferred to be sent as empty string.
3- TS (time stamp) should be for next day or at least after 2 or 3 hours from now time stamp.

Can a person without Camera join video conferencing?

Network not connected

When a user does not have camera on his system or he does not choose to allow the camera, then the connection is not established and stream does not work.

We want the stream to show only audio in case the viewing audience does not have camera at his end.

We tried below:

You can use our troubleshooting guide to test the camera and detect if it is there. [https://webdemo.agora.io/agora_webrtc_troubleshooting/]

If it is not there, then you would just set audio to true and video to false. For example, in the create stream, see below.

var localStream = AgoraRTC.createStream({
audio:
true,
video:
false});

But this above method is not working. When we try to join with audio true and video false, then an error is coming and user is not able to join the stream.

This is getting very urgent and we are getting for any resolution in ticket as well from exact 1 month now.

TypeScript support

Hi guys!

I think it would be better to have TypeScript support
Do you plan to support TypeScript?

Best regards.

NO_AUTHORIZED error

Hello i'm trying to use nodejs package to generate token for agora service, when i'm trying with values from example it works fine, in particular when property user id filled with value 2882341273 i receive succesfull response (token generated correctly), but when i'm trying to switch to usage of ids from our own database it creates an issue (you can see example error below):

backend.js:1 10:05:49:744 Agora-SDK [ERROR]: [5D242] Get server node failed [NO_AUTHORIZED] https://webrtc2-ap-web-1.agora.io/api/v1 NO_AUTHORIZED

This is value that supplied instead of mentioned above a number:

0|main | 24-09-2019 03:05:47.860 36384 info: [agoraToken] uid 5d2a9678af39ea5d7d1855ba

Please let me know if you have any suggestions on how this problem can be avoided. Appreciate your work. Thank you.

'str' object has no attribute 'decode' in generateMediaChannelKey Python3

Hey team,

I'm making a share screen functionality, as per the documentation https://docs.agora.io/en/Interactive%20Broadcast/screensharing_web?platform=Web

To do that we required channelKey in this function
screenClient.join(channelKey, channel, null, function(uid) {...

Then I followed how to obtain a channel key (https://docs.agora.io/en/Agora%20Platform/channel_key?platform=All%20Platforms)

I'm using Python3 and created a file dynamickey5.py
if I pass uid=123 in generateMediaChannelKey function
screenshare_key = generateMediaChannelKey(appID, appCertificate, channel_name, unixts, randomint, uid, 0)
then this error occur
an integer is required (got type str)

and if I pass uid as int(uid)
screenshare_key = generateMediaChannelKey(appID, appCertificate, channel_name, unixts, randomint, int(uid), 0)
then this error occurs
'str' object has no attribute 'decode'

Help!

nodejs error

I got this error😰

Metro has encountered an error: While trying to resolve module `crypto` from file `/Users/yamaguchikeiichi/Downloads/TowerWord/node_modules/agora-access-
token/src/AccessToken.js`, the package 

`/Users/yamaguchikeiichi/Downloads/TowerWord/node_modules/crypto/package.json` was 
successfully found. However, this package itself specifies a `main` module field that could not be 
resolved (`/Users/yamaguchikeiichi/Downloads/TowerWord/node_modules/crypto/index.js`. 

Indeed, none of these files exist:


  * /Users/yamaguchikeiichi/Downloads/TowerWord/node_modules/crypto/index.js(.native|.ios.jsx|.native.jsx|.jsx|.ios.js|.native.js|.js|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.json|.native.json|.json)
  * /Users/yamaguchikeiichi/Downloads/TowerWord/node_modules/crypto/index.js/index(.native|.ios.jsx|.native.jsx|.jsx|.ios.js|.native.js|.js|.ios.ts|.native.ts|.ts|.ios.tsx|.native.tsx|.tsx|.ios.json|.native.json|.json)

Python 3 Generated Token invalid when trying to login to RTM in flutter app

Hey guys,

I generated the RTM token on Python 3 and it generates the below:

Rtm Token: 006c2b49a24589e49b484150e765ae1e694IADuBOdsM+tXvWJe9ESKJpFu0w/5hZ/HbfLw60A7uhVeiWW5wpAAAAAAEADKkbMFnYFOYAEA6AMtPk1g

But then trying to login on my Flutter App I get the below:

Login error code 5.

I double checked the userid are the same when creating the token and when loging in.

大神在么,能帮忙看下 go生成token的问题么

我这边用go生成token,不知道为何,token中总是有空格。
然后传递给flutter端,然后加入频道失败。
下边是我的go代码
image

这是 用这些代码生成的token:
00679ac8152c1394babaf20f341ad76e04cIACcj7qfrVmNJJW/lDpwiq8z0wMp45CSt UlUpLBOT7M8uuR0YQAAAAAIgAzFjECH/QGXgQAAQAAAAAAAgAAAAAAAwAAAAAABAAAAAAA
这是 flutter收到的token打印的log:
image
感觉go后端生成的token其中不知道为何增加了个换行,
手机端flutter这边获得到的就是个带有空格的token。
就加入频道一直失败了

php create access token without uid

How can I create access token without uid. I want to give it multiple user to access channel. Currently I'm building with this but here I've to give int uid but I want to build without uid
RtcTokenBuilder::buildTokenWithUid(
env('AGORA_APP_ID'),
env('AGORA_APP_CERTIFICATE'),
$channelName,
$uid,
RtcTokenBuilder::RoleAttendee,
$privilegeExpiredTs
);

RTM Token samples missing channelName

When calling the buildToken method with all the required arguments downloaded from: https://github.com/AgoraIO/Tools/blob/master/DynamicKey/AgoraDynamicKey/php/src/RtmTokenBuilder.php

$token is always null

and then the next line fails because $token is null

$token->addPrivilege($Privileges["kRtmLogin"], $privilegeExpireTs);

buildToken calls AccessToken::init without a channelName while the method requires a channeName in the function definition.

The same issue exists in your python3 and javascript samples in the master branch.

Even after fixing this issue, now I am getting an error when calling rtm api join.
RTM:ERROR Error Code 5. Signature verification failed.

Error 110 Token Generate C#

Hi!

I was trying to test the token creator but when i generate a token with this it doesn't work, please help!

private string _appId = "xxxxxxxxxxxxx";
private string _appCertificate = "xxxxxxxxxxx";
private string _channelName = "123456789";
private string _uid = "7894561230";
private uint _ts = (uint)DateTimeOffset.Now.ToUnixTimeSeconds();
private uint _salt = 1;
private uint _expiredTs = 1611537276;

    [Fact]
    public void testGenerateDynamicKey()
    {
        _expiredTs = _ts + 10000;

        AccessToken token = new AccessToken(_appId, _appCertificate, _channelName, _uid);

        token.addPrivilege(Privileges.kJoinChannel, _expiredTs);
        string result = token.build();
       // Assert.Equal(expected, result);
    }

php生成rtctoken

public static function buildTokenWithUid($appID, $appCertificate, $channelName, $uid, $role, $privilegeExpireTs){
    return RtcTokenBuilder::buildTokenWithUserAccount($appID, $appCertificate, $channelName, $uid, $role, $privilegeExpireTs);
}

这个RtcTokenBuilder类的方法buildTokenWithUid同样还是调用buildTokenWithUserAccount,那这区别在哪里?为啥用两个方法?

110 token is invalid

I'm getting "110 token is invalid" but when I created from agora console (agora temp token is working) and when I created from source code example of PHP.

-appid
-app certificate
-channelName
-uid
===>I'm using 'Token with int uid: '

how to implement join channel from android side

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.