Giter VIP home page Giter VIP logo

phoenix616 / connectorplugin Goto Github PK

View Code? Open in Web Editor NEW
53.0 6.0 10.0 369 KB

Plugin to simplify communication between multiple Minecraft servers (and proxies) in a network. Supports plugin messages, redis and MQTT (e.g. using RabbitMQ or Google Cloud. MQTT is untested rn!). RedisBungee alternative.

Home Page: https://wiki.phoenix616.dev/plugin/connectorplugin/

License: GNU Affero General Public License v3.0

Java 100.00%
minecraft bungeecord bungee proxy bukkit paper redisbungee redis mqtt rabbitmq

connectorplugin's Introduction

ConnectorPlugin

Plugin to simplify communication between multiple Minecraft servers in a network (and their proxy). Support Spigot/Paper, BungeeCord and Velocity.

This includes a bridging utility and some basic commands to use the provided utility functionality but it is mostly meant to be depended on by other plugins so they can easily query and send data between servers without having to implement that logic themselves.

Features

  • Send arbitrary data to servers and proxies
  • Send commands to other servers and proxies
  • Server-side command registration from proxy
  • Location querying
  • Server state querying
  • Teleporting (Including multi-proxy player to player teleportation)
  • Proxy-side Vault/Tresor integration

Communication Methods

  • Plugin Messages (limited functionality)
  • peer-to-peer
  • redis pub sub
  • MQTT (E.g. with RabbitMQ)

Commands

On the Spigot server

/connectorplugin
Permission: connectorplugin.command
Aliases: connector, connectorcommand, connplugin, cp

teleport <player> <server> [<world> [<x> <y> <z> [<yaw> <pitch>]]]
Teleport a player to the specified server/world/location
Permission: connectorplugin.command.teleport
Aliases: tp, send

teleporttoplayer <player> [<targetplayer>]
Teleport yourself to the player or the player to the target player
Permission: connectorplugin.command.teleporttoplayer
Aliases: teleportplayer, tpp

servercommand <server> <command>...
Executes command in the console of the specified server
Permission: connectorplugin.command.servercommand
Aliases: serverconsole, serverconsolecommand, server, scc

servercommand p:<player> <command>...
Executes command in the console of the server the player is connected to
Permission: connectorplugin.command.servercommand
Aliases: serverconsole, serverconsolecommand, server, scc

proxycommand <command>...
Execute a command on all other proxies
Permission: connectorplugin.command.proxycommand
Aliases: proxyconsole, proxyconsolecommand, proxy, pcc

proxyplayercommand <player> <command>...
Execute a command as a player on the proxy they are connected to
Permission: connectorplugin.command.proxyplayercommand
Aliases: proxyplayer, player, ppc

On the Proxies

Main Bungee command

/connectorpluginbungee
Permission: connectorplugin.command
Aliases: connectorbungee, connectorcommandbungee, connpluginbungee, cpb

Main Velocity command

/connectorpluginvelocity
Permission: connectorplugin.command
Aliases: connectorvelocity, connectorcommandvelocity, connpluginvelocity, cpv

Proxy sub commands

teleport <player> <server> [<world> [<x> <y> <z> [<yaw> <pitch>]]]
Teleport a player to the specified server/world/location
Permission: connectorplugin.command.teleport
Aliases: tp, send

teleporttoplayer <player> [<targetplayer>]
Teleport yourself to the player or the player to the target player
Permission: connectorplugin.command.teleporttoplayer
Aliases: teleportplayer, tpp

servercommand <server> <command>...
Executes command in the console of the specified server
Permission: connectorplugin.command.servercommand
Aliases: serverconsole, serverconsolecommand, server, scc

servercommand p:<player> <command>...
Executes command in the console of the server the player is connected to
Permission: connectorplugin.command.servercommand
Aliases: serverconsole, serverconsolecommand, server, scc

serverplayercommand <player> <command>...
Execute a command as the target player on their server
Permission: connectorplugin.command.serverplayercommand
Aliases: serverplayer, player, spc

proxycommand <command>...
Execute a command on all other proxies
Permission: connectorplugin.command.proxycommand
Aliases: proxyconsole, proxyconsolecommand, proxy, pcc

Developer Info

Usage

Javadocs

Check the wiki for usage examples.

Maven Info

<repository>
    <id>minebench-repo</id>
    <url>https://repo.minebench.de/</url>
</repository>
<dependency>
    <groupId>de.themoep.connectorplugin</groupId>
    <artifactId>[bukkit|bungee|velocity]</artifactId>
    <version>1.2-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

Download

Latest development builds can be found on the Minebench.de Jenkins: https://ci.minebench.de/job/ConnectorPlugin/

License

