squircy2

command module
v0.0.0-...-92f9948 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2016 License: MIT Imports: 3 Imported by: 0

README

squIRCy2

the scriptable IRC bot

squIRCy2 is written in Go and is scriptable using Javascript.

It sports a web management interface for writing scripts and bot management, as well as dynamic script reloading at runtime. Bind custom scripts to run when events occur in the application. Events can come from IRC, the CLI, or even the web.

Installation

Installing squIRCy2 is as easy as running:

go get -u github.com/tyler-sommer/squircy2

With squIRCy2 is installed, you can run it immediately with squircy2 and a default configuration will be initialized in ~/.squircy2.

For information on modifying and customizing squircy2 itself, see CONTRIBUTING.md.

Configuration

Once the bot is up and running, you can access the web management interface via localhost:3000.

The Settings page allows you to modify squishy's nickname, username, and which server he connects to. Configure the Owner nickname and hostname to your information. These values are available from within each scripting language at runtime.

The Owner Nickname and Hostname settings are available within your scripts.

From the Scripts page, you can add and edit scripts.

From the Dashboard page, you can see CLI and IRC history.

From the REPL, you can write, run, and see the result of code.

Scripting

squIRCy2 embeds a Javascript interpreter, allowing you to write scripts to implement various bot behaviors.

Javascript API

otto supports ECMAScript 5, less a regular expression incompatibility. Additionally, the following functions are available to interact with the various squIRCy2 modules:

Method Description
Irc.Join(channel) Joins the given channel
Irc.Part(channel) Parts the given channel
Irc.Privmsg(target, message) Messages target with message. Target can be a user or a channel
Irc.CurrentNick() Get the bot's current nickname
Irc.Nick(newNick) Change the bot's nickname
Http.Get(url, ...headers) Fetch the given url using a GET HTTP request
Http.Get(url, body, ...headers) Fetch the given url using a POST HTTP request
Http.Send(options) Send an HTTP request with the configured options.
Math.Rand() Generate a random value from 0-1
Math.Round(val) Round val to 0 decimal places.
Config.OwnerNick() Get the configured Owner Nickname
Config.OwnerHost() Get the configured Owner Host
bind(eventName, fnName) Add a handler of the given event type and function name
unbind(eventName, fnName) Removes a handler of the given type and function name
setTimeout(fnName, delay) Executes fnName after delay milliseconds
setInterval(fnName, delay) Executes fnName every delay milliseconds
use(coll) Opens and returns a repository for the given collection
Repository methods

These are methods available on a repository returned by use.

Method Description
repo.Fetch(id) Attempts to load and return an entity with the given id
repo.FetchAll() Returns a collection of all the entities in the repository
repo.Save(entity) Saves the given entity
Event handlers

Event handlers can be registered with bind and unbind. Bind takes two parameters: the name of the event, and the name of the function to call when the given event is triggered.

Event handlers receive an Event object with additional information. An example Javascript handler:

function handler(e) {
    // e is an object with all the transmitted event details
}
Binding a handler

An event handler can either be a named function, or more commonly, a function itself.

bind("irc.PRIVMSG", function(e) {
    console.log("Received message from "+e.Nick);
});

// or
function privmsgHandler(e) {
    console.log("Received message from "+e.Nick);
}
bind("irc.PRIVMSG", privmsgHandler);
Unbinding a handler

To unbind a handler, you must retain a reference to that function. Generally this means keeping a reference to the original handler around.

function privmsgHandler(e) {
    if (e.Nick == "Someone") {
        // Unbind after Someone sends a message
        unbind("irc.PRIVMSG", privmsgHandler);
    }
}
bind("irc.PRIVMSG", privmsgHandler);
Events
Event Name Description
cli.INPUT Input received from terminal
cli.OUTPUT Output sent to terminal
irc.CONNECTING Fired when first connecting to the IRC server
irc.CONNECT Successfully connected to the IRC server
irc.DISCONNECT Disconnected from the IRC server
irc.PRIVMSG A message received, in a channel or a private message
irc.NOTICE A notice received
irc.WILDCARD Any IRC event

The IRC module also fires any IRC code as irc.<code>, for example 001 is irc.001, or NICK is irc.NICK.

Example Scripts

Join channels on connect
bind("irc.CONNECT", function(e) {
    Irc.Join('#squishyslab')
});
Identify with Nickserv

In the example below, a handler is bound to the irc.NOTICE event. When NickServ notices you, requesting you identify, it will reply with your password.

function handleNickserv(e) {
    if (e.Nick == "NickServ" && e.Message.indexOf("identify") >= 0) {
        Irc.Privmsg("NickServ", "IDENTIFY superlongandsecurepassword");
        console.log("Identified with Nickserv");
    }
}
bind("irc.NOTICE", handleNickserv);

When your handler function is invoked, an object (e in the example) is passed as the first parameter. This object has different properties depending on the event.

Iterate over an event's properties
bind("irc.WILDCARD", function(e) {
    for (var i in e) {
        console.log(i+": "+e[i]);
    }
});

Additional Info

squIRCy2 leverages go-irc-event for IRC interaction. It makes use of martini for serving web requests and dependency injection. Tiedot is used as the storage engine. squIRCy2 embeds the otto Javascript VM. Finally, it uses the stick templating engine for rendering HTML templates.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
irc

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL