Giter Club home page Giter Club logo

qbot's Introduction

Marketing Banner

License Checks Discord Contributors Stars

An advanced, easy to setup, free, and unbranded Discord-Roblox ranking bot. With powerful features and modular infrastructure, Qbot is the last bot you'll ever need to manage your group.

Installation

Setup instructions are available at https://docs.lengolabs.com/start. This project can be ran on any hosting platform that supports Node.js v16 and higher, and consistently runs in the same IP region as the user who manages the bot's cookie.

If you run into any problems while configuring Qbot, please do not hesitate to join our community Discord server! Our volunteer support team is happy to assist you to make sure that you have the best experience possible, and that the setup process goes smoothly.

License

We use the MIT License, due to its permissive structure and the piece of mind it provides for contributors. We highly recommend you read the license before maintaining this project, so you have an idea of what is allowed, and what is not allowed.

You can read the license here: https://github.com/LengoLabs/qbot/blob/master/LICENSE

Note on Discord API

Please note that the Discord has separate terms of conditions for bots running on Discord's API. Please review that here before installing the bot: https://discord.com/developers/docs/legal

Specifically, this is something very relevant to hosting Qbot:

You will comply with all applicable privacy laws and regulations including those applying to personally identifiable information ("PII"). You will provide and adhere to a privacy policy for your application that uses the API (your “API Client”) that clearly and accurately describes to users of your API Client what user information you collect and how you use and share such information with Discord and third parties. (jump to section)

It is your responsibility to implement a privacy policy, as mentioned in this quote from the API above. Depending on your Qbot configuration, this may be something as simple as a link to a Google Doc that says "We don't collect any personal information. If you have questions or concerns, contact us here..." We recommend you join the Discord Developers server if you have any questions about this policy.

Have feedback? Suggestions?

We'd be thrilled to hear them! You can utilize the feedback channels on our Discord server for this. Alternatively, you can open an issue on this repository.

Contributing

First of all, thank you for looking into contributing to Qbot! We greatly appreciate all pull requests and issues, as they help us provide a better experience to the thousands of Qbot users. We recommend you join our community Discord server if you are looking to contribute, because you can talk with the developers of this project, and get feedback on potential pull requests before starting to work on them.

Upon finding a topic, feel free to get started coding it! When you are done, please thoroughly test this on your own bot. Then, submit a pull request! If your pull request gets approved, you will be listed as a contributor on this Github page, and will receive the shiny Contributor role if you are in our Discord server. Please note that it is up to the developers to choose if you get the contributor role.

Extra Notes

  • Qbot is not affiliated with Discord, Inc.
  • Qbot is not affiliated with Roblox Corporation.

qbot's People

Contributors

amnobcop avatar astranger1k avatar billyh-0167 avatar deepsourcebot avatar dependabot[bot] avatar fisherjacobc avatar fossabot avatar lxphere avatar simplynoni avatar sv-du avatar theshadowgamer avatar wilyt1 avatar yogurtsyum 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

Watchers

 avatar  avatar  avatar

qbot's Issues

Im getting a really big error in a repl.

Error: Cannot find module './BaseGuildEmoji'
Require stack:

  • /home/runner/AlertTalkativeAnalyst/node_modules/discord.js/src/structures/GuildEmoji.js
  • /home/runner/AlertTalkativeAnalyst/node_modules/discord.js/src/managers/GuildEmojiManager.js
  • /home/runner/AlertTalkativeAnalyst/node_modules/discord.js/src/client/Client.js
  • /home/runner/AlertTalkativeAnalyst/node_modules/discord.js/src/index.js
  • /home/runner/AlertTalkativeAnalyst/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object. (/home/runner/AlertTalkativeAnalyst/node_modules/discord.js/src/structures/GuildEmoji.js:3:24)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19)Hint: hit control+c anytime to enter REPL.

qbot & roblox bot account protection & private projects