This project is licensed under the AGPLv3:

 ConnectorPlugin
 Copyright (C) 2021 Max Lee aka Phoenix616 ([email protected])

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Affero General Public License as published
 by the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Affero General Public License for more details.

 You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <https://www.gnu.org/licenses/>.

connectorplugin's People

Contributors

phoenix616 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

connectorplugin's Issues

Add javadoc & source to maven artifacts πŸš€

Is your feature request related to a problem? Please describe.

The maven repo currently doesn't contain javadoc/source artifacts, making it a bit of hard to look up the code within IDE.

Describe the solution you'd like

Describe alternatives you've considered

Though it's possible to look up the online javadoc website, it would be much simpler to just look up from within the IDE.

Furthermore, the website loading speed is a bit slower for me, probably I'm too far from the web server ... :(

Productivity ++πŸš€πŸš€πŸš€πŸš€πŸš€

Additional context

Btw thanks for the amazing plugin library!

Unable to Utilize VelocityConnectorPlugin

Used Version

 [06:26:37 INFO]: Loaded plugin connectorplugin 1.3-SNAPSHOT (build 54) by Phoenix616

Config

# Plugin debugging
debug: true

# A unique ID for this proxy
server-id: "velocity-01"

# Currently supported types:
# - "plugin_messages" (will not be able to send messages to servers without any players online, messages will be queued)
# - "redis" (does not require any online players)
# - "mqtt" (does not require any online players)
messenger-type: redis

# Redis messenger settings
redis:
 host: 172.18.0.1
 port: 6380
 db: 0
 timeout: 60
 password: ***

Environment description

[09:12:10 INFO]: Velocity 3.1.2-SNAPSHOT (git-74edac96-b153)

Full Log

No output is produced.

What other programs/plugins are you running?

I am attempting to use my core plugin on Velocity to obtain the position of a player.

What is happening?

I register the VelocityConnectorPlugin here:
https://github.com/Paradisu/ParadisuPlugin/blob/master/velocity/src/main/java/net/paradisu/paradisuplugin/velocity/Paradisu.java#L69-L78
My plugin does seem to see it as connectorEnabled is logged as true on startup.

The command I am attempting to use (through the cloud framework) is registered here:
https://github.com/Paradisu/ParadisuPlugin/blob/master/velocity/src/main/java/net/paradisu/paradisuplugin/velocity/commands/command/LocateCommand.java#L34-L61

On running /locateplayer player, the only output produced is a logging of the connector instance and a message to the sender that the command was executed. Nothing in the whenComplete seens to occur, so I think that the completable future is just never returning. I could not find any examples of registering the plugin on Velocity, so I tried as best I could. It is very possible I messed up.

I has also tried bringing in LocationInfo and manually completing a completable future with some dummy location info. Passing that into whenComplete successfully returns the location info.

Also, I should add that the actions themselves that are called from the bridge do, in fact, occur. For example, calling teleport here:
https://github.com/Paradisu/ParadisuPlugin/blob/master/velocity/src/main/java/net/paradisu/paradisuplugin/velocity/commands/command/TeleportCommand.java#L33-L52

However, if I attempt to place the sendMessage in the whenComplete, neither the success nor the failure condition is ever executed. So it would seem that something specific to velocity is going on here with the completable futures, and whatever it is seems to be shared by, at minimum, all of the bridge methods.

What did you expect to happen?

The location info should be returned by the completable future.

Additional context

Also discussed over Discord with phoenix616. Posting here as well for completeness and to consolidate all the information.

The ConnectorPlugin inbuilt commands work flawlessly, so I do not believe there is an issue with the messaging between the servers.

Plugin Does Not Load

Used Version

Build #30

Config

I don't have one, it didn't load.

Environment description

Windows 10 Pro 64 Bit, American English, Velocity 3.1.0 #92

Full Log

https://srcb.in/hms8rERuJM

What other programs/plugins are you running?

Only ConnectorPlugin.

What is happening?

Plugin does not load.

What did you expect to happen?

I was expecting plugin to work?

Cross server transfer failed

What is happening?

I tried using commands to tp me to another player
/connectorplugin teleporttoplayer RoYing BoHer
and /connectorpluginvelocity teleporttoplayer RoYing BoHer

But they didn't teleport me to the player's side on another server
log :Could not find server absurdworld-login on this proxy to send player RoYing to

What did you expect to happen?

Transfer to another server and reach the player's side

Version

1.5.2-SNAPSHOT (build 87)

Config

[VC config]
server-id: "absurdworld"
messenger-type: redis
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
[BBBB server config]
messenger-type: redis
group: global
plugin-groups:
  pluginname: specialgroup
server-name: absurdworld-login
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
[AAAA server config,in this server user command]
messenger-type: redis
group: global
plugin-groups:
  pluginname: specialgroup
