Coder Social home page Coder Social logo

discordbot's Introduction

DiscordBot

DiscordBot is a free, open-source, extensible bot for Discord servers, built on top of discord.js. This bot is generally self-hosted either on a dedicated server (like a Raspberry pi) or general cloud hosting like AWS etc. You can think of this bot as privacy focused as you are in total control of the code, so you can be sure that your information is secure.

Features:

This bot has been in development since 2015 and has accumulated a ton of commands. Here are a few highlights:

General Commands

  • !help [command] -> Lists all commands or just help for one command.
  • !gif query -> Returns a gif connected to search query. Example = !gif dogs
  • !image query -> Returns an image from Google Images (careful, no adult filter) Example: !image dogs
  • !youtube query -> Returns a youtube link. Example: !youtube Fortnite
  • !wiki query -> Returns the summary of the first search result on Wikipedia.
  • !wolfram query -> Queries Wolfram Alpha for results.
  • !meme memetype "text1" "text2" => Returns a meme image. notice the quotes around text, they are vitally important!
  • !say text -> Make the bot say text, useful mostly in combination with alias.
  • !alias -> Create custom shorthand commands in Discord!
  • !invite -> Generates an invite link for the Bot to join the requested server, easy way to get the bot in multiple servers.
  • !twitch -> pulls info on a twitch streamer
  • !stock -> check a ticker value
  • Channel management!

do !help to get all the availble commands. Submissions for new generic commands are welcome. A lot of code is submitted and merged from users if it seems interesting enough but is not actively maintained by the main contributors so please report if you see any suspected bugs ;)

!alias can be very powerful to create shotcuts for other commands or create copypastas. eg !alias tsla stock $TSLA will create a !tsla alias to run "stock $TSLA"

