Code Monkey home page Code Monkey logo

sopel's Introduction

Sopel

version build issues coverage-status license

Introduction

Sopel is a simple, lightweight, open source, easy-to-use IRC Utility bot, written in Python. It's designed to be easy to use, run and extend.

Installation

Latest stable release

On most systems where you can run Python, the best way to install Sopel is to install pip and then pip install sopel.

Arch users can install the sopel package from the [community] repository, though new versions might take slightly longer to become available.

Failing both of those options, you can grab the latest tarball from GitHub and follow the steps for installing from the latest source below.

Latest source

First, either clone the repository with git clone https://github.com/sopel-irc/sopel.git or download a source archive from GitHub.

Note: Sopel requires Python 3.8+ to run.

In the source directory (whether cloned or from the tarball) run pip install -e .. You can then run sopel to configure and start the bot.

Database support

Sopel leverages SQLAlchemy to support the following database types: SQLite, MySQL, PostgreSQL, MSSQL, Oracle, Firebird, and Sybase. By default Sopel will use a SQLite database in the current configuration directory, but alternative databases can be configured with the following config options: db_type, db_filename (SQLite only), db_driver, db_user, db_pass, db_host, db_port, and db_name. You will need to manually install any packages (system or pip) needed to make your chosen database work.

Note: Plugins not updated since Sopel 7.0 was released might have problems with database types other than SQLite (but many will work just fine).

Adding plugins

The easiest place to put new plugins is in ~/.sopel/plugins. Some newer plugins are installable as packages; search PyPI for these. Many more plugins written by other users can be found using your favorite search engine.

Some older, unmaintained plugins are available in the sopel-extras repository, but of course you can also write your own. A tutorial for creating new plugins is available on Sopel's website. API documentation can be found online at https://sopel.chat/docs/, or you can create a local version by running make docs.

Further documentation

The official website includes such valuable information as a full listing of built-in commands, tutorials, API documentation, and other usage information.

Questions?

Join us in #sopel on Libera Chat.

Donations

We're thrilled that you want to support the project!

You can sponsor Sopel here on GitHub or donate through Open Collective.

Any donations received will be used to cover infrastructure costs, such as our domain name and hosting services. Our main project site is easily hosted by Netlify, but we are considering building a few new features that would require more than static hosting. All project-related expenses are tracked on our Open Collective profile, for transparency.

sopel's People

Contributors

anarcat avatar bui avatar dasu avatar deathbybandaid avatar depierre avatar dgw avatar eldonmcguinness avatar embolalia avatar erethon avatar exirel avatar half-duplex avatar humorbaby avatar kays avatar kwaaak avatar lramati avatar maxpowa avatar myano avatar nache avatar nfearnley avatar ohcanep avatar pmrowla avatar rdswift avatar rustybower avatar saltire avatar singingwolfboy avatar snoopj avatar tyrope avatar venti- avatar warddr avatar yoosi 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  avatar  avatar

sopel's Issues

Windows compatibility

I think the incompatibilities are all related to imports of the os module. Not sure how/if they can be replaced, but it's something I've been meaning to look into.

Wille, ask and Willie, tell are broken

Willie: ask tyrope to merge ytlast pull request on willie please
ValueError: too many values to unpack (file "/usr/share/jenni/modules/tell.py", line 64, in f_remind)
I wonder if Willie's tell also broken like ask is
Willie: tell tyrope to merge ytlast pull request on willie please
ValueError: too many values to unpack (file "/usr/share/jenni/modules/tell.py", line 64, in f_remind)

.spellcheck <word>

I did this same thing on the mIRC scripted bot socketing to a PHP "parser" page using PHP's pspell() function.

Should be easy enough to write another PHP page using pspell() put it on a webserver (tyrope.nl ? ...or embo's VPS and it doesn't have to rely on a remote connection!)

http://php.net/manual/en/ref.pspell.php

.youtube <search term>

