#message-parser #twitch #chat #tv #string #data #ping

no-std twitch_message

A parser for Twitch.tv chat messages

3 releases

0.1.2 Jan 26, 2023
0.1.1 Jan 24, 2023
0.1.0 Jan 24, 2023

#14 in #tv

0BSD license

180KB
4K SLoC

twitch_message

Read the docs for more detailed information


This is a crate to parse chat messages from https://www.twitch.tv

This crate does not provide any I/O rather just parsing of a &str into typed messages.

A quick walkthrough:

use twitch_message::messages::*;
// get some data from somewhere
let data: &str = read_line();

// parse returns a `ParseResult` which contains the remaining data (if any) and the parsed message
let result = twitch_message::parse(data)?;
let msg: Message<'_> = result.message;

match msg.kind {
    MessageKind::Ready => {
        let ready = msg.as_typed_message::<Ready>().unwrap();
        println!("connected as: {name}", name = ready.name);
    }
    MessageKind::Privmsg => {
        let pm = msg.as_typed_message::<Privmsg>().unwrap();
        println!("[{channel}] {sender}: {data}",
            channel = pm.channel,
            sender = pm.sender,
            data = pm.data
        );
    }
    MessageKind::Ping => {
        let ping = msg.as_typed_message::<Ping>().unwrap();
        let resp = twitch_message::encode::pong(&ping.token);

        // you can format data to various 'sinks'
        use twitch_message::encode::Formattable;
        let mut out = String::new();
        resp.format(&mut out)?;
        assert_eq!(out, "PONG :1234567890\r\n");
    }
    _ => {}
}

Encoding

Format/Formattable

// this adds the # to the channel, if its missing
let pm = twitch_message::encode::privmsg("museun", "hello, world.");

// using `Formattable`
use twitch_message::encode::Formattable;
let mut buf = String::new();
pm.format(&mut buf)?;
assert_eq!(buf, "PRIVMSG #museun :hello, world.\r\n");

// using `Format`
use twitch_message::encode::Format;
let mut buf = String::new();
buf.format_msg(pm)?;
assert_eq!(buf, "PRIVMSG #museun :hello, world.\r\n");

Encode/Encodable

// this adds the # to the channel, if its missing
let pm = twitch_message::encode::privmsg("museun", "hello, world.");

// using `Encodable`
use twitch_message::encode::Encodable;
let mut buf = Vec::new();
pm.encode(&mut buf)?;
assert_eq!(buf, b"PRIVMSG #museun :hello, world.\r\n");

// using `Encode`
use twitch_message::encode::Encode;
let mut buf = Vec::new();
buf.encode_msg(pm)?;
assert_eq!(buf, b"PRIVMSG #museun :hello, world.\r\n");

Features

Feature Description
default there are no default features
ping enables the PingTracker
std enables the Encode and Encodable traits
serde enables serde derives on the types
hashbrown enables using hashbrown for the internal HashMap
sync enables using std::sync::Mutex over std::cell::RefCell see sharing data
parking_lot same as sync except uses a parking_lot::Mutex

Twitch chat reference: link

License: 0BSD

Dependencies

~0–5MB
~11K SLoC