Giter Site home page Giter Site logo

squadjs's Introduction

Logo Logo

SquadJS

GitHub release GitHub contributors GitHub release


GitHub issues GitHub pull requests GitHub issues Discord



About

SquadJS is a scripting framework, designed for Squad servers, that aims to handle all communication and data collection to and from the servers. Using SquadJS as the base to any of your scripting projects allows you to easily write complex plugins without having to worry about the hassle of RCON or log parsing. However, for your convenience SquadJS comes shipped with multiple plugins already built for you allowing you to experience the power of SquadJS right away.


Using SquadJS

SquadJS relies on being able to access the Squad server log directory in order to parse logs live to collect information. Thus, SquadJS must be hosted on the same server box as your Squad server or be connected to your Squad server via FTP.

Prerequisites

Installation

  1. Download SquadJS and unzip the download.
  2. Open the unzipped folder in your terminal.
  3. Install the dependencies by running yarn install in your terminal. Due to the use of Yarn Workspaces it is important to use yarn install and not npm install as this will not work and will break stuff.
  4. Configure the config.json file. See below for more details.
  5. Start SquadJS by running node index.js in your terminal.

Note - If you are interested in testing versions of SquadJS not yet released please download/clone the master branch. Please also see here for more information on our versions and release procedures.


Configuring SquadJS

SquadJS can be configured via a JSON configuration file which, by default, is located in the SquadJS and is named config.json.

