Giter Club home page Giter Club logo

leetcode-sync's Introduction

LeetCode Sync

GitHub Action for automatically syncing LeetCode submissions to a GitHub repository.

Features

  • Syncs accepted solutions from LeetCode to the default branch of the GitHub repo
  • Only syncs solutions that have not been synced before
  • Uploads the latest accepted solution for a single problem if there are multiple submissions per day

How to use

  1. Login to LeetCode and obtain the csrftoken and LEETCODE_SESSION cookie values.

    • After logging in, right-click on the page and press Inspect.
    • Refresh the page.
    • Look for a network request to https://leetcode.com.
    • Look under Request Headers for the cookie: attribute to find the values.
  2. Create a new GitHub repository to host the LeetCode submissions.

    • It can be either private or public.
  3. Add the values from step 1 as GitHub secrets, e.g. LEETCODE_CSRF_TOKEN and LEETCODE_SESSION.

  4. Go to REPO > settings > actions and in Workflow Permissions section give actions Read and Write permissions.

  5. Add a workflow file with this action under the .github/workflows directory, e.g. sync_leetcode.yml.

    Example workflow file:

    name: Sync Leetcode
    
    on:
      workflow_dispatch:
      schedule:
        - cron: "0 8 * * 6"
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Sync
            uses: joshcai/[email protected]
            with:
              github-token: ${{ github.token }}
              leetcode-csrf-token: ${{ secrets.LEETCODE_CSRF_TOKEN }}
              leetcode-session: ${{ secrets.LEETCODE_SESSION }}
              destination-folder: my-folder
              verbose: true
              commit-header: "[LeetCode Sync]"
  6. After you've submitted a LeetCode solution, run the workflow by going to the Actions tab, clicking the action name, e.g. Sync Leetcode, and then clicking Run workflow. The workflow will also automatically run once a week by default (can be configured via the cron parameter).

Inputs

  • github-token (required): The GitHub access token for pushing solutions to the repository
  • leetcode-csrf-token (required): The LeetCode CSRF token for retrieving submissions from LeetCode
  • leetcode-session (required): The LeetCode session value for retrieving submissions from LeetCode
  • filter-duplicate-secs: Number of seconds after an accepted solution to ignore other accepted solutions for the same problem, default: 86400 (1 day)
  • destination-folder (optional): The folder in your repo to save the submissions to (necessary for shared repos), default: none
  • verbose (optional): Adds submission percentiles and question numbers to the repo (requires an additional API call), default: true
  • commit-header (optional): How the automated commits should be prefixed, default: 'Sync LeetCode submission'

Shared Repos

Problems can be routed to a specific folder within a single repo using the destination-folder input field. This is useful for users who want to share a repo to add a more social, collaborative, or competitive aspect to their LeetCode sync repo.

Contributing

Testing locally

If you want to test changes to the action locally without having to commit and run the workflow on GitHub, you can edit src/test_config.js to have the required config values and then run:

$ node index.js test

If you're using Replit, you can also just use the Run button, which is already configured to the above command.

Adding a new workflow parameter

If you add a workflow parameter, please make sure to also add it in src/test_config.js, so that it can be tested locally.

You will need to manually run:

$ git add -f src/test_config.js

Since this file is in the .gitignore file to avoid users accidentally committing their key information.

FAQ

Job fails with "HttpError: API rate limit exceeded for installation ID <id>"

This likely means that you hit a rate limit when committing to GitHub (this may happen if you have over ~300 submissions initially). Since the syncer writes in reverse chronological order, it should pick up syncing submissions from where it left off on the next run of the workflow, so just retry the workflow manually after some time.

Job fails with "HttpError: Resource not accessible by integration"