Completely different from the yt link info script. This lets a user search for a term and shows information for a video that matches that search.

Zoey's example output:

13:38:59 <~root> .youtube vlogbrothers
13:39:04 -Zoey([email protected])- [YT Search] Title: Changes to Vlogbrothers Author:
vlogbrothers Duration: 2 minutes 33 seconds Views: 207,449 Link:
http://www.youtube.com/watch?v=Uf2dQOIr3NM_player

Parser: http://parsers.impactbot.com/?type=youtube&search=vlogbrothers (this is an alternate one)

PREFERRED PARSER: http://rscript.org/lookup.php?type=ytinfo&term=
ex: http://rscript.org/lookup.php?type=ytinfo&term=vlogbrothers (to tell what info is which I recommend opening up the video in a new tab)

Track packages, and report where they are/when they've arrived

The arrival feature would be mainly for us dorm dwellers, who don't get a knock at the door. Though, maybe there would be options, like reporting when something is "out for delivery". Perhaps it could map users to any packages they have, and be able to report on multiple packages at a time...

.imdb feature for Willie

I'm suggesting a command that would make Willie look for information from the Internet Movie Database, http://www.imdb.com. It would make it very easy to look for information of movies, TV shows, actors/actresses, directors etc.

So if it would work as I pictured, basically the command would be, for example, ".imdb The Hunger Games" and Willie would give a link to this page: http://www.imdb.com/title/tt1392170/. That's about it.

Tweetwatcher is broken.

[1854.09] <&Willie> [DEVMSG]Exception in saylast(), twit.py (line 100).
[1854.10] <&Willie> [Exception]<class 'tweepy.error.TweepError'>: (), Twitter error response: status code = 503.
[1854.12] <&Willie> [Vardump]twituser: NerdfighterIRCrecent: The Manic Pixie Dream Squirrel: http://t.co/S1BT6UrF (cc @nathanrabin), Lasts:
[1854.13] <&Willie> hankgreen
[1854.13] <&Willie> realjohngreen
[1854.14] <&Willie> NerdfighterIRC

[1855.56] <%Tyrope> .tweetwatcher off
[1855.58] <&Willie> Tweetwatcher is now off.
[1856.46] <&Willie> I will now watch for new tweets.

Translation is broken.

[2341.10] <%Tyrope> Willie, fr "Va te faire maitre tous seul"?
[2341.11] <&Willie> TypeError: 'str' object is not callable (file "/usr/share/jenni/modules/translate.py", line 27, in translate)

Whois doesn't hide hidden (+p|+s) channels

It used to hide them, but for some reason doesn't any more.

[0117.10] <&Willie> [WHOIS] Nick: elad Host: [email protected] Real name: Elad
[0117.12] <&Willie> elad is on 10 channels: %#YourPants #Embo &#dftbquotes ?@#services %#opers ?~#bucket ?@#TyLogs @#Support +#DnD &#minecraft

In this example: TyLogs, bucket and services should be hidden (not displayed.)

admincommand.py not working with some networks

Not all networks' NickServ have the ACC command, which makes it impossible for the bot to authenticate the user - and it also keeps retrying to authenticate, which takes up log space, continuously spams the server, and delays the bot's reply times.

wolfram &char; shouldn't split the parser's content

This is to fix for example temperature reports:
19:16 elad .wa weather in tel aviv tomorrow at noon
19:16 Willie [WOLFRAM] weather forecast->Tel Aviv-Yafo, Israel, ->12:00:00 pm IST -> Tuesday, March 27, 2012 = 63 &deg

Possible solution:
Check for &[A-z]; and parse it using some html function

Issues with .whois

There is a few problems with the .whois command:

  • The realname will only display the first word
  • It counts the number of channels incorrectly (-1)
  • If a user is in one or less channels, it will return an error
  • The next time a (successful) whois command is performed, it will return the name info of the first error-user