Yesterday someone hacked into my bot account for qbot to operate and raided my group. I need to know if I can set these precautions without the ranking system breaking:

  • Set Two Factor Authentication on the Roblox Bot Account
  • Set my repl.it to private project (I have pro or whatever it's called lol)

Thanks. 👍

Not an issue, but a question.

Hi there!

I was just wondering how to make it so the bot can respond to webhooks? I have a webhook that responds to requests for ranking, but it won't rank when it sends in a request. It doesn't return an error or anything, it's almost like it ignores it.

Is there a way I can configure the bot so it can respond to webhook ranking? Thanks!
image

Suggestion - Guild Ban Method

Suggestion: Make a variable called allowed guilds which would be an empty array. Then have the user put their guild id in the array, then for every message or when the bot boots, check every guild id that the bot has access to and if it doesn't equal the guild id(s) in the array, it leaves the guilds.
How would this be helpful: This would be helpful for people for forget to private their bot

The bot won't send any messages

It doesn't show anything wrong on Repl.it or UptimeRobot, the bot role has the administrator permission, and yet the bot won't send any messages. It had been working fine for almost a month and today it just stopped, even though it still ranks people in the group, it won't log them or answer to the commands.

Cookie error possibly?

Using the bots cookie, everything is working as it should except when you run any command it just keeps stating "You need the Ranking Permissions or Shout Permissions role to run this command." the bot account has all role permissions in the group already. Any help would be highly appreciated.

Getroles command help

const Discord = require('discord.js');
const roblox = require("noblox.js");
exports.run = async (client, message, args) => {

const foundId = roblox.getIdFromUsername(message.guild.member.displayName)
const groupRank = roblox.getRankNameInGroup(7745739, foundId)

message.member.roles.add(message.guild.roles.cache.find(role => role.name === groupRank)); // Add the users role

const e = new Discord.MessageEmbed()
.setColor('BLUE')
.setTitle(Prompt Concluded)
.addField("Added Roles", ${groupRank})
.setFooter("Action: Getroles")
message.channel.send(e)
}

When will server be unlocked?

### I am asking for **LENGO ### and only lengo to answer,_** the server has been locked for 23 days, when can we expect it to be back up?

Audit Logs

Bot won't display audit logs. Cookies are correct since promotions and demotions work. Bot has access to all permissions.

X-CSRF-TOKEN

When I attempt to rank someone, I get an error.

An error occured when running the promote command: Error: Did not receive X-CSRF-TOKEN

image

Shout Command Log Issue

Small bug, easy fix. When the shout command is ran via the slash command. It uses the message object instead of the interaction object when making the log.

What's going on in the server?

I'm curious on what's going on with the server. Did it get raided, or are you guys making critical updates to the server?

Error

Oops! An unexpected error has occured. It has been logged to the bot console.

Error?? Fix?

/home/container/node_modules/bloxy/dist/controllers/rest/lib/getRequester.js:10
throw new Error(Failed to retrieve module "got" and no custom requester provided!);
^
Error: Failed to retrieve module "got" and no custom requester provided!
at getRequester (/home/container/node_modules/bloxy/dist/controllers/rest/lib/getRequester.js:10:19)
at new RESTController (/home/container/node_modules/bloxy/dist/controllers/rest/RESTController.js:38:53)
at new Client (/home/container/node_modules/bloxy/dist/client/Client.js:17:21)
at Object. (/home/container/src/main.ts:28:22)
at Module._compile (node:internal/modules/cjs/loader:1376:14)
at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:1618:23)
at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Object.require.extensions. [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:1621:12)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Function.Module._load (node:internal/modules/cjs/loader:1023:12)

Bot issues.

Why my bot is shutdowning on repl in about 10 minutes?

error in help

require('dotenv').config();
exports.run = async (client, message, args) => {
return message.channel.send({embed: {
color: 7948427,
description: **Here are my commands:**\n
+ \${process.env.prefix}setrank <rank name/number>` - Ranks the user in the Roblox group to the specified rank number or name.\n+`${process.env.prefix}promote ` - Moves the user 1 rank up in the Roblox group.\n+`${process.env.prefix}demote ` - Moves the user 1 rank down in the Roblox group.\n+`${process.env.prefix}fire ` - Moves a user to the lowest rank possible besides Guest.\n+`${process.env.prefix}shout ` - Posts a group shout.\n+`${process.env.prefix}clearshout` - Clears the group shout.\n+`${process.env.prefix}currentshout` - Shows the current group shout.\n`
name: message.author.tag,
icon_url: message.author.displayAvatarURL()
}
}});
}
``