This means the github token you're using does not have permission to write to your repo. If you're using the default github.token method follow the instructions [here] (https://docs.github.com/en/actions/security-guides/automatic-token-authentication)

Acknowledgements

Special thanks to the following people who helped beta test this GitHub Action and gave feedback on improving it:

leetcode-sync's People

Contributors

actions-user avatar alyhg avatar atvaccaro avatar cherrykatatonic avatar cupofme avatar danmacode avatar darshan-as avatar dependabot[bot] avatar harpreetsingh91 avatar humble-barnacle001 avatar jaspinderkohli avatar jimit105 avatar joshcai avatar mayureshd-18 avatar mdakram28 avatar ravibrock avatar shan1y avatar siriscmv 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

leetcode-sync's Issues

Leetcode now has challenge page

Request to the leetcode API always return 403 status.

Below is the sample response. I tried to bypass it by modifying and adding some http headers, but still got the 403 error.
image

The script only sync latest session

Hello, I have 3 sessions in my account, and after running the script. Only the latest session get synced.
By session, I mean Leetcode's session. On the right hand side of the problems page, you can see it
image
Currently I have solved 90 Qs in this session. Previously I have solved 200+ and 400+ in older sessions
image
But only 90 Qs in the latest session get synced.
I have tried switching session, and then copy LEETCODE_SESSION and csrftoken then run the script. But seems like it doesn't work.

[Fri, 22 Sep 2023 03:42:43 GMT] Getting submission from LeetCode, offset 0
[Fri, 22 Sep 2023 03:42:44 GMT] Default branch for hucancode/lc: master
[Fri, 22 Sep 2023 03:42:44 GMT] Syncing 0 submissions...
[Fri, 22 Sep 2023 03:42:44 GMT] Done syncing all submissions.

No Longer Have LC Premium - Issue Committing Locked Problems

Context: I bought one month of LC premium for an interview a few months ago. Cancelled the premium subscription after the interview, but I did a few locked problems during that time. I no longer have LC premium but I still LeetCode regularly. My tasks were failing and I finally got the chance to look into why:

image

It seems the HTTP request to the locked "Meeting Rooms" problem is failing because the problem is now locked for me even though I've already solved it (I think this is why my LC count on my profile went down as well lol).

Any way to kind of "skip" locked problems in this case so that other problems can get synced? I am assuming there's no way to get locked problem solutions in my case unless I rebuy LC premium.

TypeError: response.data.data.submissionList.submissions is not iterable

I followed the README.md guide and got this error "TypeError: response.data.data.submissionList.submissions is not iterable", I'm using the latest version of joshcai/[email protected].

here is my .yml:
name: Sync Leetcode

on:
workflow_dispatch:
schedule:
- cron: '0 23 * * *'
jobs:
build:
runs-on: ubuntu-latest

steps:
  - name: LeetCode Sync
    uses: joshcai/[email protected]
    with:
      github-token: ${{ github.token }}
      leetcode-csrf-token: ${{ secrets.csrftoken }}
      leetcode-session: ${{ secrets.LEETCODE_SESSION }}
      destination-folder: my-folder
      verbose: true
      commit-header: '[LeetCode Sync]'

uses

can you provide me demo video that how to use , I am trying but not able to use

Feature request: Improve the git commit

  • Can you improve the commit message to include the time and space complexity?

  • Question Description

  • Notes that were taken in leetcode

  • Companies these questions were asked (if the companies section is unlocked)

Error: Request failed with status code 403

The github action used to work without issues until a while ago, where I keep getting this error, even after updating my LEETCODE_SESSION token.

I ran it as both a workflow on Github several times, as well as locally on my pc. I'm getting the same error both ways.

(node:41200) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
[Mon, 18 Mar 2024 18:47:34 GMT] Getting submission from LeetCode, offset 0
[Mon, 18 Mar 2024 18:47:34 GMT] Error: Request failed with status code 403
    at createError (/home/leetcode-sync/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/home/leetcode-sync/node_modules/axios/lib/core/settle.js:17:12)
    at IncomingMessage.handleStreamEnd (/home/leetcode-sync/node_modules/axios/lib/adapters/http.js:269:11)
    at IncomingMessage.emit (node:events:531:35)
    at endReadableNT (node:internal/streams/readable:1696:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

Has anyone else been facing this issue?

Request failed with Status code 401

Hi Josh!
I have been using Leetcode-sync for past month. And it's great.
From few days , my jobs have been failing, I thought maybe it was because my Leetcode csrf token had expired.
But when I update the token today and re run the job , it's failing again.
I am attaching the screenshot of the error I am encountering.
Can you please take a look.
failing

Thanks and regards

Error: Request failed with status code 500

I used to run the action successfully. but recently I always get this error.

[Wed, 28 Dec 2022 10:29:13 GMT] Getting submission from LeetCode, offset 0
[Wed, 28 Dec 2022 10:29:14 GMT] Getting submission from LeetCode, offset 20
[Wed, 28 Dec 2022 10:29:16 GMT] Error fetching submissions, retrying in 1 seconds...
[Wed, 28 Dec 2022 10:29:17 GMT] Error fetching submissions, retrying in 3 seconds...
[Wed, 28 Dec 2022 10:29:21 GMT] Error fetching submissions, retrying in 9 seconds...
[Wed, 28 Dec 2022 10:29:31 GMT] Error fetching submissions, retrying in 27 seconds...
[Wed, 28 Dec 2022 10:29:59 GMT] Error fetching submissions, retrying in 81 seconds...
[Wed, 28 Dec 2022 10:31:21 GMT] Error: Request failed with status code 500
at createError (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/node_modules/axios/lib/core/createError.js:16:15)
at settle (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/node_modules/axios/lib/adapters/http.js:269:11)
at IncomingMessage.emit (node:events:402:35)
at endReadableNT (node:internal/streams/readable:1343:12)
at processTicksAndRejections (node:internal/process/task_queues:83:21)
Error: Error: Request failed with status code 500

Too many submissions cause rate limit error from Leetcode API: 403

I have lots of submissions on Leetcode; so the action fails after ~480 submission fetched from their API:

Getting submission from LeetCode, offset 0
Getting submission from LeetCode, offset 20
Getting submission from LeetCode, offset 40
Getting submission from LeetCode, offset 60
Getting submission from LeetCode, offset 80
Getting submission from LeetCode, offset 100
Getting submission from LeetCode, offset 120
Getting submission from LeetCode, offset 140
Getting submission from LeetCode, offset 160
Getting submission from LeetCode, offset 180
Getting submission from LeetCode, offset 200
Getting submission from LeetCode, offset 220
Getting submission from LeetCode, offset 240
Getting submission from LeetCode, offset 260
Getting submission from LeetCode, offset 280
Getting submission from LeetCode, offset 300
Getting submission from LeetCode, offset 320
Getting submission from LeetCode, offset 340
Getting submission from LeetCode, offset 360
Getting submission from LeetCode, offset 380
Getting submission from LeetCode, offset 400
Getting submission from LeetCode, offset 420
Getting submission from LeetCode, offset 440
Getting submission from LeetCode, offset 460
Getting submission from LeetCode, offset 480
##[error]Error: Request failed with status code 403

Can we have another argument in the action inputs to specify maximum number of submissions we want to fetch for each action?

Thanks!

Issue with Github token

My action fails and from the screenshot I see that it is able to connect to Leetcode, but it fails on the commit step, which probably means the GitHub token is not configured correctly?

Screen Shot 2020-10-03 at 3 48 41 PM

Action doesn't recognize Oracle as a valid language

Language oraclesql does not have a registered extension.

The mapping for Oracle SQL submissions is missing.
Should be an easy fix, just need to change the mapping to:

const LANG_TO_EXTENSION = {
  'bash': 'sh',
  'c': 'c',
  'cpp': 'cpp',
  'csharp': 'cs',
  'golang': 'go',
  'java': 'java',
  'javascript': 'js',
  'kotlin': 'kt',
  'mysql': 'sql',
  'oraclesql': 'sql', //Added this
  'php': 'php',
  'python': 'py',
  'python3': 'py',
  'ruby': 'rb',
  'rust': 'rs',
  'scala': 'scala',
  'swift': 'swift',
};

Suggestion : Logging the error and then skipping the file may be a better way to handle it, instead of failing the Action at this point.

HttpError: tree.path contains a malformed path component

Hi Josh ๐Ÿค
Trying to configure and run a workflow, but I get this error:

Sync Leetcode ยท wmorgueleetcode-swift-solution@f641ca5

2022-09-14T08:08:28.0241799Z Download action repository 'joshcai/[email protected]' (SHA:2016e49c7853566842db62462b1e52e8c301cbe2)
2022-09-14T08:08:29.7598717Z ##[group]Run joshcai/[email protected]
2022-09-14T08:08:29.7599196Z with:
2022-09-14T08:08:29.7599817Z   github-token: ***
2022-09-14T08:08:29.7600424Z   leetcode-csrf-token: ***
2022-09-14T08:08:29.7616341Z   leetcode-session: ***
2022-09-14T08:08:29.7616747Z   destination-folder: src/
2022-09-14T08:08:29.7617127Z   filter-duplicate-secs: 86400
2022-09-14T08:08:29.7617430Z ##[endgroup]
2022-09-14T08:08:30.5020860Z [Wed, 14 Sep 2022 08:08:30 GMT] Getting submission from LeetCode, offset 0
2022-09-14T08:08:30.8912716Z [Wed, 14 Sep 2022 08:08:30 GMT] Getting submission from LeetCode, offset 20
2022-09-14T08:08:32.4256574Z [Wed, 14 Sep 2022 08:08:32 GMT] Default branch for wmorgue/leetcode-swift-solution: main
2022-09-14T08:08:32.4257183Z [Wed, 14 Sep 2022 08:08:32 GMT] Syncing 5 submissions...
2022-09-14T08:08:32.4257542Z [Wed, 14 Sep 2022 08:08:32 GMT] Committing solution for fizz_buzz...
2022-09-14T08:08:32.8695884Z [Wed, 14 Sep 2022 08:08:32 GMT] HttpError: tree.path contains a malformed path component
2022-09-14T08:08:32.8696886Z     at /home/runner/work/_actions/joshcai/leetcode-sync/v1.4/node_modules/@octokit/request/dist-node/index.js:66:23
2022-09-14T08:08:32.8697535Z     at processTicksAndRejections (internal/process/task_queues.js:97:5)
2022-09-14T08:08:32.8698540Z     at async commit (/home/runner/work/_actions/joshcai/leetcode-sync/v1.4/index.js:70:24)
2022-09-14T08:08:32.8699838Z     at async sync (/home/runner/work/_actions/joshcai/leetcode-sync/v1.4/index.js:241:34)
2022-09-14T08:08:32.8700766Z     at async main (/home/runner/work/_actions/joshcai/leetcode-sync/v1.4/index.js:255:3)
2022-09-14T08:08:32.8762453Z ##[error]HttpError: tree.path contains a malformed path component

sync_leetcode.yml:

name: Sync Leetcode

on:
  workflow_dispatch:
  schedule:
    - cron:  '0 9 * * *'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Sync
      uses: joshcai/[email protected]
      with:
        github-token: ${{ github.token }}
        leetcode-csrf-token: ${{ secrets.LEETCODE_CSRF_TOKEN }}
        leetcode-session: ${{ secrets.LEETCODE_SESSION }}
        destination-folder: src/

Feedback to GitHub Action

As I was going to this repository for syncing LeetCode and GitHub, this approach for doing that is little bit difficult for the beginners who don't know more about CSRF tokens and session, cookies etc. And, also everytime if I have to push after solving the problem, I have to run workflow to push on that exact time(It runs every week though).

We can go with extension to do so:-

  1. Push the exact code inside folder(which include read.me and .cpp file)
  2. If have multiple submission, push the code in same folder with date and time of submission.
  3. Putting all the details of submission there.

Can work on this, @joshcai align with way of putting things together.

I know most of the features are from LeetHub chrome extension, but that extension is facing issue with new version of Leetcode.

Error getting info for submission

TypeError: Cannot read properties of null (reading 'toFixed')
    at getInfo (/home/runner/work/_actions/joshcai/leetcode-sync/v1.6/dist/index.js:14581:89)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async getInfo (/home/runner/work/_actions/joshcai/leetcode-sync/v1.6/dist/index.js:14609:10)
    at async Object.sync (/home/runner/work/_actions/joshcai/leetcode-sync/v1.6/dist/index.js:14902:18)
    at async main (/home/runner/work/_actions/joshcai/leetcode-sync/v1.6/dist/index.js:19564:3)
Error: TypeError: Cannot read properties of null (reading 'toFixed')

Quick debug it's get getinfo function, probably that the percentiles are of a different type than expected

Can extract only the lastest Leetcode session submissions, not previous sessions

Hi @joshcai - Thanks for this powerful tool, it's THE ONE I am keen to look for!!! However, current Leetcode has a feature: can create different sessions to practice. I cannot extract all my submissions from leetcode because they belongs to different sessions. I've tried several days, can only get the records of the latest session, not API limits issue.

Can you help? Thanks a lot in advance!

clarification on running manual workflow

Created a pull request for this. Added some more details in ReadMe about importance of manually running workflow to achieve a daily contribution after LeetCode submission. This would be my first open source contribution.

Post submissions to Discuss

This is a suggestion to automatically post the uploaded latest accepted submissions to their problem Discuss forum.

Language pythondata does not have a registered extension.

Sample submission: https://leetcode.com/problems/big-countries/submissions/1009035243/?envType=study-plan-v2&envId=30-days-of-pandas&lang=pythondata

Sample Build failure: https://github.com/jimit105/leetcode-submissions/actions/runs/5722479087/job/15505595185

Logs:

[Tue, 01 Aug 2023 04:11:03 GMT] Getting submission from LeetCode, offset 0
[Tue, 01 Aug 2023 04:11:04 GMT] Default branch for jimit105/leetcode-submissions: main
[Tue, 01 Aug 2023 04:11:04 GMT] Syncing 1 submissions...
[Tue, 01 Aug 2023 04:11:04 GMT] Committing solution for big_countries...
[Tue, 01 Aug 2023 04:[11](https://github.com/jimit105/leetcode-submissions/actions/runs/5722479087/job/15505595185#step:2:12):04 GMT] undefined
Error: Language pythondata does not have a registered extension.

Error: Error: Request failed with status code 401

Sorry! After I follow your tutorial, I always get this error and I don't know how to deal with it.
image
sync_leetcode.yml

# This is a basic workflow to help you get started with Actions

name: Sync Leetcode

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  # cron: 'min hour day month week (year)'
  workflow_dispatch:
  schedule:
    - cron:  '5 * * * *'

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      # - uses: actions/checkout@v3

      # Runs a single command using the runners shell
      # - name: Run a one-line script
      #   run: echo Hello, world!

      # # Runs a set of commands using the runners shell
      # - name: Run a multi-line script
      #   run: |
      #     echo Add other actions to build,
      #     echo test, and deploy your project.
      - name: Sync
        uses: joshcai/[email protected]
        with:
          github-token: ${{ github.token }}
          leetcode-csrf-token: ${{ secrets.LEETCODE_CSRF_TOKEN }}
          leetcode-session: ${{ secrets.LEETCODE_SESSION }}
          destination-folder: my-folder
# 

image
And these file's contents are:
image
I don't know what went wrong.

Thank you for your help!

LeetCode Session Expiry


name: LeetCode Session Token Refresh
about: Request to refresh the LeetCode session token for GitHub Actions workflow


Issue Description

Problem

After two weeks or roughy 13-14 days the action fails with the error Error: Request failed with status code 401
image

Current Configuration

LEETCODE_SESSION (which expires most probably has an expiry)

Potential Solutions

  1. Automate session refresh
  2. Check for expiration and notify

HttpError: Resource not accessible by integration

Run joshcai/[email protected]
[Tue, 10 Jan 2023 01:31:51 GMT] Getting submission from LeetCode, offset 0
[Tue, 10 Jan 2023 01:31:51 GMT] Default branch for ZyLyao/My-Leetcode-Practice: main
[Tue, 10 Jan 2023 01:31:51 GMT] Syncing 3 submissions...
[Tue, 10 Jan 2023 01:31:51 GMT] Committing solution for add_two_integers...
[Tue, 10 Jan 2023 01:31:51 GMT] HttpError: Resource not accessible by integration
at /home/runner/work/_actions/joshcai/leetcode-sync/v1.5/node_modules/@octokit/rest/node_modules/@octokit/request/dist-node/index.js:88:21
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async commit (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/src/action.js:69:24)
at async Object.sync (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/src/action.js:240:34)
at async main (/home/runner/work/_actions/joshcai/leetcode-sync/v1.5/index.js:31:3)
Error: HttpError: Resource not accessible by integration

Duplicate commits

  • Every time the action runs, it creates commits for every single submission, even the ones that are already on the repo.
  • So it ends up creating a bunch of "ghost" commits with 0 additions and 0 deletions every time it runs
  • For example, if i have 10 submissions in total, and 5 of them were already synced yesterday, when the action runs again today, it will create 5 "ghost" commits.
  • This pollutes the commit history and also inflates the contribution graph which is undesirable personally

Is there a better way to go about this?

Problem with running workflow file

I have followed all these steps as described in the README file, but I keep getting this error.

build
Can't find 'action.yml', 'action.yaml' or 'Dockerfile' under '/home/runner/work/_actions/somixyz/leetcode_solutions/v1.0'. Did you forget to run actions/checkout before running your local action?

What should I do here ?

csrf expired, Error: Request failed with status code 401

Error: Request failed with status code 401
This error happens every few days. Every time this error happens I need to login to Leetcode and manually fetch the latest csrf token and update LEETCODE_CSRF_TOKEN.

Is there any other way to automatically update this token?

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.