Giter Club home page Giter Club logo

ivar2's Introduction

ivar2 - DO-OH!

Introduction

ivar2 is an IRC/Matrix bot on speed, with a mentally unstable mind. Partially because its written in Lua, which could make the most sane mind go unstable. If that's not obscure enough for you, ivar2 also supports running MoonScript modules.

Installation

The installation instructions are made for Debian Jessie, you might have to adapt yourself for other distributions. Some additional dependencies are required for some of the modules, like PostgreSQL for pgolds.lua. Persisting data can be done using either sqlite og Redis, naturally lua-redis and redis-server is required as a dependency if you want to use redis.

Instructions for containing Lua and all deps inside a single directory, almost like python virtualenv or npm.:

# Install ``hererocks`` <https://github.com/mpeterv/hererocks/>, using pip or wget https://raw.githubusercontent.com/mpeterv/hererocks/latest/hererocks.py
pip install hererocks
# Install lua + deps in a directory called ivarenv
hererocks -j 2.1 -r\^ ivarenv
# Change dir to ivarenv
cd ivarenv
# Run Luarocks from ivarenv
bin/luarocks install http
bin/luarocks install lua-cjson
bin/luarocks install lua-zlib
bin/luarocks install lua-iconv
bin/luarocks install luafilesystem
bin/luarocks install lsqlite3
# Optional
bin/luarocks install --server=http://luarocks.org/dev cqueues-pgsql  PQ_INCDIR=/usr/include/postgresql # requires libpq-dev system package

# Optional
bin/luarocks install --server=http://luarocks.org/dev lredis


# Now you have a self contained Lua environment with deps that you can run the bot.
cd ivar2
ivarenv/bin/lua ivar2.lua myconfig.lua

Alternate instructions for install Lua(JIT) + deps, trying to use some system packages:

sudo apt-get install luarocks liblua5.1-iconv0 lua-zlib lua-cjson cmake libsqlite3-dev git libssl-dev m4
sudo luarocks install lsqlite3
sudo luarocks install luabitop
sudo luarocks install luarocks #newer version of luarocks to support git+https
sudo luarocks install http
sudo luarocks install luafilesystem
# if you want to use LuaJIT instead of Lua
sudo apt-get install luajit
# if you want postgresql support
sudo luarocks install --server=http://luarocks.org/dev cqueues-pgsql  PQ_INCDIR=/usr/include/postgresql # requires libpq-dev system package
# if you want redis persist
sudo luarocks install --server=http://luarocks.org/dev lredis
sudo apt-get install redis-server

Decompress the required data files in cache directory.

Configuration File

Create a bot config sort of like this

myconfig.lua

return {
    nick = 'ivar2',
    autoReconnect = true,
    ident = 'ivar2',
    uri = 'tcp://irc.efnet.no:6667/',
    password = false,
    realname = 'ivar',
    owners = {
        '[email protected]'
    },
    webserverhost = '::',
    webserverport = 9000,
    webserverprefix = 'https://my.web.proxy/', -- optional URL if bot is behind proxy
    commandPattern = "!",
    notice = false, -- Reply with PRIVMSG instead of NOTICE
    modules = {
        'admin',
        'autojoin',
        'lastfm',
        'spotify',
        'karma',
        'roll',
        'title',
        'tvrage',
        'urbandict',
        'substitute',
        'lua',
    },
    channels = {
        ['#ivar'] = {
            disabledModules = {
                'olds'
           },
           commandPattern = '>',
           ignoredNicks = {'otherbot'},
           modulePatterns = {
                lastfm = '#',
           },
        },
    }
}

Launch bot

# Using Lua
lua ivar2.lua myconfig.lua
# Using LuaJIT (apt-get install luajit)
luajit ivar2.lua myconfig.lua
# If you want to try the Matrix adapter
lua(jit) matrix.lua yourmatrixconfigfile.lua

# Or install the provided systemd service
sudo cp scripts/ivar2.service /etc/systemd/system/ivar2.service
sudo systemctl daemon-reload
sudo systemctl start ivar2

Modules

So. Many. Useless. Modules! And they are written in either Lua or MoonScript.

Writing modules

Example module that fetches some content over HTTP, parses JSON and returns some text when triggered:

-- Util lib contains lots of helpful stuff for modules, like HTTP, JSON,
-- IRC formatting, some utf8-helpers, etc.
local util = require'util'
local http = util.simplehttp
local json = util.json

-- Define function that will be ran when triggered by user input
local handler = function(self, source, destination, input)
  -- self is ivar2 object, with all its methods
  -- source is table, containing sender info, like source.nick
  -- destination is string with target of the message, i.e. the channel the message was sent to
  -- input is optional Lua pattern capture match

  -- Fetch HTTP content and JSON decode it. No error handling needed here
  -- unless you want to inform the user of errors with HTTP or JSON etc.
  -- All module functions are called with pcall (protected call) to prevent
  -- crashes. Errors will result in error lines in the log.
  local result = json.decode((http'http://api.icndb.com/jokes/random'))

  -- Send the reply back to the destination where it came from using ivar2
  -- Privmsg function. You could also use say() or reply() available in this
  -- function environment as helpers
  self:Privmsg(destination, result.value.joke)
end

-- Modules returns a table with events, and Lua pattern with a corresponding
-- function that will be called when the event text matches the pattern.
return {
  -- PRIVMSG means incoming IRC message, from channel or query
  PRIVMSG = {
    ['!chuck'] = handler,
  },
}

Example of module that is responding to HTTP:

ivar2.webserver.regUrl('/test/html/(.*)', function(self, req, res)
   self:Log('error', 'testtestest')
   local channel = req.url:match('channel=(.+)%s*')
   local unescaped_channel = channel:gsub('%%23', '#')
   self:Privmsg(unescaped_channel, 'test')
   return [[
   <html>
       <head>
           <title> ivartest </title>
       </head>
       <body>
           <h1>
               Test
           </h1>
       </body>
   </html>
   ]]
 end)

 ivar2.webserver.regUrl('/test/plain/(.*)', function(self, req, res)
   self:Log('error', 'testtestest')
   return 'ok', 200, {
     ['Content-Type'] = 'text/plain'
   }
 end)

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.