Example:

.whois ChanServ
AttributeError: 'NoneType' object has no attribute 'split' (file "/home/bnc/jenni/modules/whois.py", line 23, in sendwhois)
.whois User
AttributeError: 'NoneType' object has no attribute 'split' (file "/root/bnc/jenni/modules/whois.py", line 23, in sendwhois)
.whois Bot
[WHOIS] Nick: ChanServ Host: [email protected] Real name: Channel
ChanServ is on 1 channels: @#bot-debug +#bot

.in with multiple types of time

[1634.34] <~Tyrope> .in 1h 9m 30s Attack on P1X-245
[1634.35] Tyrope: Okay, will remind at 16:34Z
[1634.45] <~Tyrope> .in 1h9m30s Attack on P1X-245
[1634.46] Tyrope: Okay, will remind at 15:35Z

Neither of these actually remind in 1 hour, 9 minutes and 30 seconds. (The second one returned in 1 minute.)

tell: responds to self if user is online

<Willie> SystemDisc: I'll pass that on when Embolalia is around.
<Willie> SystemDisc: tell Embolalia there is a qweb for the BNC now, and to ask me or Tyrope for the URL

I'm not sure if that happened because Embolalia was already in the channel. Normally it only responds with the message after the target speaks.

xkcd imports invalid module

[1926.56] <%Tyrope> .xkcd 725
[1926.57] <&Willie> ImportError: No module named lxml (file "/usr/share/jenni/modules/xkcd.py", line 19, in xkcd)
[1927.02] <%Tyrope> err... wut?
[1927.04] <%Tyrope> .xkcd
[1927.05] <&Willie> ImportError: No module named lxml (file "/usr/share/jenni/modules/xkcd.py", line 19, in xkcd)

Crashes on unicode but only with my Nick (SystemDisc)

first found bug when entering string: "I call my ex-girlfriend's father isä"

[Mar 21 13:46:34] <SystemDisc> I call my ex-girlfriend's father isä
[Mar 21 13:46:34] * Willie has quit (Client exited)
[Mar 21 13:48:22] <SystemDisc> test: ä
[Mar 21 13:48:23] * Willie has quit (Client exited)
[Mar 21 13:50:25] <SystemDisc> ö
[Mar 21 13:50:26] * Willie has quit (Client exited)
[Mar 21 13:56:21] <SystemDisc> ö
[Mar 21 13:56:21] * Willie has quit (Client exited)

Doesn't affect Willie when entered by other Nicks
[Mar 21 13:49:37] <elad> Ü
[Mar 21 13:49:39] <elad> Nope
[Mar 21 13:49:47] <elad> Is it just ä?
[Mar 21 13:49:59] <cathy> ö
[Mar 21 13:50:00] <cathy> å