The config file needs to be valid JSON syntax. If an error is thrown saying the config cannot be parsed then try putting the config into a JSON syntax checker (there's plenty to choose from that can be found via Google).

Server

Server Configuration

The following section of the configuration contains information about your Squad server.

"server": {
  "id": 1,
  "host": "xxx.xxx.xxx.xxx",
  "queryPort": 27165,
  "rconPort": 21114,
  "rconPassword": "password",
  "logReaderMode": "tail",
  "logDir": "C:/path/to/squad/log/folder",
  "ftp":{
    "host": "xxx.xxx.xxx.xxx",
    "port": 21,
    "user": "FTP Username",
    "password": "FTP Password",
    "useListForSize": false
  },
  "adminLists": [
    {
      "type": "local",
      "source": "C:/Users/Administrator/Desktop/Servers/sq_arty_party/SquadGame/ServerConfig/Admins.cfg",
    },
    {
      "type": "remote",
      "source": "http://yourWebsite.com/Server1/Admins.cfg",
    }
  ]
},
  • id - An integer ID to uniquely identify the server.

  • host - The IP of the server.

  • queryPort - The query port of the server.

  • rconPort - The RCON port of the server.

  • rconPassword - The RCON password of the server.

  • logReaderMode - tail will read from a local log file. ftp will read from a remote log file using the FTP protocol.

  • logDir - The folder where your Squad logs are saved. Most likely will be C:/servers/squad_server/SquadGame/Saved/Logs.

  • ftp:port - The FTP port of the server. Only required for ftp logReaderMode.

  • ftp:user - The FTP user of the server. Only required for ftp logReaderMode.

  • ftp:password - The FTP password of the server. Only required for ftp logReaderMode.

  • adminLists - Sources for identifying an admins on the server, either remote or local.


Connectors

Connector Configuration

Connectors allow SquadJS to communicate with external resources.

"connectors": {
  "discord": "Discord Login Token",
},

Connectors should be named, for example the above is named discord, and should have the associated config against it. Configs can be specified by name in plugin options. Should a connector not be needed by any plugin then the default values can be left or you can remove it from your config file.

See below for more details on connectors and their associated config.

Discord

Connects to Discord via discord.js.

"discord": "Discord Login Token",

Requires a Discord bot login token.

Databases

SquadJS uses Sequelize to connect and use a wide range of SQL databases.

The connector should be configured using any of Sequelize's single argument configuration options.

For example:

"mysql": "mysql://user:[email protected]:5432/dbname"

or:

"sqlite": {
    "dialect": "sqlite",
    "storage": "path/to/database.sqlite"
}

See Sequelize's documentation for more details.


Plugins

Plugin Configuration

The plugins section in your config file lists all plugins built into SquadJS

  "plugins": [
    {
      "plugin": "auto-tk-warn",
      "disabled": false,
      "message": "Please apologise for ALL TKs in ALL chat!"
    }
  ]

The disabled field can be toggled between true/ false to enabled/disable the plugin.

Plugin options are also specified. A full list of plugin options can be seen below.


Verboseness

Console Output Configuration

The logger section configures how verbose a module of SquadJS will be as well as the displayed color.

  "logger": {
    "verboseness": {
      "SquadServer": 1,
      "LogParser": 1,
      "RCON": 1
    },
    "colors": {
      "SquadServer": "yellowBright",
      "SquadServerFactory": "yellowBright",
      "LogParser": "blueBright",
      "RCON": "redBright"
    }
  }

The larger the number set in the verboseness section for a specified module the more it will print to the console.



Plugins

The following is a list of plugins built into SquadJS, you can click their title for more information:

Interested in creating your own plugin? See more here

AutoKickUnassigned

AutoKickUnassigned

The AutoKickUnassigned plugin will automatically kick players that are not in a squad after a specified ammount of time.

Options

  • warningMessage

    Description

    Message SquadJS will send to players warning them they will be kicked

    Default
    Join a squad, you are unassigned and will be kicked
  • kickMessage

    Description

    Message to send to players when they are kicked

    Default
    Unassigned - automatically removed
  • frequencyOfWarnings

    Description

    How often in Seconds should we warn the player about being unassigned?

    Default
    30
  • unassignedTimer

    Description

    How long in Seconds to wait before a unassigned player is kicked

    Default
    360
  • playerThreshold

    Description

    Player count required for AutoKick to start kicking players, set to -1 to disable

    Default
    93
  • roundStartDelay

    Description

    Time delay in Seconds from start of the round before AutoKick starts kicking again

    Default
    900
  • ignoreAdmins

    Description

    • true: Admins will NOT be kicked
    • false: Admins WILL be kicked

    Default
    false
  • ignoreWhitelist

    Description

    • true: Reserve slot players will NOT be kicked
    • false: Reserve slot players WILL be kicked

    Default
    false
AutoTKWarn

AutoTKWarn

The AutoTkWarn plugin will automatically warn players with a message when they teamkill.

Options

  • attackerMessage

    Description

    The message to warn attacking players with.

    Default
    Please apologise for ALL TKs in ALL chat!
  • victimMessage

    Description

    The message that will be sent to the victim.

    Default
    null
CBLInfo

CBLInfo

The CBLInfo plugin alerts admins when a harmful player is detected joining their server based on data from the Community Ban List.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to alert admins through.

    Default
  • Example
    667741905228136459
  • threshold

    Description

    Admins will be alerted when a player has this or more reputation points. For more information on reputation points, see the Community Ban List's FAQ

    Default
    6
ChatCommands

ChatCommands

The ChatCommands plugin can be configured to make chat commands that broadcast or warn the caller with present messages.

Options

  • commands

    Description

    An array of objects containing the following properties:

    • command - The command that initiates the message.
    • type - Either warn or broadcast.
    • response - The message to respond with.
    • ignoreChats - A list of chats to ignore the commands in. Use this to limit it to admins.

    Default
    [
      {
        "command": "squadjs",
        "type": "warn",
        "response": "This server is powered by SquadJS.",
        "ignoreChats": []
      }
    ]
DBLog

DBLog

The mysql-log plugin will log various server statistics and events to a database. This is great for server performance monitoring and/or player stat tracking.

Grafana:

  • Grafana is a cool way of viewing server statistics stored in the database.
  • Install Grafana.
  • Add your database as a datasource named SquadJS.
  • Import the SquadJS Dashboard to get a preconfigured MySQL only Grafana dashboard.
  • Install any missing Grafana plugins.

Options

  • database (Required)

    Description

    The Sequelize connector to log server information to.

    Default
    mysql
  • overrideServerID

    Description

    A overridden server ID.

    Default
    null
DiscordAdminBroadcast

DiscordAdminBroadcast

The DiscordAdminBroadcast plugin will send a copy of admin broadcasts made in game to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log admin broadcasts to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embed.

    Default
    16761867
DiscordAdminCamLogs

DiscordAdminCamLogs

The DiscordAdminCamLogs plugin will log in game admin camera usage to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log admin camera usage to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embed.

    Default
    16761867
DiscordAdminRequest

DiscordAdminRequest

The DiscordAdminRequest plugin will ping admins in a Discord channel when a player requests an admin via the !admin command in in-game chat.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log admin broadcasts to.

    Default
  • Example
    667741905228136459
  • ignoreChats

    Description

    A list of chat names to ignore.

    Default
    []
  • Example
    [
      "ChatSquad"
    ]
  • ignorePhrases

    Description

    A list of phrases to ignore.

    Default
    []
  • Example
    [
      "switch"
    ]
  • command

    Description

    The command that calls an admin.

    Default
    admin
  • pingGroups

    Description

    A list of Discord role IDs to ping.

    Default
    []
  • Example
    [
      "500455137626554379"
    ]
  • pingHere

    Description

    Ping @here. Great if Admin Requests are posted to a Squad Admin ONLY channel, allows pinging only Online Admins.

    Default
    false
  • pingDelay

    Description

    Cooldown for pings in milliseconds.

    Default
    60000
  • color

    Description

    The color of the embed.

    Default
    16761867
  • warnInGameAdmins

    Description

    Should in-game admins be warned after a players uses the command and should we tell how much admins are active in-game right now.

    Default
    false
  • showInGameAdmins

    Description

    Should players know how much in-game admins there are active/online?

    Default
    true
DiscordChat

DiscordChat

The DiscordChat plugin will log in-game chat to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log admin broadcasts to.

    Default
  • Example
    667741905228136459
  • chatColors

    Description

    The color of the embed for each chat.

    Default
    {}
  • Example
    {
      "ChatAll": 16761867
    }
  • color

    Description

    The color of the embed.

    Default
    16761867
  • ignoreChats

    Description

    A list of chat names to ignore.

    Default
    [
      "ChatSquad"
    ]
DiscordDebug

DiscordDebug

The DiscordDebug plugin can be used to help debug SquadJS by dumping SquadJS events to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log events to.

    Default
  • Example
    667741905228136459
  • events (Required)

    Description

    A list of events to dump.

    Default
    []
  • Example
    [
      "PLAYER_DIED"
    ]
DiscordFOBHABExplosionDamage

DiscordFOBHABExplosionDamage

The DiscordFOBHABExplosionDamage plugin logs damage done to FOBs and HABs by explosions to help identify engineers blowing up friendly FOBs and HABs.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log FOB/HAB explosion damage to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embeds.

    Default
    16761867
DiscordKillFeed

DiscordKillFeed

The DiscordKillFeed plugin logs all wounds and related information to a Discord channel for admins to review.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log teamkills to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embeds.

    Default
    16761867
  • disableCBL

    Description

    Disable Community Ban List information.

    Default
    false
DiscordPlaceholder

DiscordPlaceholder

The DiscordPlaceholder plugin allows you to make your bot create placeholder messages that can be used when configuring other plugins.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • command

    Description

    Command to create Discord placeholder.

    Default
    !placeholder
  • channelID (Required)

    Description

    The bot will only answer with a placeholder on this channel

    Default
DiscordRcon

DiscordRcon

The DiscordRcon plugin allows a specified Discord channel to be used as a RCON console to run RCON commands.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    ID of channel to turn into RCON console.

    Default
  • Example
    667741905228136459
  • permissions

    Description

    • Dictionary of roles and a list of the permissions they are allowed to use.
    • If dictionary is empty ({}) permissions will be disabled
    • A list of available RCON commands can be found here https://squad.gamepedia.com/Server_Administration#Admin_Console_Commands.

    Default
    {}
  • Example
    {
      "123456789123456789": [
        "AdminBroadcast",
        "AdminForceTeamChange",
        "AdminDemoteCommander"
      ]
    }
  • prependAdminNameInBroadcast

    Description

    Prepend admin names when making announcements.

    Default
    false
DiscordRoundWinner

DiscordRoundWinner

The DiscordRoundWinner plugin will send the round winner to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log admin broadcasts to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embed.

    Default
    16761867
DiscordRoundEnded

DiscordRoundEnded

The DiscordRoundEnded plugin will send the round winner to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log round end events to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embed.

    Default
    16761867
DiscordServerStatus

DiscordServerStatus

The DiscordServerStatus plugin can be used to get the server status in Discord.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • messageStore (Required)

    Description

    Sequelize connector name.

    Default
    sqlite
  • command

    Description

    Command name to get message.

    Default
    !status
  • disableSubscriptions

    Description

    Whether to allow messages to be subscribed to automatic updates.

    Default
    false
  • updateInterval

    Description

    How frequently to update the time in Discord.

    Default
    60000
  • setBotStatus

    Description

    Whether to update the bot's status with server information.

    Default
    true
DiscordSquadCreated

DiscordSquadCreated

The SquadCreated plugin will log Squad Creation events to a Discord channel.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log Squad Creation events to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embed.

    Default
    16761867
  • useEmbed

    Description

    Send message as Embed

    Default
    true
DiscordSubsystemRestarter

DiscordSubsystemRestarter

The DiscordSubSystemRestarter plugin allows you to manually restart SquadJS subsystems in case an issues arises with them.

  • !squadjs restartsubsystem rcon
  • !squadjs restartsubsystem logparser

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • role (Required)

    Description

    ID of role required to run the sub system restart commands.

    Default
  • Example
    667741905228136459
DiscordTeamkill

DiscordTeamkill

The DiscordTeamkill plugin logs teamkills and related information to a Discord channel for admins to review.

Options

  • discordClient (Required)

    Description

    Discord connector name.

    Default
    discord
  • channelID (Required)

    Description

    The ID of the channel to log teamkills to.

    Default
  • Example
    667741905228136459
  • color

    Description

    The color of the embeds.

    Default
    16761867
  • disableCBL

    Description

    Disable Community Ban List information.

    Default
    false
FogOfWar

FogOfWar

The FogOfWar plugin can be used to automate setting fog of war mode.

Options

  • mode

    Description

    Fog of war mode to set.

    Default
    1
  • delay

    Description

    Delay before setting fog of war mode.

    Default
    10000
IntervalledBroadcasts

IntervalledBroadcasts

The IntervalledBroadcasts plugin allows you to set broadcasts, which will be broadcasted at preset intervals

Options

  • broadcasts

    Description

    Messages to broadcast.

    Default
    []
  • Example
    [
      "This server is powered by SquadJS."
    ]
  • interval

    Description

    Frequency of the broadcasts in milliseconds.

    Default
    300000
SeedingMode

SeedingMode

The SeedingMode plugin broadcasts seeding rule messages to players at regular intervals when the server is below a specified player count. It can also be configured to display "Live" messages when the server goes live.

Options

  • interval

    Description

    Frequency of seeding messages in milliseconds.

    Default
    150000
  • seedingThreshold

    Description

    Player count required for server not to be in seeding mode.

    Default
    50
  • seedingMessage

    Description

    Seeding message to display.

    Default
    Seeding Rules Active! Fight only over the middle flags! No FOB Hunting!
  • liveEnabled

    Description

    Enable "Live" messages for when the server goes live.

    Default
    true
  • liveThreshold

    Description

    Player count required for "Live" messages to not bee displayed.

    Default
    52
  • liveMessage

    Description

    "Live" message to display.

    Default
    Live!
  • waitOnNewGames

    Description

    Should the plugin wait to be executed on NEW_GAME event.

    Default
    true
  • waitTimeOnNewGame

    Description

    The time to wait before check player counts in seconds.

    Default
    30
SocketIOAPI

SocketIOAPI

The SocketIOAPI plugin allows remote access to a SquadJS instance via Socket.IO
As a client example you can use this to connect to the socket.io server;


      const socket = io.connect('ws://IP:PORT', {
        auth: {
          token: "MySecretPassword"
        }
      })
    
If you need more documentation about socket.io please go ahead and read the following;
General Socket.io documentation: Socket.io Docs
Authentication and securing your websocket: Sending-credentials
How to use, install and configure a socketIO-client: Usage Guide with Examples

Options

  • websocketPort (Required)

    Description

    The port for the websocket.

    Default
  • Example
    3000
  • securityToken (Required)

    Description

    Your secret token/password for connecting.

    Default
  • Example
    MySecretPassword
TeamRandomizer

TeamRandomizer

The TeamRandomizer can be used to randomize teams. It's great for destroying clan stacks or for social events. It can be run by typing, by default, !randomize into in-game admin chat

Options

  • command

    Description

    The command used to randomize the teams.

    Default
    randomize

Statement on Accuracy

Some information SquadJS collects from Squad servers was never intended or designed to be collected. As a result, it is impossible for any framework to collect the same information with 100% accuracy. SquadJS aims to get as close as possible to that figure, however, it acknowledges that this is not possible in some specific scenarios.

Below is a list of scenarios we know may cause some information to be inaccurate:

  • Use of Realtime Server and Player Information - We update server and player information periodically every 30 seconds (by default) or when we know that it requires an update. As a result, some information about the server or players may be up to 30 seconds out of date or greater if an error occurs whilst updating this information.
  • SquadJS Restarts - If SquadJS is started during an active Squad game some information will be lost or not collected correctly:
    • The current state of players will be lost. For example, if a player was wounded prior to the bot starting and then is revived/gives up after the bot is started information regarding who originally wounded them will not be known.
    • The accurate collection of some server log events will not occur. SquadJS collects players' "suffix" name, i.e. their Steam name without the clan tag added via the game settings, when they join the server and uses this to identify them in certain logs that do not include their full name. As a result, for players connecting prior to SquadJS starting some log events associated with their actions will show the player as null.
  • Duplicated Player Names - If two or more players have the same name or suffix name (see above) then SquadJS will be unable to identify them in the logs. When this occurs event logs will show the player as null. Be on the watch for groups of players who try to abuse this in order to TK or complete other malicious actions without being detected by SquadJS plugins.

SquadJS API

SquadJS pings the following data to the SquadJS API at regular intervals to assist with its development:

  • Squad server IP, query port, name & player count (including queue size).
  • SquadJS version.
  • Log reader mode, i.e. tail or ftp.
  • Plugin configuration.

At this time, this cannot be disabled.

Please note, plugin configurations do not and should not contain any sensitive information which allows us to collect this information. Any sensitive information, e.g. Discord login tokens, should be included in the connectors section of the config which is not sent to our API. It is important that developers of custom plugins maintain this approach to avoid submitting confidential information to our API.

Versions and Releases

Whilst installing SquadJS you may do the following to obtain slightly different versions:

  • Download the latest release - To get the latest stable version of SquadJS.
  • Download/clone the master branch - To get the most up to date version of SquadJS.

All changes proposed to SquadJS will be merged into the master branch prior to being released in the next stable version to allow for a period of larger-scale testing to occur. Therefore, we only recommend individuals who are willing to update regularly and partake in testing/bug reporting use the master branch. Please note, updates to the master branch will not be advertised in the SquadJS startup information, however, notifications of merged pull requests into the master branch may be found in our Discord. Once the master branch is deemed stable a release will be published and advertised via the SquadJS startup information and our Discord.

Releases will be given a version number with the format v{major}.{minor}.{patch}, e.g. v3.1.4. Changes to {major}/{minor}/{patch} will imply the following:

  • {major} - The release contains a new/updated feature that is (potentially) breaking, e.g. changes to event outputs that may cause custom plugins to break.
  • {minor} - The release contains a new/updated feature.
  • {patch} - The release contains a bug fix.

Please note, {minor}/{patch} releases may still break SquadJS installations, however, this may be prevented with configuration changes and should not require custom plugins to be updated.

Release version numbers and changelogs are managed by Release Drafter which relies on the appropriate labels being applied to pull requests. Version numbers are updated in the package.json file manually prior to publishing the release draft.

The above policy was written and put into effect after the release of SquadJS v2.0.5. A major version bump to SquadJS v3.0.0 was made to signify this policy taking affect and to draw a line under the previous poor management of releases and version numbers.

Credits

SquadJS would not be possible without the support of so many individuals and organisations. Our thanks goes out to:

  • SquadJS's contributors.
  • Thomas Smyth's GitHub sponsors.
  • subtlerod for proposing the initial log parsing idea, helping to design the log parsing process and for providing multiple servers to test with.
  • Shanomac99 and the rest of the Squad Wiki team for providing us with layer information.
  • Fourleaf, Mex, various members of ToG / ToG-L and others that helped to stage logs and participate in small scale tests.
  • Various Squad servers/communities for participating in larger scale tests and for providing feedback on plugins.
  • Everyone in the Squad RCON Discord and others who have submitted bug reports, suggestions, feedback and provided logs.

License

Boost Software License - Version 1.0 - August 17th, 2003

Copyright (c) 2020 Thomas Smyth

Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:

The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

squadjs's People

Contributors

codereddev avatar dbrezack avatar drkittens avatar ect0s avatar fantinodavide avatar got2bhockey avatar ignisalienus avatar leventhan avatar luismartinschick avatar mbartisan avatar milutinke avatar mxrcode avatar pull[bot] avatar reck1610 avatar seanwalsh95 avatar sentennial avatar sergelouie6 avatar shanomac99 avatar steelskillet avatar thomas-smyth avatar ulibos avatar vohk avatar werewolfboy13 avatar wiilover22 avatar xcausxn avatar zer0-1ne 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

squadjs's Issues

Unable to start

I have install the requirements.
But I got
import Server from 'squad-server'; SyntaxError: Cannot use import statement outside a module
Error, I tried to use babel or it's unable to use 'import' function.
Could you tell me how you config your enviroment, I am a very new guy to Node.JS.
Forgive me for my rashness, thank you.

`!skipmap` ignoring `minVoteCount` parameter

Description of Issue

!skipmap ignoring minVoteCount parameter.
Minimum vote count seems to be ignored when deciding if a vote was succesful or not.

Errors or Screenshots of Issue

Squad Information

  • Plugins in Use: All
  • SquadJS Version: Latest

Plugin: discord-admin-request, support multiple admin prefixes

What is the issue, e.g. map voting, you would like to solve?

Since Caps Lock is bound to a key within game, we often see admin reports coming in as !ADMIN. Since the admin-request plugin only looks for !admin (case sensitive), these all caps admin requests are not forwarded into our discord channel.

How would you like us to solve this issue?

This could be solved by either making the detection for !admin non-case-sensitive or by making the "adminPrefix" config entry support multiple admin commands (e.g: !admin, !ADMIN).

Generic `!command` chat commands

What is the issue, e.g. map voting, you would like to solve?

A lot of servers use chat commands, e.g. !discord, to provide information to players, but SquadJS does not have a plugin to allow this yet.

How would you like us to solve this issue?

Commands will likely fall into one of the following categories:

  • Player run commands to get info, e.g. !discord to display a Discord invite link.
  • Admin run commands to announce preset messages, e.g. !seed reminds players of the seeding rules.

For player-run commands, we only need to send the information back to the caller, so warnings can be used. For admin-run commands, we need to send the information to all players so we want to use broadcasts.

However, I think approaching this as generically as possible is best so that we provide flexibility to SquadJS users to configure it exactly how they want in the config. Therefore, I propose that for each command we provide the following options:

  • Command - The command name, e.g. !discord.
  • Action Type - Warn or broadcast.
  • Response - The text to use in the warning/broadcast.
  • ignoreChats - An array of chats it does not apply to. This can be used to limit it to admins only.

That would look something like this:

    {
      "plugin": "chat-commands",
      "enabled": false,
      "commands": [
        {
          "command": "!discord",
          "type": "warn",
          "response": "discord.io/smoking-rifles",
          "ignoreChats": ["ChatSquad"]
        },
        {
          "command": "!seed",
          "type": "broadcast",
          "response": "Seeding most is active...",
          "ignoreChats": ["ChatAll", "ChatTeam", "ChatSquad"]
        }
      ]

AdminBroadcast Logging

What is the issue, e.g. map voting, you would like to solve?

AdminBroadcasts aren't parsed or logged.

How would you like us to solve this issue?

Add AdminBroadcast parsing and logging to Discord, etc.

Yarn Install command is failing on a new box install

Description of Issue

When tring to install on a new box yarn install fails.

Errors or Screenshots of Issue

`C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot>yarn
yarn install v1.22.5
info No lockfile found.
[1/4] Resolving packages...
warning squad-server > gamedig > cheerio > [email protected]: Use cheerio-select instead
warning squad-server > sqlite3 > node-gyp > [email protected]: request has been deprecated, see request/request#3142
warning squad-server > tedious > adal-node > [email protected]: request has been deprecated, see request/request#3142
warning squad-server > sqlite3 > node-gyp > request > [email protected]: this library is no longer supported
warning [email protected]: standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: standard/standard#1316
warning workspace-aggregator-1848a0b2-ca7e-4876-b247-afbacdc3b33b > [email protected]: standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: standard/standard#1316
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
[1/2] ⠁ sqlite3
error C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3: Command failed.
Exit code: 1
Command: node-pre-gyp install --fallback-to-build
Arguments:
Directory: C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3
Output:
node-pre-gyp info it worked if it ends with ok
node-pre-gyp info using [email protected]
node-pre-gyp info using [email protected] | win32 | x64
node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp info check checked for "C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64\node_sqlite3.node" (not found)
node-pre-gyp http GET https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v5.0.1/napi-v6-win32-x64.tar.gz
node-pre-gyp http 403 https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v5.0.1/napi-v6-win32-x64.tar.gz
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v5.0.1/napi-v6-win32-x64.tar.gz
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v88 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp http 403 status code downloading tarball https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v5.0.1/napi-v6-win32-x64.tar.gz
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | win32 | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | win32 | x64
gyp ERR! configure error
gyp ERR! stack Error: Command failed: C:\Python39\python.EXE -c import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack File "", line 1
gyp ERR! stack import sys; print "%s.%s.%s" % sys.version_info[:3];
gyp ERR! stack ^
gyp ERR! stack SyntaxError: invalid syntax
gyp ERR! stack
gyp ERR! stack at ChildProcess.exithandler (node:child_process:333:12)
gyp ERR! stack at ChildProcess.emit (node:events:376:20)
gyp ERR! stack at maybeClose (node:internal/child_process:1063:16)
gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:295:5)
gyp ERR! System Windows_NT 10.0.14393
gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\node-gyp\bin\node-gyp.js" "configure" "--fallback-to-build" "--module=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64\node_sqlite3.node" "--module_name=node_sqlite3" "--module_path=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64" "--napi_version=7" "--node_abi_napi=napi" "--napi_build_version=6" "--node_napi_label=napi-v6"
gyp ERR! cwd C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3
gyp ERR! node -v v15.5.1
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute 'C:\Program Files\nodejs\node.exe C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64\node_sqlite3.node --module_name=node_sqlite3 --module_path=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64 --napi_version=7 --node_abi_napi=napi --napi_build_version=6 --node_napi_label=napi-v6' (1)
node-pre-gyp ERR! stack at ChildProcess. (C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\node-pre-gyp\lib\util\compile.js:83:29)
node-pre-gyp ERR! stack at ChildProcess.emit (node:events:376:20)
node-pre-gyp ERR! stack at maybeClose (node:internal/child_process:1063:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:295:5)
node-pre-gyp ERR! System Windows_NT 10.0.14393
node-pre-gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\node-pre-gyp\bin\node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3
node-pre-gyp ERR! node -v v15.5.1
node-pre-gyp ERR! node-pre-gyp -v v0.11.0
node-pre-gyp ERR! not ok
Failed to execute 'C:\Program Files\nodejs\node.exe C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\node-gyp\bin\node-gyp.js configure --fallback-to-build --module=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64\node_sqlite3.node --module_name=node_sqlite3 --module_path=C:\Users\Administrator\Desktop\Servers\Spaghetti-Bot\node_modules\sqlite3\lib\binding\napi-v6-win32-x64 --napi_version=7 --node_abi_napi=napi --napi_build_version=6 --node_napi_label=napi-v6' (1)

`

Squad Information

  • SquadJS Version: beta branch current
  • Squad Version: current

System Information

  • Operating System: 10 server 2016
  • NodeJS Version: current
  • Yarn Version: currnet

SCBL plugin crash

Description of Issue

SCBL plugin causes crashes.

Errors or Screenshots of Issue

file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/scbl-info.js:95
if (data.steamUser.reputationPoints < this.options.threshold)
^

TypeError: Cannot read property 'reputationPoints' of null
at SCBLInfo.onPlayerConnected (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/scbl-info.js:95:24)
at processTicksAndRejections (node:internal/process/task_queues:93:5)

Squad Information

  • Plugins in Use:
  • SquadJS Version: current beta branch
  • Squad Version: 1.0

System Information

  • Operating System: server 2016
  • NodeJS Version: current
  • Yarn Version: currnet

RCON ERR_BUFFER_OUT_OF_BOUNDS

Description of Issue

ListPlayer is causing RCON to crash.

The example below was taken from a Russian server so it is quite likely that some different characters are being used that are not being used on the EU/US servers SquadJS is primarily used on. That means it's likely an encoding issue. We should try some of these player names in the info below to see if we can replicate the crash.

Errors or Screenshots of Issue

[1598371049314] RCON (Verbose): Method Exec: execute(ShowNextMap)
[1598371062832] RCON (Verbose): Method Exec: execute(ListPlayers)
internal/buffer.js:79
    throw new ERR_BUFFER_OUT_OF_BOUNDS();
    ^

RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds
    at boundsError (internal/buffer.js:79:11)
    at Buffer.readInt32LE (internal/buffer.js:385:5)
    at Rcon.decodePacket (file:///home/kry/SquadJS/squad-server/rcon/index.js:301:17)
    at Rcon.onData (file:///home/kry/SquadJS/squad-server/rcon/index.js:251:34)
    at Socket.emit (events.js:314:20)
    at addChunk (_stream_readable.js:303:12)
    at readableAddChunk (_stream_readable.js:279:9)
    at Socket.Readable.push (_stream_readable.js:218:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
  code: 'ERR_BUFFER_OUT_OF_BOUNDS'

The following is a list Battlemetrics provided of players at the time of the crash:

MORFEY | 02:54 |  
[MSR] L.I.N.K | 02:35 |  
Boon | 02:09 |  
paatrik3 )) | 02:09 |  
BLACK | 01:53 |  
Shadow | 01:53 |  
Boroda | 01:45 |  
dddfffggg123666 | 01:38 |  
molva7 | 01:38 |  
Σταυρός❤Ставрос | 01:38 |  
Beaver | 01:32 |  
Рокко | 01:26 |  
Adeptus Fresco | 01:21 |  
dzrLee | 01:21 |  
Полумягкие овощи | 01:17 |  
_Zevs_ | 01:12 |  
Axeron | 01:12 |  
Hans | 01:12 |  
Ramzes | 01:12 |  
... | 01:04 |  
Flex | 01:04 |  
Бронко | 01:04 |  
[ DS ] DRAKNET | 01:01 |  
Vasya | 01:01 |  
Feels_Mylls | 00:58 |  
Sparky | 00:52 |  
Tayrek | 00:52 |  
thirst | 00:52 |  
Asteks | 00:50 |  
frozya | 00:50 |  
Gorynych | 00:50 |  
MOXITO | 00:47 |  
Asap Rokievna | 00:45 |  
666 | 00:43 |  
Leonardo | 00:43 |  
Player | 00:41 |  
Любимчик Хо Ши Ми | 00:41 |  
Strong Slave System | 00:41 |  
Senodya кабачок | 00:39 |  
UNIT28 | 00:39 |  
✔ Оригинал ™®®®® | 00:37 |  
B.iG | 00:37 |  
Cpt. Doebailo | 00:33 |  
DeX | 00:33 |  
morkovka | 00:33 |  
Дядя Миша | 00:30 |  
ozeleninator | 00:28 |  
GHOST black | 00:26 |  
CEP}\|{AHT_ZAPASA | 00:25 |  
denismeister=DD | 00:25 |  
eazy-e | 00:25 |  
eZstah | 00:25 |  
TIMBORODA | 00:24 |  
1Nagan | 00:22 |  
DarK_Knight[RUS] | 00:22 |  
Kesha | 00:22 |  
Anchor! | 00:21 |  
Sv!FTy | 00:21 |  
Lamerito | 00:20 |  
Nil | 00:20 |  
Шампунь | 00:20 |  
Mauro G | 00:19 |  
Mindhunter | 00:19 |  
Mozg | 00:19 |  
NickAir | 00:18 |  
Sardsvipe | 00:18 |  
⚜HOPELESS⚜ | 00:15 |  
bitchr | 00:12 |  
delfin97 | 00:12 |  
Nightery | 00:12 |  
Vladigor | 00:12 |  
Almaz | 00:11 |  
T1p | 00:06 |  
RichiE | 00:03 |  
KyJluHaP | 00:01 |  
Marty | 00:01 |  
H0rdi. | 00:00 |  
kry | 00:00

In a separate crash it looks to have been one of these names:

усыновлённая доч | 00:07 |  
SkyGuard | 00:04 |  
КТО МЯУКАЕТ | 00:05 |

Another:
~ 2020.08.25-18.54.42:119

[1598381662749] RCON (Verbose): Method Exec: execute(ListPlayers)
internal/buffer.js:79
    throw new ERR_BUFFER_OUT_OF_BOUNDS();
    ^

RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds
    at boundsError (internal/buffer.js:79:11)
    at Buffer.readInt32LE (internal/buffer.js:385:5)
    at Rcon.decodePacket (file:///home/kry/SquadJS/squad-server/rcon/index.js:301:17)
    at Rcon.onData (file:///home/kry/SquadJS/squad-server/rcon/index.js:251:34)
    at Socket.emit (events.js:314:20)
    at addChunk (_stream_readable.js:303:12)
    at readableAddChunk (_stream_readable.js:279:9)
    at Socket.Readable.push (_stream_readable.js:218:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
  code: '
[2020.08.25-18.31.02:107][391]LogNet: Join succeeded: Dezmont
[2020.08.25-18.32.23:689][282]LogNet: Join succeeded: skR1me
[2020.08.25-18.35.06:964][979]LogNet: Join succeeded: Михаил Круг
[2020.08.25-18.41.12:015][120]LogNet: Join succeeded: minyor
[2020.08.25-18.42.19:366][342]LogNet: Join succeeded: Paranoid
[2020.08.25-18.45.41:575][897]LogNet: Join succeeded: Podkradun
[2020.08.25-18.46.07:422][115]LogNet: Join succeeded: the_TAB
[2020.08.25-18.49.15:749][920]LogNet: Join succeeded: Macentosh05
[2020.08.25-18.53.10:272][552]LogNet: Join succeeded: КОПЧЕННЫЙ
[2020.08.25-18.53.51:691][404]LogNet: Join succeeded: andreev.4lex
[2020.08.25-18.53.58:750][716]LogNet: Join succeeded: TimDas
[2020.08.25-18.55.27:895][778]LogNet: Join succeeded: чаэсве
[2020.08.25-18.55.51:604][893]LogNet: Join succeeded: Thanator

Squad Information

  • SquadJS Version: v1.2.1
  • Squad Version: Latest

System Information

  • Operating System: Linux
  • NodeJS Version: v14.x.x
  • Yarn Version: N/A

Discord Invite

Hey, the SquadJS' Discord server's invite link is expired, can you please renew it?

Feature Request - Rcon built in discord

Is it possible to have a rcon sender from discord with this plugin.
So you can send commands from discord to the server, kick, ban, broadcast, teamswitch and so on ?

Multi Server Question

So If I am going to deploy this on another box with to servers how is that going to work? Can it be on the same bot token that the first server is using or does it have to be another box. Also if the bot allows if how will I go about using it for two servers, mostly team-kill and admin cam on both?

discord-round-winner || UNIX

Description of Issue

discord-round-winner is sending an incomplete message to the discord channel

Errors or Screenshots of Issue

Round Winner
Message
undefined won on Tallil Outskirts AAS v1

Squad Information

  • Plugins in Use: discord-round-winne
  • SquadJS Version: 1.4.1
  • Squad Version: latest

System Information

  • Operating System: Unix
  • NodeJS Version: v14.4.0
  • Yarn Version: 1.22.5

Tie AdminWarn into !admin-request

What is the issue, e.g. map voting, you would like to solve?

Add a check to the !admin request, in which online admins get a warning ingame with the same notification.
Probably needs to have #57 solved first.

discord-chat-admin-request || Anti-spam requests

discord-chat-admin-request

the command can be used multiple times in a short time resulting in a discord spam, also pinging the admins multiple times.

=====
Add option to change time before sending a new message for the same user:

  • make it a plug-in option so that everyone can set their own desired time.

Additional Variables for Map Voting

What is the issue, e.g. map voting, you would like to solve?

We've trialed your map voting plugin on a live public server. It works as is but requires some more variables to prevent abuse of this plugin by players in-game.

How would you like us to solve this issue?

Addition of the following variables:

  • Minimum number of votes before a map vote is successful & sets next map
  • Minimum number of players on server before a map vote is allowed
  • Lock in a vote (once a player votes for a map during a round, they cannot change their vote)

Is there any alternative solutions you can think of?

nil

Additional Info

nil

Features

Overall Features request

TeamKill Log

  • Option to choose different option for the Team Kill/Suicide embed color.
  • Option to disable Suicide log
  • Emoji Reaction underneath the Embed with for example, Variables can be changes as option:
    • 1 Emoij : Warn user (You Teamkilled {victim} please reply sorry in chat)
    • 1 Emoij: Ban user ( Ban the user for 1 day)

#Mapvote

  • Whitelist possible with a pastebin or text file for quicker changes.
  • Discord channel for admins where they can setup a mapvote.
  • (inside a mod channel) !mapvote {map} {map} {map}
  • (ingame) Warning: Mapvote is active please chose a nr.
  • (ingame user interaction) !mapvote 1 / !mapvote 2 / !mapvote 3

#server-status

  • Show Server version
  • Change Embed color on current user value
    • 0 = Red
    • 1-39 = Orange
  • 40+ = green
  • Quick Join link (steam link)
  • Disable Auto correction. If people use !server while the command is set on !server1 it still get displayed. If you use multiple server it quit buggy if people still use !server instead of !server2.

RCON Connection problem || UNIX

Squad Information

  • SquadJS Version: V1.1.0
  • Squad Version: Current

System Information

  • Operating System: Ubuntu 19.10
  • NodeJS Version: v14.4.0
  • Yarn Version: 1.22.4

Description of Issue

Still getting RCON problems resulting in not updating the Teamkill logs > MySQL & influnc DB
Temp FIX is restarting the bot every 1 hour to be sure..

error: (node:15153) UnhandledPromiseRejectionWarning: Error: Not connected. 14|SquadJS #1 | at file:///home/XXXXX/SquadJS/squad-server/rcon/index.js:185:16 14|SquadJS #1 | at new Promise (<anonymous>) 14|SquadJS #1 | at Rcon.write (file:///home/XXXXX/SquadJS/squad-server/rcon/index.js:179:12) 14|SquadJS #1 | at Rcon.execute (file:///home/XXXXX/SquadJS/squad-server/rcon/index.js:54:17) 14|SquadJS #1 | at Rcon.getMapInfo (file:///home/XXXXX/SquadJS/squad-server/rcon/index.js:58:33) 14|SquadJS #1 | at Timeout._onTimeout (file:///home/XXXXX/SquadJS/squad-server/index.js:56:36) 14|SquadJS #1 | at listOnTimeout (internal/timers.js:549:17) 14|SquadJS #1 | at processTimers (internal/timers.js:492:7) 14|SquadJS #1 | (node:15153) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag--unhandled-rejections=strict(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 4921)

Second error, current SquadJS version:
(node:15153) UnhandledPromiseRejectionWarning: Error: getaddrinfo EAI_AGAIN host 14|SquadJS #1 | at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) 14|SquadJS #1 | (node:15153) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 4929)

Mapvote Albasrah RCON command incorrect

Description of Issue

When voting for CAF_Albasrah_Invasion_v1 the rcon command should have a space between Al and Basrah. Not sure if any of the other layers on this CAF rotation have this issue, just noticed it for this single one.

Errors or Screenshots of Issue

Squad Information

  • Plugins in Use: mapvote didyoumean
  • SquadJS Version: latest master
  • Squad Version: 21.1

!Skipmap

Hello.
Can you at least implement !skipmap? )
shouldn't be very difficult
Any player on the server can start voting (if someone started it, then the next time, not earlier than 10 minutes later (or give the opportunity to customize), after the start, players write + or - in the chat, if more than 50 percent of the players voted for the pass, the map is changing.

Server Status Bug

Description of Issue

Get this error in the cmd prompt for Server Status trying to import 'tinygradient'

Errors or Screenshots of Issue

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'tinygradient' imported from c:\SquadJS\plugins\discord-server-status\index.js
at packageResolve (internal/modules/esm/resolve.js:616:9)
at moduleResolve (internal/modules/esm/resolve.js:655:14)
at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:748:11)
at Loader.resolve (internal/modules/esm/loader.js:97:40)
at Loader.getModuleJob (internal/modules/esm/loader.js:243:28)
at ModuleWrap. (internal/modules/esm/module_job.js:42:40)
at link (internal/modules/esm/module_job.js:41:36) {
code: 'ERR_MODULE_NOT_FOUND'
}

Squad Information

  • Plugins in Use: Discord Server Status
  • SquadJS Version: 1.0.10
  • Squad Version: b19.5

System Information

  • Operating System: Windows
  • NodeJS Version: most recent
  • Yarn Version: most recent

Possible EventEmitter memory leak detected.

Description of Issue

Node is giving warning
(node:12212) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [Socket]. Use emitter.setMaxListeners() to increase limit Possible EventEmitter memory leak detected.

I enabled --trace-warnings

Errors or Screenshots of Issue

Version: 1.4.1

SquadJS factory commencing building...
Getting config file...
Building Squad server...
Initialising connectors...
Starting discordClient connector...
Starting mysqlPool connector...
Loading plugins...
Loading plugin auto-tk-warn...
Loading plugin discord-admin-cam-logs...
Loading plugin discord-admin-request...
Loading plugin discord-teamkill...
Loading plugin mysql-log...
Watching server 1...
(node:12212) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added to [Socket]. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:389:17)
    at Socket.addListener (events.js:405:10)
    at Socket.Readable.on (_stream_readable.js:853:35)
    at Socket.once (events.js:436:8)
    at file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:235:19
    at new Promise (<anonymous>)
    at Rcon.write (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:179:12)
    at Rcon.execute (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:54:17)
    at Rcon.getMapInfo (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:58:33)
    at Timeout._onTimeout (file:///C:/servers/squadjs-current/SquadJS/squad-server/index.js:53:36)

Squad Information

  • SquadJS Version:1.4.1
  • Squad Version:1.1.0.173.39994-4.23.1-SHIPPING

System Information

  • Operating System: Windows 10
  • NodeJS Version:v14.5.0
  • Yarn Version: 1.22.4

Seed time = Skirmish maps

Hi!

A system that launches maps only in Skirmish mode for a small number of people on the server.
And which launches the map rotation when the server have a certain number of users.

Amazing Job,
Paul

Discord Chat Embed Colours

What is the issue, e.g. map voting, you would like to solve?

Add different colour embed to Discord Chat depending on which chat is used.

Stops monitoring server after server restart

Description of Issue

We daily morning restarts of the server (Best practice from squad hosting discord), Every morning the app starts reporting an Unhandled Promise Rejection Warning and stops working. We no longer squad admin pings, TK log stops, no longer issuing TK warnings.

Errors or Screenshots of Issue

(node:4748) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1035) (node:4748) UnhandledPromiseRejectionWarning: Error: Not connected. at file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:185:16 at new Promise (<anonymous>) at Rcon.write (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:179:12) at Rcon.execute (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:54:17) at Rcon.getMapInfo (file:///C:/servers/squadjs-current/SquadJS/squad-server/rcon/index.js:58:33) at Timeout._onTimeout (file:///C:/servers/squadjs-current/SquadJS/squad-server/index.js:53:36) at listOnTimeout (internal/timers.js:551:17) at processTimers (internal/timers.js:494:7)

Squad Information

  • SquadJS Version: 1.4.1
  • Squad Version: 1.0.0.143.39036

System Information

  • Operating System: Windows 10
  • NodeJS Version: v14.5.0
  • Yarn Version: 1.22.4

discord-round-winner || Add score

PLUGIN: discord-round-winner
Extra feature request info:

When a match has been played, a screenshot is often taken and shared in the discord channel. It would be nice if the discord-round-winner plugin didn't just indicate who won in which match. But also a table drops with there score. I dont mind dropping the hole scoreboard but if discord doesnt allow it can we have a filter that we can say: show top 10 (and have the option to change that in the config). Also an option filter on prio, so in the config filterprio: KD, points , etc...

So it is 2 tables next to each other

Party 1 | Party 2
Name | KD | D | K | R | POINTS | Name | KD | D | K | R | POINTS

Fatal Crash on admins list update with tk bot

Description of Issue

With the tk bot (im thinking this is the issue) a fatal crash occurs.

Errors or Screenshots of Issue

TypeError: Cannot convert undefined or null to object
at Function.entries ()
at SquadServer.getAdminsWithPermission (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/index.js:248:43)
at new AutoKickUnassigned (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/auto-kick-unassigned.js:86:26)
at Function.buildFromConfig (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/factory.js:89:22)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async main (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/index.js:14:7)
file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/index.js:248
for (const [steamID, perms] of Object.entries(this.admins)) {
^

TypeError: Cannot convert undefined or null to object
at Function.entries ()
at SquadServer.getAdminsWithPermission (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/index.js:248:43)
at new AutoKickUnassigned (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/auto-kick-unassigned.js:86:26)
at Function.buildFromConfig (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/factory.js:89:22)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async main (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/index.js:14:7)

Squad Information

  • SquadJS Version: current beta branch
  • Squad Version: current

System Information

  • Operating System: 2016 and 2019 windows server
  • NodeJS Version: current
  • Yarn Version: current

Seeding Notifications on Map Change

Description of Issue

We implemented the seeding rules plugin on our server and noticed that when map changes happen, there is a period of time where players are still joining. During this time, the plugin detects player count dropping below the threshold and it kicks the messages off.
I was about to start looking at the plugin code to see if we could implement a back-off timer for if a map swap happened recently and suppress if that was the case, but figured I'd post here first to check if there was config I needed to set.

A back-off time seems like a good idea, i.e. if the map has changed then don't do anything for 30-60 seconds.

Squad Information

  • Plugins in Use: seeding-message
  • SquadJS Version: Latest
  • Squad Version: Latest

System Information

  • Operating System: All
  • NodeJS Version: Correct Version
  • Yarn Version: Latest

discord-rcon has incorrect response for a given command

Description of Issue

Using a command in discord-rcon like adminbroadcast test will often receive a response from the automated system for listing players

It appears to me that SquadJS does not make use of the ability to set unique ID's for the RCON packets so that matching requests to responses would be a simple task.

It seems SquadJS is only making use of two possible ID's ID_MID and ID_END a possible solution could be to either make more statically defined ID's specific to SquadJS for each possible request/response, or to generate a unique 32-bit little endian integer for each request and match that ID with responses from the server.

Errors or Screenshots of Issue

Command:
adminbroadcast test

Response:

----- Active Players -----
ID: 107 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 4
ID: 52 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 7
ID: 38 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 5
ID: 76 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 4
ID: 94 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 7
ID: 62 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 6
ID: 64 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 7
ID: 57 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 4
ID: 90 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 5
ID: 102 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 1
ID: 59 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 7
ID: 53 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 3
ID: 21 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 3
ID: 11 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 6
ID: 20 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 9
ID: 67 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 3
ID: 3 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 8
ID: 75 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 5
ID: 13 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 2
ID: 73 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 5
ID: 32 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 6
ID: 113 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 1 | Squad ID: 6
ID: 17 | SteamID: 99999999999999999 | Name: REDACTED | Team ID: 2 | Squad ID: 3

Squad Information

  • Plugins in Use:
    discord-rcon
  • SquadJS Version:
    v1.4.8
  • Squad Version:
    v1.1

System Information

  • Operating System:
    Ubuntu 20.04
  • NodeJS Version:
    v12.18.4
  • Yarn Version:
    v1.22.5

!squadjs restartsubsystem logparser is allowing unauthroized user to run the command

Description of Issue

When we run the command !squadjs restartsubsystem logparser a unauthorized user is able to run the command.

Errors or Screenshots of Issue

image

"plugin": "DiscordSubsystemRestarter", "enabled": true, "discordClient": "discord", "role": "794603603317751838"

Squad Information

  • SquadJS Version: beta branch
  • Squad Version: current v1

System Information

  • Operating System: 10
  • NodeJS Version: 12.19.1
  • Yarn Version: latest

UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:8086

I am getting this error when I run SquadJS via node index.js

(node:24761) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:8086
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
(node:24761) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 19)

 
 

index.js

import Server from 'squad-server';

import {
  discordTeamkill
} from 'plugins';

async function main() {
  const server = new Server({
    id: 0,

    host: 'xxx',
    rconPort: 21114,
    rconPassword: 'xxx',
    logDir: '/home/squadserver/serverfiles/SquadGame/Saved/Logs/'
  });

  // discord logging
  await discordTeamkill(
  server, 
  '695055571639861268', 
    { // options
      color: 15844367 // color of embed
    }
  );

  await server.watch();
}

main();
  • For host I had to put in my actual IP address. The localhost address doesn't work, says connection refused.
  • Discord login token is configured in core/config.js, and the bot shows as online on my Discord server.
  • This is on Ubuntu 18.04.
  • Running latest node as of yesterday.

AutoKickUnassigned is still kicking admins

Description of Issue

The auto AutoKickUnassigned is not ignoring admins.

Errors or Screenshots of Issue

Config:

  "plugin": "AutoKickUnassigned",
  "enabled": true,
  "warningMessage": "Join a squad, you are are unassigned and will be kicked",
  "kickMessage": "Unassigned - automatically removed",
  "frequencyOfWarnings": 60,
  "unassignedTimer": 300,
  "playerThreshold": 93,
  "roundStartDelay": 900,
  "ignoreAdmins": true,
  "ignoreWhitelist": false

// Custom Permissions here for admins.
this.admins = server.getAdminsWithPermission('forceteamchange');
this.whitelist = server.getAdminsWithPermission('reserve');

I had to change the custom permission. Nothing I change keeps the admins from being kicked.

Squad Information

  • Plugins in Use:
  • SquadJS Version: beta brance
  • Squad Version: current

System Information

  • Operating System: windows server 2019
  • NodeJS Version: current
  • Yarn Version: current

New !mapvote mode

I suggest adding a third voting mode !Mapvote. Аny player on the server can launch it (
if someone has already started voting, then the next time you can start in half an hour.).
After the start, the players are asked to write + or - in the chat, if the voting is recognized as successful, then voting for the map begins (for example, take a list of 10 maps from the local file), and then the players will vote again for a specific card. !1 !2 !3 etc.

Mapvote Tallil Tanks

Description of Issue

Mapvote issues for Tallil Tanks using the did you mean method. When voting for tanks v1 or v2 on Tallil we get a return of 'cannot read property 'max' of undefined' from the SquadJS bot

Errors or Screenshots of Issue

image

Squad Information

  • Plugins in Use: Mapvote did you mean method
  • SquadJS Version: Most recent
  • Squad Version: Most recent b19.5

System Information

  • Operating System: Windows
  • NodeJS Version: most recent
  • Yarn Version: most recent

Better SquadJS Logging

What is the issue, e.g. map voting, you would like to solve?

Currently logging to the console consists of only error messages which in a lot of cases is not enough to debug issues users are having, especially ones relating to RCON.

How would you like us to solve this issue?

We should add more and better logging by default that is enough to solve most issues reported by users without asking them to turn on verbose logging and trying again.

Multiple levels of verboseness would be good both to assist with the development and to easily allow us to adjust logging required to solve issues whilst keeping logs in most deployments to a minimum.

Rcon error: [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds

After leaving squadjs running for a while, I get this error and the node process ends:

Watching server 1...
internal/buffer.js:75
    throw new ERR_BUFFER_OUT_OF_BOUNDS();
    ^

RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds
    at boundsError (internal/buffer.js:75:11)
    at Buffer.readInt32LE (internal/buffer.js:381:5)
    at Rcon.decodePacket (file:///home/ubuntu/SquadJS/squad-server/rcon/index.js:301:17)
    at Rcon.onData (file:///home/ubuntu/SquadJS/squad-server/rcon/index.js:251:34)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:302:12)
    at readableAddChunk (_stream_readable.js:278:9)
    at Socket.Readable.push (_stream_readable.js:217:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23) {
  code: 'ERR_BUFFER_OUT_OF_BOUNDS'
}

Maybe the onData decode loop in squad-server/rcon/index.js should have some more defensive checks to make sure that the endOfPacket value is actually within the bounds of inputBuf?

!admins

The command to output to the user of the administrators who are currently online.

Admin Broadcast log || Requests

The Broadcast Log to discord is a nice feature.
But we have also in battlemetrics some default broadcast messages.

This means that the discord will sent alot of broadcasts into the discord channel. Discord doesn't allow more then 1000 connections aday on a single discordbot token and see's this as a bug. Leading into resetting the token to stop the bot access.

Is it possible to filter out specific broadcast messages from specific users: example the BattleMetrics sent command?

Duplicated plugin bug

Description of Issue

Copied the plugin server status and changed it to display the layers and layer history of the server.
When using the Command !layer 1 to activate the bot it prints out correctly the embed.

When you use the refresh ico under the embed you will see in the refresh time the "server status plugin" then after refreshing it turn back to the layer history plugin "with the correct new data".

So the bot is somehow linked the 2 plugins together.

Squad Information

  • Plugins in Use: Copy of Server Status
  • SquadJS Version: latest Version
  • Squad Version: Latest Version

System Information

  • Operating System: UNIX
  • NodeJS Version: xx
  • Yarn Version: xx

Incorrect Time | Logs local time to Mysql DB

Hello. I'll make this short and sweet.

index.js has this

server.on(PLAYERS_UPDATED, (players) => {
      options.mysqlPool.query(
        'INSERT INTO PlayerCount(time, server, player_count) VALUES (NOW(),?,?)',
        [serverID, players.length]
      );

That logs the local time and not correct UTC time.

Therefore; it should be mentioned in the README that it is necessary to set the mysql instance to use UTC time.

image

Mapvote CAF Manic 5

Description of Issue

When Mapvoting for CAF Manic RAAS v1 the bot will take it as the winner and announce it as the winner but will not set it as the next map at all. Admins are manually setting it if this map wins.

Errors or Screenshots of Issue

Squad Information

  • SquadJS Version: Most recent 1.0.9
  • Squad Version: Most recent b19.5

System Information - don't have access to this exact info at this time but are all running most recent on a Windows server

  • Operating System: Windows Server
  • NodeJS Version: Most recent
  • Yarn Version: Most recent

Discord RCON Improvements

What is the issue, e.g. map voting, you would like to solve?

Improvements to Discord RCON.

How would you like us to solve this issue?

  • Have an autocorrect for the maps for map commands.
  • Have roles to give/limit access to certain commands.

Linux support

Is it possible to use this on Linux? I see node-windows as a dependency in package.json, which I can change to node-linux, but just wondering if there are other things I should look out for.

Round winner - Showing wrong map

Hi,

Seems that my round winner shows the "next" map instead of the map that was played.
Cant explain it more then that. Hit me up if you need more info 👍

Player Revived victimName

Description of Issue

Victim information is not getting logged by either InfluxDB or MySQL. I believe it's because it's not available from the core system for some reason.

Squad Information

  • Plugins in Use: influxdb-log / mysql-log
  • SquadJS Version: 1.0.9
  • Squad Version: 19.4

System Information

  • Operating System: Linux
  • NodeJS Version: Correct one
  • Yarn Version: Correct one

Mapvote 123 AdminBroadcast

What is the issue, e.g. map voting, you would like to solve?

  • Would like the map choices to be broadcast via AdminBroadcast

How would you like us to solve this issue?

Would be nice to cut out the ‘!mapvote help’ step for 123 voting plugin. Ideally it would broadcast every X minutes until the vote is stopped. Would probably have to limit the number of map choices to 3 though.

SquadJS New plugin || Killed by warning

Would be nice if there is a plugin to sent a warning to the victim with the information who killed him.

Option1* Sent a warning to the person that died: [attackers_name] killed you!
Option2* Sent a message to [ALL or Admin] chat, [attacker_name] Killed [victim name]

Why do I requests for this plugin?
So we can see if there is any hacker/cheater that's kills a lot of players and we can better check it for malicious activity.

################ info ######################

So I checked the logs and this should maybe be the answers how to check it: (not for sure but thats why i ask here)

As you can see player Hagrid died then his scorepoints are changed and at least you see died to OlyYourFriend
If you can filter on the first line that the victim died and then filter on the next in line argument "Died to" it should be possible to know who killed you.

################# LOGS #####################

17|SquadServerB19 #1 | [2020.07.24-18.19.22:743][781]LogSquadTrace: [DedicatedServer]Die(): Player:Hagrid KillingDamage=-300.000000 from BP_PlayerController_C_2146009509 caused by BP_Soldier_USA_Grenadier_C_2145903899 17|SquadServerB19 #1 | [2020.07.24-18.19.22:743][781]LogSquadScorePoints: Verbose: ScorePointsDelayed: Points: 10.000000 ScoreEvent: Killed Hagrid 17|SquadServerB19 #1 | [2020.07.24-18.19.22:743][781]LogSquadScorePoints: Verbose: ScorePointsDelayed: Points: 10.000000 ScoreEvent: Killed Hagrid 17|SquadServerB19 #1 | [2020.07.24-18.19.22:743][781]LogSquadScorePoints: Verbose: ScorePointsDelayed: Points: 10.000000 ScoreEvent: Killed Hagrid 17|SquadServerB19 #1 | [2020.07.24-18.19.22:743][781]LogSquadScorePoints: Verbose: ScorePoints: Points: -1.000000 ScoreEvent: Died to OlyYourFriend

Cooperation

Hi! I would like to give a contribute to this project! I usually play squad and i use Node at work 🍡
Feel free to add me on discord enkos#7573

Error Given on Discord Status

Description of Issue

Randomly when the server goes over cap ex 100/98. The bot will stop updating embeds and will show "unknown" next to the map layer in the presence(discord status).

Errors or Screenshots of Issue

TypeError: Cannot read property 'replace' of undefined
at DiscordServerStatus.getEmbed (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/discord-server-status.js:85:54)
at DiscordServerStatus.update (file:///C:/Users/Administrator/Desktop/Servers/Spaghetti-Bot/squad-server/plugins/discord-server-status.js:64:33)

Squad Information

  • SquadJS Version: current beta branch
  • Squad Version: current

System Information

  • Operating System: windows server 2019
  • NodeJS Version: v12.19.1
  • Yarn Version: current

Mapvote Features

#Mapvote

  • Add option Timer ( vote duration )
  • Add option Ticket ( end of voting when a minimum number of tickets has been issued and reaches )
  • pick in a discord channel the predefined votes
  • announcement of the current vote every x seconds

!admin blacklist

What is the issue, e.g. map voting, you would like to solve?

Admins getting pinged with useless !admin requests.

How would you like us to solve this issue?

Add a blacklist of words to filter out requests, e.g. switch.

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.