server-name: absurdworld

Server/system Version

vc3.3.0,paper1.12.2 andpaper1.20.4

Log

[paper log]
[19:33:15 INFO]: RoYing issued server command: /connectorplugin teleporttoplayer RoYing BoHer
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
[VC log]
[connectorplugin]: [DEBUG] Could not find server absurdworld-login on this proxy to send player RoYing to

What other programs/plugins are you running?

ViaRewind-3.0.6
ViaBackwards-4.9.2
ViaVersion-4.9.3
authmereload5.6.0

Additional context

I tried to match server name with server id、Server name is different from server id、Each server has a different server name
It's of no use

Support teleporting to a player that is connected to a different proxy

Is your feature request related to a problem? Please describe.

Currently it is only possible to teleport to players on the same proxy. (Possible necessary for messages/commands too?)

Describe the solution you'd like

Teleportation to be possible to the player even if on another proxy. Should error if the player's target server isn't in our current proxy.

Describe alternatives you've considered

Custom teleportation code

Additional context

Currently no attempt is made to get a player that is not on our current proxy so the player will simply not exist from the perspective of the proxy/spigot plugin itself. In such a case we need to ask any other known proxy if they have that player and get us the info/execute the wanted action.

ConnectorPlugin cannot connect to Redis

Used Version

Config

debug: true

# Currently supported types:
# - "plugin_messages" (will not be able to send messages from server without any players online)
# - "redis" (does not require online players)
# - "mqtt" (does not require online players)
messenger-type: redis

# The group this server is in
group: global

# Should be the same name as in the proxy config
server-name: glevmaya

# Redis messenger settings
redis:
 host: localhost
 port: 6379
 db: 60
 timeout: 60
 password: XXX

# Mqtt messenger settings
mqtt:
 broker-uri: tcp://localhost:1883
 keep-alive: 30
 username: mqttuser
 password: password1

Environment description

Windows 11, MySQL 8.0.27, PHP 8.1.0, Redis 6.2, JDK 17, ConnectorPlugin (latest as of right now), Paper 1.18, Velocity 1.18

Full Log

[16:11:27 ERROR]: Error occurred while enabling ConnectorPlugin v1.2.1-SNAPSHOT (build 43) (Is it up to date?)
de.themoep.connectorplugin.lib.lettuce.core.RedisConnectionException: Unable to connect to localhost/<unresolved>:6379
        at de.themoep.connectorplugin.lib.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:56) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.AbstractRedisClient.getConnection(AbstractRedisClient.java:330) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.RedisClient.connectPubSub(RedisClient.java:363) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.connector.RedisConnection.<init>(RedisConnection.java:71) ~[ConnectorPlugin.jar:?]        at de.themoep.connectorplugin.bukkit.connector.RedisConnector.<init>(RedisConnector.java:37) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.bukkit.BukkitConnectorPlugin.onEnable(BukkitConnectorPlugin.java:68) ~[ConnectorPlugin.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:561) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:475) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:729) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:505) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:315) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1204) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:319) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: de.themoep.connectorplugin.lib.lettuce.core.RedisCommandExecutionException: ERR Client sent AUTH, but no password is set
        at de.themoep.connectorplugin.lib.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:137) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:110) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:120) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:111) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:746) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.pubsub.PubSubCommandHandler.complete(PubSubCommandHandler.java:167) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:681) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.pubsub.PubSubCommandHandler.decode(PubSubCommandHandler.java:112) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:598) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[ConnectorPlugin.jar:?]
        at de.themoep.connectorplugin.lib.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[ConnectorPlugin.jar:?]
        ... 1 more
[16:11:27 INFO]: [ConnectorPlugin] Disabling ConnectorPlugin v1.2.1-SNAPSHOT (build 43)
[16:11:27 ERROR]: Error occurred while disabling ConnectorPlugin v1.2.1-SNAPSHOT (build 43) (Is it up to date?)
java.lang.NullPointerException: Cannot invoke "de.themoep.connectorplugin.bukkit.connector.BukkitConnector.close()" because "this.connector" is null
        at de.themoep.connectorplugin.bukkit.BukkitConnectorPlugin.onDisable(BukkitConnectorPlugin.java:82) ~[ConnectorPlugin.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:266) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:401) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:538) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:376) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[pufferfish-api-1.18.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:561) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:475) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:729) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:505) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:315) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1204) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:319) ~[pufferfish-1.18.1.jar:git-Pufferfish-47]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]

What is happening?

Everything is running properly, and I've confirmed the redis server is online, however connectorplugin isn't connecting to it upon startup

What did you expect to happen?

Connectorplugin connecting to redis

Additional info

We tried disabling the firewall, still no luck.

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.