1.0.18 • Published 3 years ago

irc-xdcc-2 v1.0.18

Weekly downloads
5
License
ISC
Repository
github
Last release
3 years ago

irc-xdcc-2

Disclamer

This module does not intend to facilitate illegal files transfer. The author may not be taken responsible for any copyright infringement or illegal uses.

Introduction

irc-xdcc-2 is a node-irc module promises based extension providing xdcc handlers with Typescript support.

It's a recode of irc-xdcc which is basically a recode of Indysama node-xdcc / DaVarga node-axdcc.

Options

irc-xdcc-2 provide an extension of the irc module. It extends the available options with the following:

{
    server: 'irc.server.org'
  , nick: 'myCoolNick'
  , progressInterval: 1 // [Number(int)] Interval (in seconds) for the progress update event (xdcc-progress) -- Default: 1
  , destPath: '/path/to/destination' // [String] The destination path for downloads -- Default: module lib path + /downloads -> path.join(__dirname, 'downloads')
  , resume: true // [Boolean] Allow download to be resumed -- Default: true
  , acceptUnpooled: false // [Boolean] Accept unrequested DCC download (accept a DCC download that doesn't match any DCC instance found in _transfer pool array -- Default: false
  , closeConnectionOnCompleted: true // [Boolean] Defines if active sockets should be closed if the IRC client get disconnected or killed -- Default: true
  , method: 'say' // [String] Defines the method to trigger xdcc bots, either 'say' or 'ctcp' (you can also use 'msg' which is equivalent to 'say') -- Default: 'say'
  , sendCommand: 'XDCC SEND' // [String] the command sent to the bot to initiate the xdcc transfert -- Default: 'XDCC SEND'
  , cancelCommand: 'XDCC CANCEL' // [String] the command sent to the bot to cancel the xdcc transfert -- Default: 'XDCC CANCEL'
  , removeCommand: 'XDCC REMOVE' // [String] the command sent to the bot to cancel a queued transfert -- Default: 'XDCC REMOVE'
  , joinTopicChans: true // [Boolean] automatically rejoin channels mentioned in the topic -- Default: true
  , queuedParser:  /queue for pack #?(\d+) \("(.+)"\) in position/ // [RegExp] regexp to parse queue notices/messages -- Default:  /queue for pack #?(\d+) \("(.+)"\) in position/
  , sendParser: /sending( you)?( queued)? pack #?(\d+) \("(.+)"\)/i // [RegExp] regexp to parse send notices/messages -- Default:  /sending( you)?( queued)? pack #?(\d+) \("(.+)"\)/i
}

Constructor (legacy)

Instead of using the new irc.Client(), use XdccClient. Server and nick arguments moved to options:

const { XdccClient } = require('irc-xdcc-2');
const options = { /* ... */ };
const client = new XdccClient(options);

Sample:

// load irc-xdcc module
const { XdccClient, XdccEvents } = require('irc-xdcc-2')
// set options object
const ircOptions = {
    server: 'irc.myserver.com'
  , nick: 'myBotNick'
  , userName: 'ircClient'
  , realName: 'irc Client'
  , port: 6697
  , autoRejoin: true
  , autoConnect: true
  , channels: [ '#xdcc', '#xdcc-chat' ]
  , secure: true
  , selfSigned: true
  , certExpired: true
  , stripColors: true
  , encoding: 'UTF-8'
  // xdcc specific options
  , progressInterval: 5
  , destPath: './dls'
  , resume: false
  , acceptUnpooled: true
  , closeConnectionOnCompleted: false
};
// launch the client
const client = new XdccClient(ircOptions);
// listen for events and act
client.addListener(XdccEvents.ircRegistered, () => { console.log('bot registered'); });
client.addListener(XdccEvents.ircConnected, () => { 
    client.addTransfer({ botNick: 'xdccBot', packId: '123'})
        .then((transfer) => {})
        .catch((err) => {
            if(err.code) {
                console.error('Error ' + err.code + ': ' +  err.message);
            }
            else {
                console.error(err);
            }
        });    
});

Factory (promise based)

Alternatively to the constructor, XdccClient also exposes a static factory to create a new instance. The factory method returns a promise that resolves the new instance either directly after creation if autoConnect is false or after the 'connected' event if autoConnect is true.

