npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

better-ttb

v1.2.0

Published

Create Twitch bots gooder

Downloads

5

Readme

Better TTB

Its gooder then the other one

Install

Install via NPM

$ npm install better-ttb

Example

const TwitchClient = require('better-ttb')

const Client = new TwitchClient.{
  username: 'Xeno_Pog',
  oauth: 'oauth:how_how_is_he_pogging',
  channels: ['twitch']
})

Client.on('join', channel => {
  console.log(`Joined channel: ${channel.name}`)
})

Client.on('error', err => {
  console.log(err)
})

Client.on('message', message => {
  if(message.content === '!test') {
    Client.send('Command executed! PogChamp')
  }
})

Events

connected - (client: TwitchBot)

This event is emitted when the bot has connected to the IRC server.

Usage

Client.on('connected', client => ... );

join - (channel: Channel)

This event is emitted when a channel has been joined successfully.

Usage

Client.on('join', channel => ... );

part - (channel: Channel)

This event is emitted when a channel has been left successfully.

Usage

Client.on('part', channel => ... );

message - (message: Object)

Emitted when a PRIVSMSG event is sent over IRC. The message (Chatter) object attributes can be found on the Twitch developers site

Usage

Client.on('message', message => ... );

Example Response

{
  color: '#3C78FD',
  display_name: 'XenoBranch',
  emotes: '88:18-25',
  id: 'c5ee7248-3cea-43f5-ae44-2916d9a1325a',
  mod: true,
  room_id: 44667418,
  sent_ts: 1501541672959,
  subscriber: true,
  tmi_sent_ts: 1501541673368,
  turbo: false,
  user_id: 44667418,
  user_type: 'mod',
  badges: { broadcaster: 1, subscriber: 0 },
  channel: { name: '#XenoBranch', send: { ... } },
  message: 'This is a message PogChamp',
  username: 'XenoBranch',
  client: TwitchBot { ... }
}

timeout - (event: Object)

Emitted when a user is timed out in the chat. The ban_reason attribute is null when no reason message is used.

Chat Trigger

XenoBranch: "/timeout {user} {duration} {reason}"

Usage

Client.on('timeout', event => ... )

Example Response

{
  ban_duration: 10, // seconds
  ban_reason: 'Using a banned word',
  room_id: 44667418,
  target_user_id: 37798112,
  tmi_sent_ts: 1503346029068,
  type: 'timeout',
  channel: { name: '#XenoBranch', send: { ... } },
  target_username: 'serxka'
}

subscription - (event: Object)

Emitted when a user subscribes to a channel and chooses to share the subscription in chat.

Usage

Client.on('subscription', event => ... )

Example Response

{
  badges: {
   broadcaster: 1,
   staff: 1,
   turbo: 1
  },
  channel: { name: '#XenoBranch', send: { ... } },
  color: '#008000',
  display_name: 'bruh',
  emotes: null,
  id: 'db25007f-7a18-43eb-9379-80131e44d633',
  login: 'bruh',
  message: 'Great stream -- keep it up!', // null if no message given
  mod: 0,
  msg_id: 'resub',
  msg_param_months: 6,
  msg_param_sub_plan: 'Prime',
  msg_param_sub_plan_name: 'Prime',
  room_id: 1337,
  subscriber: 1,
  system_msg: 'bruh has subscribed for 6 months!',
  tmi_sent_ts: 1507246572675,
  turbo: 1,
  user_id: 1337,
  user_type: 'staff'
}

ban - (event: Object)

Emitted when a user is permanently banned from the chat. The ban_reason attribute is null when no reason message is used.

Usage

Client.on('ban', event => ... )

Chat Trigger

XenoBranch: "/ban {user} {reason}"

Example Response

{
  ban_reason: 'Using a banned word',
  room_id: 44667418,
  target_user_id: 37798112,
  tmi_sent_ts: 1503346078025,
  type: 'ban',
  channel: '#XenoBranch',
  target_username: 'serxka'
  }

