Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // EventHandler.ts
- //
- import { injectable } from 'inversify';
- import Event from 'server/base/event.ts';
- type Constructor<T> = {
- new(...agrs: any[]): T;
- };
- type EventClass = Constructor<Event>;
- type Listener<T> = ( event: T ) => void;
- type ListenerArray<T> = Listener<T>[];
- @injectable()
- export default class EventHandler {
- private handlers: Map<any,ListenerArray<Event>>;
- constructor() {
- this.handlers = new Map();
- }
- public listen<T extends Event>( eventClass: T , action: Listener<T> ) {
- let listeners = this.handlers.get( eventClass );
- if ( !listeners ) {
- listeners = [];
- this.handlers.set( eventClass , listeners );
- }
- listeners.push( action );
- }
- public trigger( data: Event ) {
- let listeners = this.handlers.get( data.constructor );
- if ( listeners ) {
- listeners.forEach( l => l(data) );
- }
- }
- }
- //
- // Event.ts
- //
- export default class Event {
- }
- //
- // ChatMessageEvent.ts
- //
- import Event from 'server/base/event.ts';
- import ChatUser from 'server/type/chat-user.ts';
- export default class ChatMessageEvent extends Event {
- private sender: ChatUser;
- private message: string;
- constructor( sender: ChatUser , message: string ) {
- super();
- this.sender = sender;
- this.message = message;
- }
- }
- //
- // ChatBot.ts
- // Working implementation:
- //
- import * as TMI from 'tmi.js';
- import { injectable } from 'inversify';
- import Config from 'server/service/core/config.ts';
- import EventHandler from 'server/base/event-handler.ts';
- import ChatMessageEvent from 'server/event/chat-message.ts';
- import ChatUser from 'server/type/chat-user.ts';
- @injectable()
- export default class ChatBot {
- private config: Config;
- private eventHandler: EventHandler;
- private client: any;
- constructor( config: Config , eventHandler: EventHandler ) {
- this.config = config;
- this.eventHandler = eventHandler;
- this.client = null;
- }
- public connect() {
- const options: any = {
- options: {
- debug: true ,
- } ,
- connection: {
- cluster: 'aws' ,
- reconnect: true ,
- } ,
- identity: {
- username: this.config.get( 'Chat.botUserName' ) ,
- password: this.config.get( 'Chat.botPassword' ) ,
- } ,
- channels: [ '#' + this.config.get( 'Chat.channel' ) ] ,
- };
- this.client = new TMI.client( options );
- this.client.connect();
- console.log( 'Twitch client connected to channel ' + this.config.get( 'Chat.channel' ) );
- this.client.on( 'message' , ( channel: any , user: any , message: any , self: any ) => {
- this.eventHandler.trigger( new ChatMessageEvent( chatUser , message ) );
- } );
- this.eventHandler.listen( ChatMessageEvent , (ev: ChatMessageEvent) => {
- console.log( 'listen: ' , ev );
- } );
- }
- public whisper( userName: string , message: string ) {
- return this.client.whisper( userName , message );
- }
- public say( message: string ) {
- return this.client.say( message );
- }
- }
Add Comment
Please, Sign In to add comment