[Mar 21 13:51:06] <elad> Bugman
[Mar 21 13:51:11] <cathy> :D:D:D:D:D:D lol elad
[Mar 21 13:51:26] <elad> XD
[Mar 21 13:51:29] <cathy> willie you're being ridiculous
[Mar 21 13:51:54] <elad> à
[Mar 21 13:52:02] <cathy> ë
[Mar 21 13:52:02] <elad> Á
[Mar 21 13:52:05] <cathy> ï
[Mar 21 13:52:09] <cathy> ü
[Mar 21 13:52:13] <elad> Ú
[Mar 21 13:52:22] <cathy> I can't make cedilles
[Mar 21 13:52:23] <elad> A
[Mar 21 13:52:27] <cathy> or don't know how to
[Mar 21 13:52:41] <elad> Ipad keyboard makes it easier for me
[Mar 21 13:52:44] <cathy> ç
[Mar 21 13:52:49] <cathy> there
[Mar 21 13:52:52] <elad> c
[Mar 21 13:53:01] <cathy> Ç
[Mar 21 13:53:02] <falory> ? eee this is fun
[Mar 21 13:53:05] <cathy> â
[Mar 21 13:53:06] <cathy> ê
[Mar 21 13:53:08] <falory> Not sure what we're doing but it looks fun!
[Mar 21 13:53:09] <cathy> î
[Mar 21 13:53:11] <cathy> :D:D:D:D
[Mar 21 13:53:15] <falory> ?huh. wonder what that is.
[Mar 21 13:53:22] <cathy> testing which characters Willie doesn't like
[Mar 21 13:53:28] <falory> o0o
[Mar 21 13:53:35] * falory throws a ? at Willie
[Mar 21 13:53:38] <elad> Willie hates ä
[Mar 21 13:53:39] <cathy> :D
[Mar 21 13:53:41] <cathy> ö
[Mar 21 13:53:51] <elad> ä
[Mar 21 13:54:01] <Joshua> ä
[Mar 21 13:54:02] <falory> ? ? ? ?
[Mar 21 13:54:04] <elad> Now he doesn't crash
[Mar 21 13:54:05] <falory> o0o pretty!
[Mar 21 13:54:06] <cathy> äöäöäöäöäöä
[Mar 21 13:54:14] <elad> Might have been a coincidence
[Mar 21 13:54:16] <falory> ? I really like the butterfly looking character.

.wolfram parser is broken

I suggest circumventing the parser and creating our own parsing account, @embolalia

[2259.37] <%Tyrope> .wa (Amount of items in a dozen) / (Population of earth)
[2259.47] <&Willie> [WOLFRAM ERROR]Error fetching URI.

.topic

[08:44:33] * Willie changes topic to 'Welcome to: #YourPants | Site: http://nerdfighteria.net | FB: http://fb.me/NerdfighterIRC | Twitter: @NerdfighterIRC | Tumblr: http://dft.ba/-nfirctum | G+: http://dft.ba/-nfircgplus | Topic: Martin Luther King Day in America!'

"Tumblr: http:/dft.ba/-nfirctum" |" can be removed since http://nerdfighteria.net directs to the tumblr. It also makes the topic shorter which means more information can be put at the end with less worrying about it getting cut off.