const { XdccClient } = require('irc-xdcc-2');
const options = { /* ... */ };
XdccClient.create(options)
    .then(client => {})
    .catch(err => console.error(err))
    ;

Sample:

// load irc-xdcc module
const { XdccClient, XdccEvents } = require('irc-xdcc-2')
// set options object
const ircOptions = {
    server: 'irc.myserver.com'
  , nick: 'myBotNick'
  , userName: 'ircClient'
  , realName: 'irc Client'
  , port: 6697
  , autoRejoin: true
  , autoConnect: true
  , channels: [ '#xdcc', '#xdcc-chat' ]
  , secure: true
  , selfSigned: true
  , certExpired: true
  , stripColors: true
  , encoding: 'UTF-8'
  // xdcc specific options
  , progressInterval: 5
  , destPath: './dls'
  , resume: false
  , acceptUnpooled: true
  , closeConnectionOnCompleted: false
};
// launch the client
XdccClient.create(options)
    .then(client => {
        // listen for events and act
        client.addListener(XdccEvents.ircRegistered, () => { console.log('bot registered'); });
        client.addListener(XdccEvents.ircConnected, () => { 
            client.addTransfer({ botNick: 'xdccBot', packId: '123'})
                .then((transfer) => {})
                .catch((err) => {
                    if(err.code) {
                        console.error('Error ' + err.code + ': ' +  err.message);
                    }
                    else {
                        console.error(err);
                    }
                });    
        });
    })
    .catch(console.error.bind(console))
    ;

Methods

irc-xdcc module extends irc.Client methods with a set of promises:

connectP(retryCount)

Promise based alternative to the native connect() method.

client.connectP()
    .then()
    .catch(console.error.bind(console))
    ;

addTransfer(packInfo)

Add a transfer to the pool and starts xdcc transfer for the provided pack infos (e.g.: { botNick: 'xdccBot', packId: 1 } ) where botNick is the xdcc server bot nick and packId, the required pack id.

client.addTransfer({ botNick: 'xdccBot', packId: '1'})
    .then((transfer) => {})
    .catch((err) => {
        if(err.code) {
            console.error('Error ' + err.code + ': ' +  err.message);
        }
        else {
            console.error(err);
        }
    });

cancelTransfer(transfer)

Cancel DCC transfer.

client.cancelTransfer(transfer)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

cancelTransferByInfo(packInfo)

Cancel DCC transfer instances matching packInfo ({ botNick: 'xdccBot', packId: 1 }).

client.cancelTransferByInfo({ botNick: 'xdccBot', packId: '1'})
    .then(() => {})
    .catch(console.error.bind(console))
    ;

cancelTransferById(poolId)

Cancel DCC transfer for the specified transfer ID (transfer.transferId).

client.cancelTransferById(2)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

listTransfers()

Returns the transfer pool (where transfers are stored).

client.listTransfers()
    .then(() => {})
    .catch(console.error.bind(console))
    ;

removeTransfer(transfer)

Cancel xdcc transfer and remove transfer from pool.

client.removeTransfer(transfer)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

removeTransferById(poolId)

Cancel xdcc transfer and remove transfer from pool using its id.

client.removeTransferById(1)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

start(transfer)

Sends the start signal to the server bot for the specified transfer.

client.start(transfer)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

cancel(transfer)

Sends the cancel signal to server bot for the specified transfer.

client.start(transfer)
    .then(() => {})
    .catch(console.error.bind(console))
    ;

Events

Along with extending irc module option and methods, some events have been added too:

XdccEvents.ircConnected | 'connected'

() => {}

Event fired when the irc client is connected and joined all channels specified in the options

XdccEvents.xdccError | 'xdcc-error'

(error) => {}

Event fired when a method call is erroneous

XdccEvents.xdccCreated | 'xdcc-created'

(transfer) => {}

Fired when a DCC instance has been created (and added to the transfer pool) (see transfer info)

XdccEvents.xdccRequested | 'xdcc-requested'

(transfer) => {}

Fired when the XDCC SEND command has been sent (see transfer info)

XdccEvents.xdccRemoved | 'xdcc-removed'

(transfer) => {}

Fired when a DCC instance has been removed from transfer pool (see transfer info)

XdccEvents.xdccStarted | 'xdcc-started'

(transfer) => {}

Fired when the file transfer begins (see transfer info)

XdccEvents.xdccQueued | 'xdcc-queued'

(transfer) => {}