error - (err: Object)

Emitted when any errors occurs in the Twitch IRC channel, or when attempting to connect to a channel.

Error types

Login authentication failed

This error occurs when either your twitch username or oauth are incorrect/invalid.

Response:

{ message: 'Login authentication failed' }
Improperly formatted auth

This error occurs when your oauth password is not formatted correctly. The valid format should be "oauth:your-oauth-password-123".

Response:

{ message: 'Improperly formatted auth' }
Your message was not sent because you are sending messages too quickly

This error occurs when a message fails to send due to sending messages too quickly. You can avoid this by making the bot a moderator in the channel, if applicable/allowed.

Response:

{ message: 'Your message was not sent because you are sending messages too quickly' }

Usage

Client.on('error', err => ... )

Example Response

{ message: 'Some error happened in the IRC channel' }

close - ()

This event is emitted when the irc connection is destroyed via the Client.close() method.

Usage

Client.on('close', () => {
  console.log('closed bot irc connection');
});

Methods

join(channel: String)

Attempts to join a channel. If successful, emits the 'join' event.

Example

Client.on('join', channel => {
  console.log(`Client joined ${channel.name}`);
});

Client.join('channel2');

part(channel: Object)

Attempts to part from a channel. If successful, emits the 'part' event.

Example

Client.on('part', channel => {
  console.log(`Client left ${channel.name}`);
});

Client.part('channel2');

(Client | Channel).send(message: String, channel: []Channel, err: Callback)

Sends a message to the 'Channel' with an optional error callback. The channel is either:

  • Given Client.send()
    • The currently connected channel
    • The specified channel
  • Given Channel.send(), the Channel's well, channel.

Example

Client.send('This is a message');

Client.send('your mum (okay so the joke is that she is so incredibly large that she is longer than the 500 character limit)', err => {
  sent: false,
  message: 'Exceeded PRIVMSG character limit (500)'
  ts: '2017-08-13T16:38:54.989Z'
})

// If connected to multiple channels
Client.send('message to #channel1', 'channel1')
Client.send('message to #channel2', 'channel2')

// Responding without reply() because you dont like the formatting or smth
Message.channel.send("Bruh weirdChamp");

Message.reply(message: String, err: Callback)

Responds to the author of the given Message object in the given message channel, prefixing the message with '@${author's username}, ${message}', where author's username is, well, the authors username, and message is your given message. An optional callback is provided for validating if the message was sent correctly.

Example

//IDK its hard to demonstrate this

Message.reply('Listen here you fool, you buffon, you absoulute moron, you complete and utter daft punk.');

Message.rply('i already did this joke', err => {
  sent: false,
  message: 'Exceeded PRIVMSG character limit (500)'
  ts: '2017-08-13T16:38:54.989Z'
})

timeout(username: Object, channel: []Channel, duration: int, reason: String)

Timeout a user from the chat. channels parameter not needed when connected to a single channel. Default duration is 600 seconds. Optional reason message.

Example

Client.timeout('XenoBranch', 10)
// "XenoBranch was timed out for 10 seconds"

Client.timeout('XenoBranch', 5, 'Using a banned word (L)')
// "XenoBranch was timed out for 5 seconds, reason: 'Using a banned word (L)'"

Client.on('message', message => {
  if(message.content === 'boyfriend') Client.timeout(message.username, 10)
})

ban(username: String, reason: String)

Permanently ban a user from the chat. channels parameter not needed when connected to a single channel. Optional reason message.

Example

Client.ban('XenoBranch')
// "XenoBranch is now banned from the room"

Client.timeout('XenoBranch', 'Using a banned word (L)')
// "XenoBranch is now banned from the room, reason: 'Using a banned word (L)'"

Client.on('message', message => {
  if(message.content === 'simp') Client.ban(message.username)
})

close()

Closes the Twitch irc connection. Client will be removed from the Twitch channel AND the irc server.

Example

Client.close()