Also, perhaps make the topic change work in multiple channels (for example I know for a fact Willie is in #YourPants-nl -- if possible, the above format ONLY is necessary for #yourpants, other channels can have whatever the hell they want in their topic.

(I think the multichannel thing also ties into the .bomb permission issue and having it op/halfop only rather than "bot admin"? Due to, for example #yourpants-nl, having different staff.)

change for .twitinfo (aesthetic appeal)

20:57:37 <~root> .twitinfo chrispirillo
20:57:38 <@ Willie> root: Chris Pirillo. ID: 756278. Friend Count: 1623.
Followers: 103575. Favourites: 109. Location: Seattle, WA. Description: I
create content and communities. You can hire me to produce for your company,
too! [email protected]

Perhaps add commas in friend count (following) and followers to make it look nicer/easier to read (especially useful for big numbers - example: John Green has over 1 million followers!)

In addition perhaps delete the <> around the twitter username and prefix it with @ (since that is the 'twitter standard')

Strange closing character in user s/old/new on actions

15:35 elad goes to clean lemon's inventory with a flamthrower.
15:35 Tyrope elad: s/am/ame
15:36 Willie Tyrope thinks elad goes to clean lemon's inventory with a flamethrower.�

We should remove this character from the coding.

.bomb wire fix

[0242.54] .cutwire blue
[0242.54] <&Willie> No! No, that's the wrong one. Aww, you've gone and killed yourself. Oh, that's... that's not good. No good at all, really. Wow. Sorry.
[0242.54] Neg [[email protected]] has been kicked from #YourPants by Willie [Willie@P4A-A632E56F]: You should've picked the Blue wire.

Blue != blue?

ytinfo change (mostly a formatting thing)

Suggestion:

18:59:37 http://www.youtube.com/watch?v=kfVsfOSbJY0&feature=channel_video_title
18:59:38 <&Willie> [YouTube] Title: Rebecca Black - Friday - Official Music Video | Uploader:
rebecca | Uploaded: 17/09/2011, 01:38 | Length: 3mins 48secs | Views: 18798668 |
Comments: 270299 | Likes: 101,263 | Dislikes: 411,295

Make Views and COmments have commas just like "likes" and "dislikes" does? Frankly I'm assuming that was originally the intent anyway but then didn't get done.

another youtube id error

Balthazar posted this video link

11:29:57 http://www.youtube.com/watch?v=mLmSixeRAv4&feature=g-u-u&context=G2360d42FUAAAAAAAAAA
11:29:58 <&Willie> ValueError: invalid literal for int() with base 10: '' (file
"/usr/share/jenni/modules/url.py", line 331, in ytinfo)

I shortened it to JUST the link + ?v=IDHERE (to experiment, and got the same error)

I went to the parser page and apparently this specific video this is what shows up on the parser:
START
PHP: youtube.php[60] Undefined index: YT:STATISTICS
PHP: youtube.php[60] Undefined index: YT:STATISTICS
TITLE: Tarte--I, an ex-priest, dialog with a local priest.
AUTHOR: edwardtarte 2012-01-21T17:19:06.000Z
DESCRIPTION: I present in this video 2 threads of my new dialog with him.
DURATION: 387
VIEWS:
FAVORITE: 0 0
RATING: Disabled
COMMENTS: 0
URL: http://www.youtube.com/watch?v=mLmSixeRAv4
UPDATED: 2012-01-21T17:25:51.000Z
END

(Parser link: http://rscript.org/lookup.php?type=youtubeinfo&id=mLmSixeRAv4 )

I have a feeling it's probably messing up because "VIEWS:" is blank.

(would've posted this in the other issue but I cannot reopen issues so it's easier to just make a new one)

.whois channel count

20:35:07 <&Willie> Jason is on the channels: ~#DCL ~#GOTSi ~#minecraft +#idle @#Jason @#WireShout
~#live &#YourPants ~#nyra &#Support @#opers

I'd like to propose changing "___ is on the channels:" to "____ is on x channels" where x is the total count.

tell: Double reminder

[1516.26] right brb people dont miss me too much
[1516.30] hazamanaz [[email protected]] has quit IRC: Quit:
[1517.07] <%Tyrope> Willie, tell hazamanaz people are devastated already.
[1517.08] <&Willie> Tyrope: I'll pass that on when hazamanaz is around.

[1525.24] hazamanaz [[email protected]] has joined #YourPants
[1525.41] did you miss me ?
[1525.42] <&Willie> hazamanaz: 14:17Z tell hazamanaz people are devastated already.
[1525.42] <&Willie> hazamanaz: 14:17Z tell hazamanaz people are devastated already.

Obviously not intended behavior.

.urban

Suggested replacing .o urban with .urban
Here's a a link to a potential parser to use. (although if urbandictionary.com can be used, even better!)

http://parsers.impactbot.com/?type=urban

The above parser also allows the user to specify which definition (so if a term has multiple definitions)
Suggested syntaxes:
.urban
.urban @Number
or
.urban @Number

After declaring timezone, .t parameter is ignored.

[1823.46] .t -4
[1823.47] <&Willie> Thu Apr 5 18:23:45 CEST 2012
[1823.56] .t UTC-4
[1823.56] <&Willie> Thu Apr 5 18:23:55 CEST 2012
[1824.12] .t PDT
[1824.14] <&Willie> Thu Apr 5 18:24:11 CEST 2012

.bomb target fix

when typing .bomb target some more words, you actually bomb "target some more words".

the .bomb target needs to be 1 word, and 1 word only. the rest should be discarded.

Fun command suggestion

When someone types 865-5309 perhaps make the bot say 'I'm Jenni!" or "That's me" (In reference to the song and because the bot uses 'jenni')

Probably pointless and not worth it. but it's funny (well it would eventually get pretty damn old. )

... The more I think about this the more I think this is lame.

Unset user settings make for odd output

Willie, I live near KALB
Gotcha, someuser
.t
someuser: Sorry, I don't know about the '' timezone.

Willie, I'm in the America/Chicago timezone
Gotcha, root
.weather
No ICAO code found, sorry

Both have different default messages that show up when a user hasn't set any settings.

Feature: UNO

Perhaps test and get UNO working. After all, UNO is a relatively popular game (popular game, in general).
Proposed changes to uno.py Change channel from ##uno to #uno (I see no reason for two ##'s)

Tweetwatch fails after an unknown time

No leads as to why this happens. My best guesses are an API issue, or possibly a Twitter problem. Maybe we could do it with RSS, using willie's account's subscriptions?

.whois

Whois does not work.
Well partially works. It succeeds in performing the /whois command, but then returns an error.

11:51:31 [127.0.0.1] !ftl.ca.us.nerdfighteria.net *** Willie (Willie@localhost) did a /whois on
you.

11:51:34 <&Willie> DEBUGMSG = (None, None, None, u'+#hangman #Test
+#rageland &#Mafia ~#YourPants ~#Joshua ~#idle ~#Support ~#opers ').
11:51:36 <&Willie> TypeError: cannot concatenate 'str' and 'NoneType' objects (file
"/usr/share/jenni/modules/whois.py", line 34, in sendwhois)

.at, similar to .in but with a set time

Pretty simple idea:

[00:00] <~Tyrope> .in 90m test in
[00:00] <&Willie> Tyrope: Okay, will remind at 01:03Z

[00:00] <~Tyrope> .at 01:30 test at
[00:00] <&Willie> Tyrope: Okay, will remind at 01:03Z

KeyError in .weather

The error: "KeyError: 'RA' (file "/usr/share/jenni/modules/weather.py", line 375, in f_weather)".

.weather Stavanger, Norway
.weather ENZV
.weather SVG

Every command returned with an error, and all of them are in Norway.

Translate output to other languages

Allow Willie to output in different languages in different channels. Also, pull .w and .wik results from the appropriate language's wiki.

.bomb permission

23:29:46 .bomb Vague_Tableau
23:29:46 <&Willie> Hey, Vague_Tableau! Don't look but, I think there's a bomb in your pants. 2
minute timer, 5 wires: Red, Yellow, Blue, White and Black. Which wire should I
cut? Don't worry, I know what I'm doing! (respond with .cutwire color)

.bomb needs to be triggerable by op and halfop ONLY, to prevent abuse. (regulars shouldn't have the ability to get people kicked. It completely derails the whole channel access system!)

Also perhaps not being able to bomb yourself? since you can cheat because it PMs the person that uses .bomb which therefore is totally pointless. (although it is a good testing method)

.mangle (discovered by Coyerre)

18:08:27 .mangle So how does this work then?
18:08:28 <&Willie> TypeError: 'str' object is not callable (file
"/usr/share/jenni/modules/translate.py", line 27, in translate)

Did my own test JUST TO MAKE SURE that the punctuation (see; ?) wasn't interfering in.
18:09:55 <~root> .mangle test
18:09:56 <&Willie> TypeError: 'str' object is not callable (file
"/usr/share/jenni/modules/translate.py", line 27, in translate)

.whois fails when nickname contains |

As the title says, .whois fails when a nickname has |

For reference, allowed characters in nicknames are:

a-z
0-9
[]
{}

\

_
^
|
`
(I don't think I missed any characters)

(cannot start with a number.. actually THOSE limitations (ex: cannot begin with...) are not an issue for .whois because that's dealt with server-side by the IRCd and the ircd will stop the person from using /nick if it is invalid based on those limitations/requirements)

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.