Fired when a queue notice has been recieved from the server (see transfer info)

XdccEvents.xdccCompleted | 'xdcc-completed'

(transfer) => {}

Fired when a DCC transfer has been completed (see transfer info)

XdccEvents.xdccCanceled | 'xdcc-canceled'

(transfer) => {}

Fired when a DCC transfer has been canceled (see transfer info)

XdccEvents.xdccConnected | 'xdcc-connected'

(transfer) => {}

Fired when a DCC transfer starts (see transfer info)

XdccEvents.xdccProgressed | 'xdcc-progressed'

(transfer) => {}

Fired every option.progressInterval seconds during DCC transfer providing the received bytes (see transfer info)

XdccEvents.xdccDlError | 'xdcc-dlerror'

(transfer) => {}

Fired when a DCC transfer encounter an error (see transfer info)

XdccEvents

{
    xdccError:              'xdcc-error',
    xdccCreated:            'xdcc-created',
    xdccRequested:          'xdcc-requested',
    xdccStarted:            'xdcc-started',
    xdccRemoved:            'xdcc-removed',
    xdccQueued:             'xdcc-queued',
    xdccCompleted:          'xdcc-completed',
    xdccCanceled:           'xdcc-canceled',
    xdccConnected:          'xdcc-connected',
    xdccProgressed:         'xdcc-progressed',
    xdccDlError:            'xdcc-dlerror',
    ircNotice:              'notice',
    ircError:               'error',
    ircQuit:                'quit',
    ircKill:                'kill',
    ircRegistered:          'registered',
    ircJoin:                'join',
    ircConnected:           'connected',
    ircMotd:                'motd',
    ircNames:               'names',
    ircTopic:               'topic',
    ircPart:                'part',
    ircKick:                'kick',
    ircMessage:             'message',
    ircSelfMessage:         'selfMessage',
    ircPing:                'ping',
    ircPm:                  'pm',
    ircCtcp:                'ctcp',
    ircCtcpPrivmsg:         'ctcp-privmsg',
    ircCtcpVersion:         'ctcp-version',
    ircCtcpNotice:          'ctcp-notice',
    ircNick:                'nick',
    ircInvite:              'invite',
    ircModeAdd:             '+mode',
    ircModeRemove:          '-mode',
    ircWhois:               'whois',
    ircChannellistStart:    'channellist_start',
    ircChannellistItem:     'channellist_item',
    ircChannellist:         'channellist',
    ircRaw:                 'raw',
    ircAction:              'action',
    ircClose:               'close',
    ircNeterror:            'netError',
    ircAbort:               'abort',
    ircPong:                'pong',
    ircOpered:              'opered',
    ircConnect:             'connect'
}

XDCC transfer

An XDCC transfer is an object containing pieces of information regarding a specific xdcc transfer.

XdccTransfer

{
    botNick // xdcc server bot nick
  , packId // xdcc pack id
  , server // irc server
  , channel // irc channel
  , state // state of the transfer (see below)
  , transferId // id of the instance in the internal transfer pool
  , resumePosition // used to store resume position when an incomplete file is found in the destPath
  , receivedBytes // number of bytes received
  , progress // transfer progression percentage
  , speed // average transfer speed (bytes per second)
  , startedAt // process.hrtime() value when the download has been started
  , duration // process.hrtime(startedAt) value when the download has been completed
  , progressIntervalId // progress event setInterval id 
  , fileName // xdcc file name
  , lastCommand: // last xdcc command recieved from the server (SEND or ACCEPT)
  , ip: // server's ip address
  , port // server's socket port
  , fileSize: // xdcc file size
  , location: // file destination
  , sender // ctcp message emitter (= botNick)
  , target // ctcp message target (= ircClient nick)
  , message // ctcp message
  , params // ctcp parsed parts
  , error // error message/infos
}

XdccTransferState

{
    canceled = -1,
    pending = 0,
    requested = 1,
    queued = 2,
    started = 3,
    completed = 4
}

Thanks

1.0.18

3 years ago

1.0.17

4 years ago

1.0.16

4 years ago

1.0.15

4 years ago

1.0.11

4 years ago

1.0.14

4 years ago

1.0.13

4 years ago

1.0.12

4 years ago

1.0.10

4 years ago

1.0.9

4 years ago

1.0.8

4 years ago

1.0.7

5 years ago

1.0.6

5 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago