npm package: @natsumerikun/youtube-chat-kanopi
Description: [![npm version](https://badge.fury.io/js/@natsumerikun%2Fyoutube-chat-kanopi.svg)](https://badge.fury.io/js/@natsumerikun%2Fyoutube-chat-kanopi) ![npm](https://img.shields.io/npm/dt/@natsumerikun/youtube-chat-kanopi) ![NPM](https://img.shields.io/npm/l/
Author: Natsume Rikun
Latest version: 2.4.5

# youtube-chat
[![npm version](https://badge.fury.io/js/@natsumerikun%2Fyoutube-chat-kanopi.svg)](https://badge.fury.io/js/@natsumerikun%2Fyoutube-chat-kanopi)
![npm](https://img.shields.io/npm/dt/@natsumerikun/youtube-chat-kanopi)
![NPM](https://img.shields.io/npm/l/@natsumerikun/youtube-chat-kanopi)
> Fetch YouTube live chat without API

☢ ***You will need to take full responsibility for your action*** ☢

## Getting started
1. Install
    - `npm i youtube-chat-kanopi`
    - `yarn add youtube-chat-kanopi`
2. Import
    - Javascript
    ```javascript
    const { LiveChat } = require("@natsumerikun/youtube-chat-kanopi")
    ```
    - Typescript
    ```typescript
    import { LiveChat } from "@natsumerikun/youtube-chat-kanopi"
    ```
3. Create instance with ChannelID or LiveID
    ```javascript
    // If channelId is specified, liveId in the current stream is automatically acquired.
    // Recommended
    const liveChat = new LiveChat({channelId: "CHANNEL_ID_HERE"})
    
    // Or specify LiveID in Stream manually.
    const liveChat = new LiveChat({liveId: "LIVE_ID_HERE"})
    ```
4. Add events
    ```typescript
    // Emit at start of observation chat.
    // liveId: string
    liveChat.on("start", (liveId) => {
      /* Your code here! */
    })
   
    // Emit at end of observation chat.
    // reason: string?
    liveChat.on("end", (reason) => {
      /* Your code here! */
    })
    
    // Emit at receive chat.
    // chat: ChatItem
    liveChat.on("chat", (chatItem) => {
      /* Your code here! */
    })
    
    // Emit when an error occurs
    // err: Error or any
    liveChat.on("error", (err) => {
      /* Your code here! */
    })
    ```
5. Start
    ```typescript
    // Start fetch loop
    const ok = await liveChat.start()
    if (!ok) {
      console.log("Failed to start, check emitted error")
    }
    ```
6. Stop loop
   ```typescript
   liveChat.stop()
   ```

## Types
### ChatItem
```typescript
interface ChatItem {
   author: {
      name: string
      thumbnail?: ImageItem
      channelId: string
      badge?: {
         thumbnail: ImageItem
         label: string
      }
   }
   message: MessageItem[]
   superchat?: {
      amount: string
      color: string
      sticker?: ImageItem
   }
   isMembershipEvent: boolean
   isGiftMembership: boolean
   membership?: {
      name: string
      amount?: number
      type?: string
   }
   giftCount: number
   isMembership: boolean
   isVerified: boolean
   isOwner: boolean
   isModerator: boolean
   timestamp: Date
}
```

### MessageItem

```typescript
type MessageItem = { text: string } | EmojiItem
```

### ImageItem
```typescript
interface ImageItem {
  url: string
  alt: string
}
```

### EmojiItem
```typescript
interface EmojiItem extends ImageItem {
  emojiText: string
  isCustomEmoji: boolean
}
```

## References
- https://drroot.page/wp/?p=227
- https://github.com/taizan-hokuto/pytchat

Thank you!👍

```md

## Credits
Based on the original youtube-chat project by LinaTsukusu.  
Maintained and updated by NatsumeRikun.