Idea Suggestion 💡

I do have a suggestion for this bot, basically a verification type via Roblox of course, then it will save in Mongoose (MongoDB), and like they can get roles for having a specific role in the group. A reference bot for this would be "RoWifi".

If possible, I would love to do it, just needed confirmation if you guys like the idea.

qbot issue

my bot says that the user is not in group, and the "fire" command does not trigger an embed or anything

How do I make the webhook execute a command?

const roblox = require('noblox.js');
const chalk = require('chalk');
require('dotenv').config();

async function getRankName(func_group, func_user){
let rolename = await roblox.getRankNameInGroup(func_group, func_user);
return rolename;
}

async function getRankID(func_group, func_user){
let role = await roblox.getRankInGroup(func_group, func_user);
return role;
}

async function getRankFromName(func_rankname, func_group){
let roles = await roblox.getRoles(func_group);
let role = await roles.find(rank => rank.name == func_rankname);
if(!role){
return 'NOT_FOUND';
}
return role.rank;
}

exports.run = async (client, message, args) => {
if(!message.member.roles.cache.some(role =>["[-] Bot", "Solea Owners", "Ron"].includes(role.name))){
return message.channel.send({embed: {
color: 16733013,
title: 'Access Denied!',
description: "You need to have permissions from ven#2175 to run this command, he said only bots can.",
author: {
name: message.author.tag,
icon_url: message.author.displayAvatarURL()
}
}})
}

if(message.author.bot);

if(message.author.webhook);

let username = args[0];
if(!username){
    return message.channel.send({embed: {
        color: 16733013,
        title: 'Oops!',
        description: "The username argument is required.",
        author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
        },
        footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
    }});
}
let rank = Number(args[1]);
let newrank;
if(!rank){
    let midrank = args.slice(1).join(' ');
    if(!midrank){
        return message.channel.send({embed: {
            color: 16733013,
            title: 'Sorry!',
            description: "The rank id is required.",
            author: {
                name: message.author.tag,
                icon_url: message.author.displayAvatarURL()
            },
           footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
        }});
    }
    newrank = await getRankFromName(midrank, Number(process.env.groupId));
} else {
    newrank = rank;
}
let id;
try {
    id = await roblox.getIdFromUsername(username);
} catch {
    return message.channel.send({embed: {
        color: 16733013,
        description: `Oops! ${username} is not a Roblox user. Perhaps you misspelled?`,
        author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
        },
        footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
    }});
}
let rankInGroup = await getRankID(Number(process.env.groupId), id);
let rankNameInGroup = await getRankName(Number(process.env.groupId), id);
if(Number(process.env.maximumRank) <= rankInGroup){
    return message.channel.send({embed: {
        color: 16733013,
        title: 'Sorry!',
        description: "This rank cannot be ranked by this bot.",
        author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
        },
        footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
    }});
}
if(newrank == 'NOT_FOUND'){
    return message.channel.send({embed: {
        color: 16733013,
        title: 'Sorry!',
        description: "The specified rank could not be found.",
        author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
        },
        footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
    }});
}
let setRankResponse;
try {
    setRankResponse = await roblox.setRank(Number(process.env.groupId), id, newrank);
} catch (err) {
    console.log(chalk.red('An error occured when running the setrank command: ' + err));
    return message.channel.send({embed: {
        color: 16733013,
        title: 'Sorry!',
        description: `An unexpected error has occured. It has been logged to the bot console.`,
        author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
        },
        footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
    }});
}
let newRankName = await getRankName(Number(process.env.groupId), id);
message.channel.send({embed: {
    color: 9240450,
    title: 'Access Granted!',
    description: `Ranked ${username} to ${setRankResponse.name} (${setRankResponse.rank})`,
    author: {
        name: message.author.tag,
        icon_url: message.author.displayAvatarURL()
    },
    footer: {
        text: 'Solea Ranking',
        icon_url: `https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
    }
}});
if(process.env.logchannelid === 'false') return;
let logchannel = await message.guild.channels.cache.get(process.env.logchannelid);
logchannel.send({embed: {
   color: 2127726,
    title: 'Success!',
    description: `**Command Usage:** /ranc \n

Who used the command: <@${message.author.id}> \n
Target User: ${username} \n
Old Rank: ${rankNameInGroup} (${rankInGroup}) \n
New Rank: ${setRankResponse.name} (${setRankResponse.rank})., footer: { text: 'Solea Ranking', icon_url: https://cdn.discordapp.com/attachments/746770154821517394/747027560860352582/1e73e4fc65899dadf0e0db20dfe68dc2.png`
},
timestamp: new Date(),
thumbnail: {
url: http://www.roblox.com/Thumbs/Avatar.ashx?x=150&y=150&format=png&username=${username}
}
}});
}

