Guest User

kj

a guest
Sep 4th, 2016
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. //
  3. // EventHandler.ts
  4. //
  5.  
  6. import { injectable } from 'inversify';
  7. import Event from 'server/base/event.ts';
  8.  
  9. type Constructor<T> = {
  10.     new(...agrs: any[]): T;
  11. };
  12.  
  13. type EventClass = Constructor<Event>;
  14. type Listener<T> = ( event: T ) => void;
  15. type ListenerArray<T> = Listener<T>[];
  16.  
  17. @injectable()
  18. export default class EventHandler {
  19.  
  20.     private handlers: Map<any,ListenerArray<Event>>;
  21.  
  22.     constructor() {
  23.         this.handlers = new Map();
  24.     }
  25.  
  26.     public listen<T extends Event>( eventClass: T , action: Listener<T> ) {
  27.         let listeners = this.handlers.get( eventClass );
  28.         if ( !listeners ) {
  29.             listeners = [];
  30.             this.handlers.set( eventClass , listeners );
  31.         }
  32.         listeners.push( action );
  33.     }
  34.  
  35.     public trigger( data: Event ) {
  36.         let listeners = this.handlers.get( data.constructor );
  37.         if ( listeners ) {
  38.             listeners.forEach( l => l(data) );
  39.         }
  40.     }
  41.  
  42. }
  43.  
  44.  
  45.  
  46. //
  47. // Event.ts
  48. //
  49. export default class Event {
  50.  
  51. }
  52.  
  53. //
  54. // ChatMessageEvent.ts
  55. //
  56.  
  57. import Event from 'server/base/event.ts';
  58. import ChatUser from 'server/type/chat-user.ts';
  59.  
  60. export default class ChatMessageEvent extends Event {
  61.  
  62.     private sender: ChatUser;
  63.     private message: string;
  64.  
  65.     constructor( sender: ChatUser , message: string ) {
  66.         super();
  67.         this.sender = sender;
  68.         this.message = message;
  69.     }
  70.  
  71. }
  72.  
  73.  
  74. //
  75. // ChatBot.ts
  76. // Working implementation:
  77. //
  78.  
  79. import * as TMI from 'tmi.js';
  80. import { injectable } from 'inversify';
  81. import Config from 'server/service/core/config.ts';
  82. import EventHandler from 'server/base/event-handler.ts';
  83. import ChatMessageEvent from 'server/event/chat-message.ts';
  84. import ChatUser from 'server/type/chat-user.ts';
  85.  
  86. @injectable()
  87. export default class ChatBot {
  88.  
  89.     private config: Config;
  90.     private eventHandler: EventHandler;
  91.     private client: any;
  92.  
  93.     constructor( config: Config , eventHandler: EventHandler ) {
  94.         this.config = config;
  95.         this.eventHandler = eventHandler;
  96.         this.client = null;
  97.     }
  98.  
  99.     public connect() {
  100.  
  101.         const options: any = {
  102.             options: {
  103.                 debug: true ,
  104.             } ,
  105.             connection: {
  106.                 cluster: 'aws' ,
  107.                 reconnect: true ,
  108.             } ,
  109.             identity: {
  110.                 username: this.config.get( 'Chat.botUserName' ) ,
  111.                 password: this.config.get( 'Chat.botPassword' ) ,
  112.             } ,
  113.             channels: [ '#' + this.config.get( 'Chat.channel' ) ] ,
  114.         };
  115.  
  116.         this.client = new TMI.client( options );
  117.         this.client.connect();
  118.  
  119.         console.log( 'Twitch client connected to channel ' + this.config.get( 'Chat.channel' ) );
  120.  
  121.         this.client.on( 'message' , ( channel: any , user: any , message: any , self: any ) => {
  122.             this.eventHandler.trigger( new ChatMessageEvent( chatUser , message ) );
  123.         } );
  124.  
  125.         this.eventHandler.listen( ChatMessageEvent , (ev: ChatMessageEvent) => {
  126.             console.log( 'listen: ' , ev );
  127.         } );
  128.  
  129.     }
  130.  
  131.     public whisper( userName: string , message: string ) {
  132.         return this.client.whisper( userName , message );
  133.     }
  134.  
  135.     public say( message: string ) {
  136.         return this.client.say( message );
  137.     }
  138.  
  139. }
Add Comment
Please, Sign In to add comment