Music Playback Commands

  • !play "text" -> Plays the requested song in voice channel you are in.
  • !play https://www.youtube.com/watch?v=wJelEXaPhJ8 -> Play a youtube song directly. Also supports soundcloud, spotify and a few other platforms.
  • !playlist -> add an entire playlist Supported` Platforms: Youtube, Spotify
  • !pause !resume -> self explanitory
  • !skip -> Skip currently playing song
  • !queue -> The queue of songs
  • !queue -s -> Compact version of queue
  • !shuffle -> shuffles queue
  • !stop_playback -> Clears playlist completelly
  • !dequeue [number] -> The removes song from queue

And much more! Try !help to get a full list of available commands.

Installation

This bot runs on node.js. You will need at least node 12. In order for music playback to work, you will need python and ffmpeg to be present on your system.

Linux

General

Install node 12 or newer, Python, and FFmpeg, along with a C compiler for npm to use.

Run npm install in the bot directory and make sure it passes.

Now set up your auth.json and run npm start or node discord_bot.js to test the bot out!

Ubuntu

First install the needed system dependencies: sudo apt install build-essential nodejs python ffmpeg

Now run node --version and make sure it is v12 or later. If not refer to the node.js download page to get an updated version.

Run npm install in the bot directory and make sure it passes.

Now set up your auth.json and run npm start or node discord_bot.js to test the bot out!

Windows

  1. Install node.js
  2. Install python
  3. Install Visual Studio Community
  4. Install FFmpeg
  5. Open x64 Native Tools Command Prompt for VS 2019 and cd to the bot's folder
  6. Run npm install and make sure it succeeds
  7. Set up your auth.json
  8. Run npm start or node discord_bot.js to test the bot out!

Additional Resources

Tuck 64 was kind enough to make a video walkthrough of the setup process

Setting up

Before the first run you will need to create an auth.json file. A bot token is required. The other credentials are not required for the bot to run, but they are highly recommended as commands that depend on them will not function. See auth.json.example.

Please see this excellent guide for how to create your discord bot's account and get your bot token.

Verify that the bot runs with your config by running npm start.

Running longterm

Once you've setup your keys and checked that the features you want are working, you have a couple of options for running the bot.

Selfhosted

You could run the bot along side everything else on your pc. However it's probably a good idea to run your bot on a separate computer such as a linux server or a Raspberry Pi so it does not interfere with your normal operations and to keep it running even if you were to sleep or shutdown your PC. We would recommend running the bot in "forever" mode. Run npm run forever to start the bot in a process that will restart it on crashes. If you need to stop running it, navigate to the bot installation folder in a terminal and run npx forever stopall. Running the bot in this mode will save error and console logs to err.log and out.log respectively. You can use Notepad or similar to open these files.

Cloud Hosted

There is a number of cloud hosting providers that can run small node.js applications like this. The following have been tested to work, you'll have to extrapolate if you want to use some other provider (AWS, etc)

Running on Heroku

  • Create heroku account, install heroku-cli, create a new Dyno.
  • Git clone the repo and follow the instructions in the Deploy section to setup pushing to heroku
  • Go to settings and setup Config Vars the name of the vars are exactly the same as the auth.json file. You DO NOT need the quotes around the values in config vars
  • Run heroku scale worker=1 in the bot installation directory to run the bot as a worker rather than a webserver.
  • SOME COMMANDS ARE NOT WORKING, I AM WORKING TO FIX THIS.

Running on Repl.it

You will still need to create an auth.json file with your credentials with this process, follow the steps above. Run on Repl.it

FAQ

Music is always saying "invalid video"

You likely need to update youtube-dl. you can do so with node ./node_modules/youtube-dl/scripts/download.js

I don't want some of these commands!

Most of our commands live in the plugins folder, deleting that plugin will easily remove the command. Also see permissions below.

How do I restrict a command to only certain users?

You will need to set up permissions.json. Please see permissions.json.example.

Updates

If you update the bot, please run npm update before starting it again. If you have issues with this, you can try deleting your node_modules folder and then running npm install again. Please see Installation.

RSS

You can create an rss.json file adding rss feeds as commands. See rss.json.example for details.

Special instructions for setting up google search and youtube APIs:

(thanks @SchwererKonigstiger)

  1. Create a Custom Search at: https://cse.google.com/cse/create/new

  2. Leave the first line blank, and name the search engine anything you wish.

  3. Click "Advanced Options" and then type ImageObject.

  4. Hit create.

  5. On this new page, enable the Image Search in the menu.

  6. Then press "Search engine ID" under the Details header.

  7. Copy this into the auth.json's "google_custom_search" section.

Make sure you also have your Google server API key, which is located in the "youtube_api_key" section, or the search will fail.

Help

Please check the GitHub issues page on this project. We get a lot of similar questions, and it is likely that yours has already been answered.

If you still need help, feel free to join us on Discord.

discordbot's People

Contributors

agamswaroop619 avatar bikemaker avatar chalda avatar christoabrown avatar deo-favente avatar dependabot[bot] avatar einarin avatar f9alejandro avatar hgdly avatar igotdrugsidontneedanyfriends avatar kirby561 avatar kyrisx avatar longlius avatar macdja38 avatar nic-w avatar notarin avatar piemadd avatar rexogamer avatar shiburizu avatar thebaconspace avatar themaxkim avatar ulydev avatar william-dickinson avatar zirixcz 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

discordbot's Issues

Can't install: 'no binding.gyp'

node-gyp rebuild [18:48:25] gyp info it worked if it ends with ok gyp info using [email protected] gyp info using [email protected] | linux | x64 gyp info spawn python gyp info spawn args [ '/usr/share/node-gyp/gyp/gyp_main.py', gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp info spawn args 'make', gyp info spawn args '-I', gyp info spawn args '/home/henry/discordbot/build/config.gypi', gyp info spawn args '-I', gyp info spawn args '/usr/share/node-gyp/addon.gypi', gyp info spawn args '-I', gyp info spawn args '/usr/include/nodejs/common.gypi', gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args '-Dvisibility=default', gyp info spawn args '-Dnode_root_dir=/usr/include/nodejs', gyp info spawn args '-Dmodule_root_dir=/home/henry/discordbot', gyp info spawn args '--depth=.', gyp info spawn args '--generator-output', gyp info spawn args 'build', gyp info spawn args '-Goutput_dir=.' ] **gyp: binding.gyp not found (cwd: /home/henry/discordbot) while trying to load binding.gyp** gyp ERR! configure error gyp ERR! stack Error:gypfailed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/share/node-gyp/lib/configure.js:344:16) gyp ERR! stack at ChildProcess.emit (events.js:98:17) gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:820:12) gyp ERR! System Linux 4.0.0-2-amd64 gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild" gyp ERR! cwd /home/henry/discordbot gyp ERR! node -v v0.10.38 gyp ERR! node-gyp -v v0.12.2 gyp ERR! not ok FAIL: 1

Lolwut. npm install dosen't work either.
auth.json is present and configured.

Failed at the [email protected] install script 'node-gyp rebuild'.

npm ERR! [email protected] install: node-gyp rebuild
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script 'node-gyp rebuild'.
npm ERR! This is most likely a problem with the libxmljs package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get their info via:
npm ERR! npm owner ls libxmljs
npm ERR! There is likely additional logging output above.
npm-debug.log.txt

watch2gether feature

a bunch of requests on reddit for this.

basically would !watch2gether <youtube.url>

they dont have an API but i can probably hack around that with some cURL πŸ’ƒ

there are several competitors so can look into those as well.

Multiple permissions?

Hi, I an trying to make it so that some commands cannot be used by the majority of people. To do this, would I make the permissions.json file look like the following?

{
    "global":{
        "eval" : false,
        "create" : false
    },
    "users":{
        "1234":{
            "eval": true
            "create": true
        }
    }
}

Proper Plugin Management

We kinda sorta have a little bit of a plugin architecture now, but it needs work. In particular plugins having npm dependencies is a mess. It'd be nice to be able to enable and disable individual plugins via config. etc.

internet points plugin

plugin that would add a functionality to give or take points from people.

like @Someone++ or @someone--
Discordbot: [Someone now has 5 points]

[email protected] No repository field.

I can run npm install for the first time and it installs everything, but when I try to run discord_bot.js it outputs

node discord_bot.js 
Please run npm install and ensure it passes with no errors!

So I run npm install again and it outputs this:

npm install
npm WARN package.json [email protected] No repository field.

Clarify steps for Custom Search.

Clarify the steps for CS setup on the google developer's webpage. Perhaps add to readme.md when correctly formatted in markdown. I had to figure out that I needed only the search engine ID code rather than its actual full URL for the Bot. The webpage at stackoverflow is slightly unclear on it.

Create a Custom Search at:
https://cse.google.com/cse/create/new
Leave the first line blank, and name the search engine anything you wish.
Click "Advanced Options" and then type ImageObject.
Hit create.
On this new page, enable the Image Search in the menu.
Then press "Search engine ID" under the Details header.
Copy this into the auth.json's "google_custom_search" section.

Make sure you also have your google server API key, which goes in the "youtube_api_key" section, or the search will fail.

Failed at node-opus node-gyp rebuild

Not sure what I'm doing wrong. While trying to install DiscordBot (or node-opus manually) causes errors and this error file.
npm-debug.txt
The following error occurs for almost every project being built.

..\..\deps\opus\src\opus_encoder.c(29): fatal error C1083: Cannot open include file: 'config.h': No such file or directory [C:\Users\Matthew\Documents\DiscordBot\DiscordBot-master\node_modules\node-opus\build\deps\libopus.vcxproj]
..\..\deps\opus\src\opus.c(29): fatal error C1083: Cannot open include file: 'config.h': No such file or directory [C:\Users\Matthew\Documents\DiscordBot\DiscordBot-master\node_modules\node-opus\build\deps\libopus.vcxproj]
..\..\deps\opus\src\opus_multistream.c(29): fatal error C1083: Cannot open include file: 'config.h': No such file or directory [C:\Users\Matthew\Documents\DiscordBot\DiscordBot-master\node_modules\node-opus\build\deps\libopus.vcxproj]
..\..\deps\opus\src\opus_decoder.c(29): fatal error C1083: Cannot open include file: 'config.h': No such file or directory [C:\Users\Matthew\Documents\DiscordBot\DiscordBot-master\node_modules\node-opus\build\deps\libopus.vcxproj]

And this error occurs after attempting to build the solution.

gyp ERR! build error
gyp ERR! stack Error: 'C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe' failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:270:23)
gyp ERR! stack at emitTwo (events.js:87:13)
gyp ERR! stack at ChildProcess.emit (events.js:172:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Windows_NT 10.0.10586
gyp ERR! command "C:\\Program Files (x86)\\nodejs\\node.exe" "C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\Matthew\Documents\DiscordBot\DiscordBot-master\node_modules\node-opus
gyp ERR! node -v v4.2.6
gyp ERR! node-gyp -v v3.0.3
gyp ERR! not ok

Any help would be appreciated.

Can't get image search working

I've got the bot up and running, and I'm 90% sure I've done everything right regarding my google server API and custom search yet my !image commands yield no results.

If possible, could someone please provide a more detailed outline on how to get the image search function to work from scratch?
I'm not too familiar with this sort of thing and I could use a little extra clarity on the matter.

Other than that, awesome bot! Everything else* works great.

*[other than !help (doesn't cause me to crash though, so I haven't really bothered to troubleshoot it)]

Discord link

Your Discordlink in your README does not work...

Voice/StreamIntent.js:6 error

When I do "node discord_bot.js" I get:

DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:6
f (typeof superClass !== "function" && superClass !== null) { throw new TypeEr
^
TypeError: Super expression must either be null or a function, not object
at _inherits (DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:6:113)
at DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:11:2
at Object. (DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:20:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object. (DiscordBot/node_modules/discord.js/lib/Voice/VoiceConnection.js:20:20)

I'm running Ubuntu LTS

Cannot load Wolfram module

couldn't load wolfram plugin! Error: Could not locate the bindings file. Tried: β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/build/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/build/Debug/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/build/Release/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/out/Debug/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/Debug/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/out/Release/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/Release/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/build/default/xmljs.node β†’ /home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/compiled/4.3.0/linux/x64/xmljs.node at bindings (/home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/node_modules/bindings/bindings.js:88:9) at Object.<anonymous> (/home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/lib/bindings.js:1:99) at Module._compile (module.js:410:26) at Object.Module._extensions..js (module.js:417:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Module.require (module.js:354:17) at require (internal/module.js:12:17) at Object.<anonymous> (/home/spencer/DiscordBot/node_modules/wolfram/node_modules/libxmljs/index.js:4:16) at Module._compile (module.js:410:26) Couldn't load rss.json. See rss.json.example if you want rss feed commands. error: Error: Cannot find module './rss.json' Ready to begin! Serving in 29 channels

Improve google image commands

The google image commands image and ggif could use a little work. They're going too far down the search results right now, and not getting very good images too often. Might be good to control whether it gets a variant or the top result too.

Voice

Discord.js has voice support. We should add voice features to DiscordBot!

Link History

Support for automatically reposting links to a dedicated channel would be really neat to have!

FAQ

ok this is getting a bit out of hand. we need to compile an FAQ.

Make the meme command better

Right now !meme only supports a few hard coded memes. It should be moved to a plugin to separate out the dependencies and made nicer.

Small typo

"!help" has a small typo, "pong" should be "ping"

s82i9

Auth.json issues

Okay, I don't mean to be that guy... but I don't know what I'm doing wrong. My auth.json file looks like this { "email" : β€œ[email protected]”, "password" : β€œpassword” }
but when I run the bot, it gives me this error
Please create an auth.json like auth.json.example with at least an email and password. SyntaxError: /Users/Nick/Desktop/DiscordBot-master/auth.json: Unexpected token β€œ at Object.parse (native) at Object.Module._extensions..json (module.js:424:27) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Module.require (module.js:353:17) at require (internal/module.js:12:17) at Object.<anonymous> (/Users/Nick/Desktop/DiscordBot-master/discord_bot.js:26:20) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32)
Am I just missing something really obvious?

!help crashes the bot

first of all thx for the bot it works pretty good.
but everytime I type !help the bot crashed and spits out this:

C:\Users\Jack\Documents\Discord\DiscordBot-master>node discord_bot.js
Ready to begin! Serving in 15 channels
Loaded 37 chat commands type !help in Discord for a commands list.
treating !help from <@64438422250031872> as command
C:\Users\Jack\Documents\Discord\DiscordBot-master\node_modules\discord.js\lib\Cl
ient\Resolver\Resolver.js:232
                        var chatFound = this.internal.private_channels.find(func
tion (pmchat) {
                                                                       ^
TypeError: undefined is not a function
    at Resolver.resolveChannel (C:\Users\Jack\Documents\Discord\DiscordBot-maste
r\node_modules\discord.js\lib\Client\Resolver\Resolver.js:232:51)
    at InternalClient.sendMessage (C:\Users\Jack\Documents\Discord\DiscordBot-ma
ster\node_modules\discord.js\lib\Client\InternalClient.js:494:24)
    at Client.sendMessage (C:\Users\Jack\Documents\Discord\DiscordBot-master\nod
e_modules\discord.js\lib\Client\Client.js:95:24)
    at Client.<anonymous> (C:\Users\Jack\Documents\Discord\DiscordBot-master\dis
cord_bot.js:618:8)
    at Client.emit (events.js:107:17)
    at WebSocket.websocket.onmessage (C:\Users\Jack\Documents\Discord\DiscordBot
-master\node_modules\discord.js\lib\Client\InternalClient.js:1261:16)
    at WebSocket.onMessage (C:\Users\Jack\Documents\Discord\DiscordBot-master\no
de_modules\discord.js\node_modules\ws\lib\WebSocket.js:418:14)
    at WebSocket.emit (events.js:110:17)
    at Receiver.ontext (C:\Users\Jack\Documents\Discord\DiscordBot-master\node_m
odules\discord.js\node_modules\ws\lib\WebSocket.js:816:10)
    at C:\Users\Jack\Documents\Discord\DiscordBot-master\node_modules\discord.js
\node_modules\ws\lib\Receiver.js:477:18

Welcome message?

How i can setup a welcome msg?
like

user join:
bot: Welcome [user]
left
bot: Goodbye [user]

Launch issue

Hi,

Not sure what's causing this one:

% node discord_bot.js

/home/bot/git/DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:9
f (typeof superClass !== "function" && superClass !== null) { throw new TypeEr
^
TypeError: Super expression must either be null or a function, not object
at _inherits (/home/bot/git/DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:9:113)
at /home/bot/git/DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:16:2
at Object. (/home/bot/git/DiscordBot/node_modules/discord.js/lib/Voice/StreamIntent.js:25:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object. (/home/bot/git/DiscordBot/node_modules/discord.js/lib/Voice/VoiceConnection.js:38:21)

really want to have a hackathon to add voice/dj features + fix everything.

So me and @Einarin are in MA. I am busy this weekend but I would probably be down to do some intense ChaldaBot work the weekend after! Anyone else local to New England? Otherwise you can may be join remotely over discord!

Speaking of which we should have an official DiscordBot discord channel. Or may be a room in the discord.js/discord dev room. ( I heard they are annoyed by all the people coming in for help with deployments haha)

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.