How do I dm multiple people in one command instead of doing them one by one?

Ok so, I tried everything like copy pasting args[0], and it did not work. Here is the code. No errors at all but it does not dm all the persons. This is a qbot plugin also just so you know I modified the dm command a bit by embedding it.

exports.run = async (client, message, args) => {
  let filter = (msg) => msg.author.id === message.author.id;
  if (
    message.member.roles.cache.some(role =>
      ["DM Permissions"].includes(role.name)
    )
  ) {
    let mention =
      (await message.mentions.members.first()) ||
      (await message.guild.members.cache.get(args[0]));
    const tosend = args.slice(1).join(" ");
    if (tosend) {
      if (mention) {
        await mention.send ({
              embed: {
                color: `RANDOM`,
                title: `Message from ${message.member.displayName}:`,
           description: `${tosend}`,
                footer: {
                  text: `United States Armed Forces`,
                  icon_url: `https://cdn.discordapp.com/emojis/72404865910268370`
                },
                timestamp: new Date()
              }
             })
             
          .then(async () => {
            message.channel.send({
              embed: {
                color: 9240450,
                description: "Successfully sent DM!",
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                }
              }
            });
            if (process.env.logchannelid === "false") return;
            let logchannel = await message.guild.channels.cache.get(
              process.env.logchannelid
            );
            logchannel.send({
              embed: {
                color: 2127726,
                description: `<@${message.author.id}> (${message.author.tag}) sent a DM to <@${mention.id}> (${mention.user.tag}) saying: \`${tosend}\``,
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                },
                footer: {
                  text: "DM Logs"
                },
                timestamp: new Date()
              }
            });
          })
          .catch(async (err) => {
            return message.channel.send({
              embed: {
                color: 16733013,
                description: "That person does not have their DMs on!",
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                }
              }
            });
          });
      } else {
        let findname = await message.guild.members.fetch({
          query: args[0],
          limit: 1
        });
        if (findname.first().id) {
          const msg = await message.channel.send({
            embed: {
              color: 39423,
              description: `Do you want to send this DM to <@${
                findname.first().id
              }> (${findname.first().user.tag})?`,
              author: {
                name: message.author.tag,
                icon_url: message.author.displayAvatarURL()
              },
              footer: {
                text: `Options: yes | no`
              }
            }
          });
          message.channel
            .awaitMessages(filter, { max: 1, time: 60000 })
            .then(async collected => {
              if (collected.size === 0) {
                message.channel.send({
                  embed: {
                    description: `You took too long. Prompt cancelled.`,
                    color: 16733013,
                    author: {
                      name: message.author.tag,
                      icon_url: message.author.displayAvatarURL()
                    }
                  }
                });
              } else {
              let answer = collected.first().content.toLowerCase();
              if (answer === "no") {
                return message.channel.send({
                  embed: {
                    color: 9240450,
                    description: `Did not send a DM.`,
                    author: {
                      name: message.author.tag,
                      icon_url: message.author.displayAvatarURL()
                    }
                  }
                });
              } else {
              if (answer === "yes") {
        await findname.first()
          .send({
              embed: {
                color: `RANDOM`,
                title: `Message from ${message.member.displayName}:`,
              description: `${tosend}`,
                timestamp: new Date(),
                footer: {
                  text: `United States Armed Forces`,
                  icon_url: `https://cdn.discordapp.com/emojis/7240486591042370`
                },
              }
             })
          .then(async () => {
            message.channel.send({
              embed: {
                color: 9240450,
                description: "Successfully sent DM!",
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                }
              }
            });
            if (process.env.logchannelid === "false") return;
            let logchannel = await message.guild.channels.cache.get(
              process.env.logchannelid
            );
            logchannel.send({
              embed: {
                color: 2127726,
                description: `<@${message.author.id}> (${message.author.tag}) sent a DM to <@${findname.first().id}> (${findname.first().user.tag}) saying: \`${tosend}\``,
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                },
                footer: {
                  text: "DM Logs"
                },
                timestamp: new Date()
              }
            });
          })
          .catch(async (err) => {
            return message.channel.send({
              embed: {
                color: 16733013,
                description: "That person does not have their DMs on!",
                author: {
                  name: message.author.tag,
                  icon_url: message.author.displayAvatarURL()
                }
              }
            });
          });
              } else {
                return message.channel.send({embed: {
                  color: 16733013,
                  description: 'That is not a valid option.',
                  author: {
                    name: message.author.tag,
                    icon_url: message.author.displayAvatarURL()
                  }
                }})
              }
              }
            }
            });
        }
      }
    } else
      message.channel.send({
        embed: {
          color: 16733013,
          description: "You did not say what to send! Bruh.",
          author: {
            name: message.author.tag,
            icon_url: message.author.displayAvatarURL()
          }
        }
      });
  } else {
    message.channel.send({
      embed: {
        color: 16733013,
        description: "You need the `DM Permissions` role to use this command!",
        author: {
          name: message.author.tag,
          icon_url: message.author.displayAvatarURL()
        }
      }
    });
  }
};

SyntaxError: Cannot use import statement outside a module

Getting an error when running ### node .###

`C:\Users\Ryan\Doccuments\qbot-7.3.0>node .
C:\Users\Ryan\Documents\qbot-7.3.0\src\main.ts:1
import { QbotClient } from './structures/QbotClient';
^^^^^^

SyntaxError: Cannot use import statement outside a module
←[90m at Object.compileFunction (node:vm:352:18)←[39m
←[90m at wrapSafe (node:internal/modules/cjs/loader:1032:15)←[39m
←[90m at Module._compile (node:internal/modules/cjs/loader:1067:27)←[39m
←[90m at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)←[39m
←[90m at Module.load (node:internal/modules/cjs/loader:981:32)←[39m
←[90m at Function.Module._load (node:internal/modules/cjs/loader:822:12)←[39m
←[90m at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)←[39m
←[90m at node:internal/main/run_main_module:17:47←[39m`

Node version 16.14.0.

Question

I want a ;kick command for Qbot, and when I run ;kick it will kick them from the Game.

Group Shout

So the bot use to post a shout in a channel when a shout goes out but now it wont. Note(s): the bot is super slow and always breaks

Bot not working

Hey I was making a bot for my friend and every time I click on run it just says your app is currently listening to port 3000

custom command/system

I know this isn’t specific to qbot but for those who don’t know, my bot was on public invite and my group got raided as the bot is in another server.

Does anyone know how I could run a command, (maybe an eval?) to figure out the members of the other server or even get an invite to it.

Thanks.

I keep getting this error.

Error: Cannot find module 'express'
Require stack:

  • /home/runner/KnowledgeableKnowingAddress/index.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at /home/runner/KnowledgeableKnowingAddress/index.js:1:17
    at Script.runInContext (vm.js:130:18)
    at Object. (/run_dir/interp.js:209:20)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)

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.