add basic trovo support

master
vampirefrog 2 years ago
parent 0f59c71243
commit 055920c18e

@ -3,11 +3,12 @@ if(typeof process === 'object') {
}
class Chat extends EventEmitter {
constructor() {
constructor(settings) {
super();
this.state = 'none';
this.channels = [];
this.verbose = false;
this.verbose = settings.verbose || false;
}
getPlatformName() { throw new Error('Please implement '+arguments.callee.name+'()!'); }

@ -7,19 +7,15 @@ if(typeof process === 'object') {
class DLiveChat extends Chat {
constructor(settings) {
super();
super(settings);
settings = settings || {};
this.wsUrl = settings.wsUrl || 'wss://graphigostream.prd.dlive.tv/';
this.ajaxUrl = settings.ajaxUrl || 'https://graphigo.prd.dlive.tv/';
this.state = 'none';
this.users = {};
this.id = 1;
this.verbose = settings.verbose || false;
// Keepalive
this.expectedPingInterval = settings.expectedPingInterval || 20000; // miliseconds
this.reconnectDelay = settings.reconnectDelay || 2000;
@ -121,35 +117,48 @@ class DLiveChat extends Chat {
}
return result;
};
}
getGiftValue(type) {
var giftValues = {
LEMON: 1,
ICE_CREAM: 10,
DIAMOND: 100,
NINJAGHINI: 1000,
NINJET: 10000
};
if(!type in giftValues)
return 1;
return giftValues[type];
}
handleStreamMessage(msg) {
handleStreamMessage(msg, source) {
var testMessages = {
Ban2: {"__typename":"ChatBan","type":"Ban","id":"chatban:dlive-woabgpyuop|kaspaa","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-woabgpyuop","username":"dlive-woabgpyuop","displayname":"M_o_h_a_m_a_d","avatar":"https://image.dlivecdn.com/avatar/default7.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:kaspaa","username":"kaspaa","displayname":"Kaspaa","avatar":"https://images.prd.dlivecdn.com/avatar/efd649c5-0378-11ea-9529-e2443572cd01","partnerStatus":"NONE"},"bannedByRoomRole":"Moderator"},
Ban: {"__typename":"ChatBan","type":"Ban","id":"chatban:dlive-bzmuytbvmk|tctv","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-bzmuytbvmk","username":"dlive-bzmuytbvmk","displayname":"PERKY_PAWG_BREAST","avatar":"https://image.dlivecdn.com/avatar/default8.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:tctv","username":"tctv","displayname":"Tctv","avatar":"https://images.prd.dlivecdn.com/avatar/9da26d8b-1ce5-11ea-9529-e2443572cd01","partnerStatus":"AFFILIATE"},"bannedByRoomRole":"Moderator"},
ExtendSub: {"__typename":"ChatExtendSub","id":"b9e5e15b-d754-46a4-b71d-63571975b09f","length":3,"month":1,"role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f85df577-6e2f-11ea-8119-a272e850df75","badges":[],"displayname":"PROPRBOY","effect":null,"id":"streamchatuser:proprboy","partnerStatus":"NONE","username":"proprboy"},"subscribing":true,"type":"ExtendSub"},
ExtendSub2: {"__typename":"ChatExtendSub","type":"ExtendSub","id":"0ac2a31f-eba4-42cd-980d-e4e524165c9d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:datdoctor","username":"datdoctor","displayname":"WilliamDunham","avatar":"https://images.prd.dlivecdn.com/avatar/f3559b21-3b9e-11ea-9fd3-a272e850df75","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"month":1,"length":1},
Follow: {"__typename":"ChatFollow","id":"f936fcb8-ebd5-4f88-9db6-6d4aa18e74d9","role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f7fda7f0-bc94-11ea-b737-e2443572cd01","badges":[],"displayname":"r-eVan","effect":null,"id":"streamchatuser:r-evan","partnerStatus":"NONE","username":"r-evan"},"subscribing":false,"type":"Follow"},
GiftSub: {"__typename":"ChatGiftSub","type":"GiftSub","id":"7c5741ce-4d68-4904-9a22-15c684bb936b","sender":{"__typename":"StreamchatUser","id":"streamchatuser:thomas42","username":"thomas42","displayname":"thomasthefam","avatar":"https://images.prd.dlivecdn.com/avatar/69b8b18d-4432-11ea-9529-e2443572cd01","partnerStatus":"NONE","badges":[],"effect":"https://images.prd.dlivecdn.com/effect/trxsmall"},"role":"None","roomRole":"Moderator","subscribing":true,"receiver":"greenbaywacky","count":null},
Ban2: {"__typename":"ChatBan","type":"Ban","id":"chatban:dlive-woabgpyuop|kaspaa","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-woabgpyuop","username":"dlive-woabgpyuop","displayname":"M_o_h_a_m_a_d","avatar":"https://image.dlivecdn.com/avatar/default7.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:kaspaa","username":"kaspaa","displayname":"Kaspaa","avatar":"https://images.prd.dlivecdn.com/avatar/efd649c5-0378-11ea-9529-e2443572cd01","partnerStatus":"NONE"},"bannedByRoomRole":"Moderator"},
Ban: {"__typename":"ChatBan","type":"Ban","id":"chatban:dlive-bzmuytbvmk|tctv","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-bzmuytbvmk","username":"dlive-bzmuytbvmk","displayname":"PERKY_PAWG_BREAST","avatar":"https://image.dlivecdn.com/avatar/default8.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:tctv","username":"tctv","displayname":"Tctv","avatar":"https://images.prd.dlivecdn.com/avatar/9da26d8b-1ce5-11ea-9529-e2443572cd01","partnerStatus":"AFFILIATE"},"bannedByRoomRole":"Moderator"},
ExtendSub: {"__typename":"ChatExtendSub","id":"b9e5e15b-d754-46a4-b71d-63571975b09f","length":3,"month":1,"role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f85df577-6e2f-11ea-8119-a272e850df75","badges":[],"displayname":"PROPRBOY","effect":null,"id":"streamchatuser:proprboy","partnerStatus":"NONE","username":"proprboy"},"subscribing":true,"type":"ExtendSub"},
ExtendSub2: {"__typename":"ChatExtendSub","type":"ExtendSub","id":"0ac2a31f-eba4-42cd-980d-e4e524165c9d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:datdoctor","username":"datdoctor","displayname":"WilliamDunham","avatar":"https://images.prd.dlivecdn.com/avatar/f3559b21-3b9e-11ea-9fd3-a272e850df75","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"month":1,"length":1},
Follow: {"__typename":"ChatFollow","id":"f936fcb8-ebd5-4f88-9db6-6d4aa18e74d9","role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f7fda7f0-bc94-11ea-b737-e2443572cd01","badges":[],"displayname":"r-eVan","effect":null,"id":"streamchatuser:r-evan","partnerStatus":"NONE","username":"r-evan"},"subscribing":false,"type":"Follow"},
GiftSub: {"__typename":"ChatGiftSub","type":"GiftSub","id":"7c5741ce-4d68-4904-9a22-15c684bb936b","sender":{"__typename":"StreamchatUser","id":"streamchatuser:thomas42","username":"thomas42","displayname":"thomasthefam","avatar":"https://images.prd.dlivecdn.com/avatar/69b8b18d-4432-11ea-9529-e2443572cd01","partnerStatus":"NONE","badges":[],"effect":"https://images.prd.dlivecdn.com/effect/trxsmall"},"role":"None","roomRole":"Moderator","subscribing":true,"receiver":"greenbaywacky","count":null},
GiftSubReceive: {"__typename":"ChatGiftSubReceive","type":"GiftSubReceive","id":"6253dfab-10e0-47fd-889e-c8ada929ac02","sender":{"__typename":"StreamchatUser","id":"streamchatuser:greenbaywacky","username":"greenbaywacky","displayname":"greenbaywacky","avatar":"https://images.prd.dlivecdn.com/avatar/f7672f4e-63f2-11e9-bc94-460601ac0a66","partnerStatus":"VERIFIED_PARTNER","badges":[],"effect":null},"role":"None","roomRole":"Moderator","subscribing":true,"gifter":"thomasthefam"},
Host: {"__typename":"ChatHost","id":"8ecb00e0-1061-4d52-804c-b5e7b5ef7ff4","role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":false,"type":"Host","viewer":2},
Lemon: {"__typename":"ChatGift","type":"Gift","id":"688b3a22-34c0-4fe5-afbb-e82434013c35","sender":{"__typename":"StreamchatUser","id":"streamchatuser:soren.invicta","username":"soren.invicta","displayname":"Soren.Invicta","avatar":"https://image.dlivecdn.com/avatar/default12.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"createdAt":"1610073419355881366","gift":"LEMON","amount":"1","recentCount":1,"expireDuration":0,"message":""},
Lemons: {"__typename":"ChatGift","amount":"5","createdAt":"1593804669046558744","expireDuration":0,"gift":"LEMON","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
IceCream: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"ICE_CREAM","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
IceCreams: {"__typename":"ChatGift","amount":"3","createdAt":"1593804669046558744","expireDuration":0,"gift":"ICE_CREAM","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Diamond: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"DIAMOND","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Hello Frens","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Diamond2: {"payload":{"data":{"streamMessageReceived":[{"__typename":"ChatGift","type":"Gift","id":"a466fc18-58aa-4659-b166-012646cc144d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-kphjutjxyt","username":"dlive-kphjutjxyt","displayname":"97123_vegas","avatar":"https://images.prd.dlivecdn.com/avatar/default20.png","partnerStatus":"NONE","badges":["CHRISTMAS_TREE","SANTA"],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"createdAt":"1609390512462873916","gift":"DIAMOND","amount":"1","recentCount":1,"expireDuration":0,"message":"2.00 a round for ammo now?"}]}},"id":"2","type":"data"},
Ninjaghini2: {"payload":{"data":{"streamMessageReceived":[{"__typename":"ChatText","type":"Message","id":"fa701547-daa5-438d-a9b7-30c37dcf70d7","content":"6 ninjaghinis","createdAt":"1609390611166389797","subLength":1,"sender":{"__typename":"StreamchatUser","id":"streamchatuser:iamcheese","username":"iamcheese","displayname":"CEOofWamen","avatar":"https://images.prd.dlivecdn.com/avatar/bd5c25ca-153b-11eb-aed2-be53b0f89a8c","partnerStatus":"NONE","badges":["CHRISTMAS_TREE"],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"emojis":[]}]}},"id":"2","type":"data"},
Ninjaghini: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"NINJAGHINI","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Pee Pee poo Poo","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Ninjet: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"NINJET","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Dee Dee Get Out Of My laboratory","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Mod: {"__typename":"ChatModerator","type":"Mod","id":"4ba35866-7b3d-4922-b1e0-a25907f9555e","sender":{"__typename":"StreamchatUser","id":"streamchatuser:thestoryofdori","username":"thestoryofdori","displayname":"TheStoryOfDori13","avatar":"https://images.prd.dlivecdn.com/avatar/1b0c639f-208d-11ea-bd1e-563a837bad22","partnerStatus":"AFFILIATE","badges":[],"effect":"https://images.prd.dlivecdn.com/effect/trx"},"role":"None","roomRole":"Moderator","subscribing":true,"add":true},
Subscription: {"__typename":"ChatSubscription","type":"Subscription","id":"cc51028f-4042-45b5-9b64-8ce03fb0b5c5","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-51995646","username":"dlive-51995646","displayname":"GrimGriz","avatar":"https://images.prd.dlivecdn.com/avatar/c8e244e6-5c97-11e9-ab17-865634f95b6b","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"month":3},
SubStreak: {"__typename":"ChatSubStreak","id":"3bd0a19e-8791-410d-b3b2-9f044ba33881","length":2,"role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f85df577-6e2f-11ea-8119-a272e850df75","badges":[],"displayname":"PROPRBOY","effect":null,"id":"streamchatuser:proprboy","partnerStatus":"NONE","username":"proprboy"},"subscribing":true,"type":"SubStreak"},
TCValue: {"__typename":"ChatTCValueAdd","type":"TCValue","id":"47f8158d-2006-418f-9954-99c160349a5d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:vampirefrog","username":"vampirefrog","displayname":"vampirefrog","avatar":"https://images.prd.dlivecdn.com/avatar/e3d74c4e-d4fc-11ea-8cd4-c20daac9fa96","partnerStatus":"AFFILIATE","badges":[],"effect":null},"role":"None","roomRole":"Owner","subscribing":false,"amount":"3000000","totalAmount":"5139478"},
Timeout: {"__typename":"ChatTimeout","type":"Timeout","id":"0320ec61-2679-4a3e-9f61-c09bcddad6a0","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-woabgpyuop","username":"dlive-woabgpyuop","displayname":"M_o_h_a_m_a_d","avatar":"https://image.dlivecdn.com/avatar/default7.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:cascadiannationalist","username":"cascadiannationalist","displayname":"CascadiaPNW","avatar":"https://images.prd.dlivecdn.com/avatar/52b10bde-b03d-11ea-b737-e2443572cd01","partnerStatus":"NONE"},"minute":5,"bannedByRoomRole":"Moderator"},
ValueUpdated: {"id":"1","payload":{"data":{"treasureChestMessageReceived":{"__typename":"TreasureChestValueUpdated","type":"ValueUpdated","value":"659998"}}},"type":"data"},
ValueUpdated2: {"payload":{"data":{"treasureChestMessageReceived":{"__typename":"TreasureChestValueUpdated","type":"ValueUpdated","value":"58949778"}}},"id":"1","type":"data"},
Host: {"__typename":"ChatHost","id":"8ecb00e0-1061-4d52-804c-b5e7b5ef7ff4","role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":false,"type":"Host","viewer":2},
Lemon: {"__typename":"ChatGift","type":"Gift","id":"688b3a22-34c0-4fe5-afbb-e82434013c35","sender":{"__typename":"StreamchatUser","id":"streamchatuser:soren.invicta","username":"soren.invicta","displayname":"Soren.Invicta","avatar":"https://image.dlivecdn.com/avatar/default12.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"createdAt":"1610073419355881366","gift":"LEMON","amount":"1","recentCount":1,"expireDuration":0,"message":""},
Lemons: {"__typename":"ChatGift","amount":"5","createdAt":"1593804669046558744","expireDuration":0,"gift":"LEMON","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
IceCream: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"ICE_CREAM","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
IceCreams: {"__typename":"ChatGift","amount":"3","createdAt":"1593804669046558744","expireDuration":0,"gift":"ICE_CREAM","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Diamond: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"DIAMOND","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Hello Frens","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Diamond2: {"__typename":"ChatGift","type":"Gift","id":"a466fc18-58aa-4659-b166-012646cc144d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-kphjutjxyt","username":"dlive-kphjutjxyt","displayname":"97123_vegas","avatar":"https://images.prd.dlivecdn.com/avatar/default20.png","partnerStatus":"NONE","badges":["CHRISTMAS_TREE","SANTA"],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"createdAt":"1609390512462873916","gift":"DIAMOND","amount":"1","recentCount":1,"expireDuration":0,"message":"2.00 a round for ammo now?"},
Diamond3: {"__typename":"ChatGift","type":"Gift","id":"a466fc18-58aa-4659-b166-012646cc144d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-kphjutjxyt","username":"dlive-kphjutjxyt","displayname":"97123_vegas","avatar":"https://images.prd.dlivecdn.com/avatar/default20.png","partnerStatus":"NONE","badges":["CHRISTMAS_TREE","SANTA"],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"createdAt":"1609390512462873916","gift":"DIAMOND","amount":"1","recentCount":1,"expireDuration":0,"message":"pipipupu https://www.youtube.com/watch?v=3w-r3VtZl_k pupupuipi"},
Ninjaghini2: {"__typename":"ChatText","type":"Message","id":"fa701547-daa5-438d-a9b7-30c37dcf70d7","content":"6 ninjaghinis","createdAt":"1609390611166389797","subLength":1,"sender":{"__typename":"StreamchatUser","id":"streamchatuser:iamcheese","username":"iamcheese","displayname":"CEOofWamen","avatar":"https://images.prd.dlivecdn.com/avatar/bd5c25ca-153b-11eb-aed2-be53b0f89a8c","partnerStatus":"NONE","badges":["CHRISTMAS_TREE"],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"emojis":[]},
Ninjaghini: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"NINJAGHINI","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Pee Pee poo Poo","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Ninjet: {"__typename":"ChatGift","amount":"1","createdAt":"1593804669046558744","expireDuration":0,"gift":"NINJET","id":"5ac8bdb9-8e72-4418-8b37-d0e616e91098","message":"Dee Dee Get Out Of My laboratory","recentCount":1,"role":"None","roomRole":"Moderator","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/799c0ae0-a4e2-11ea-b737-e2443572cd01","badges":[],"displayname":"FerociousChihuahua","effect":null,"id":"streamchatuser:ferociouschihuahua","partnerStatus":"AFFILIATE","username":"ferociouschihuahua"},"subscribing":true,"type":"Gift"},
Mod: {"__typename":"ChatModerator","type":"Mod","id":"4ba35866-7b3d-4922-b1e0-a25907f9555e","sender":{"__typename":"StreamchatUser","id":"streamchatuser:thestoryofdori","username":"thestoryofdori","displayname":"TheStoryOfDori13","avatar":"https://images.prd.dlivecdn.com/avatar/1b0c639f-208d-11ea-bd1e-563a837bad22","partnerStatus":"AFFILIATE","badges":[],"effect":"https://images.prd.dlivecdn.com/effect/trx"},"role":"None","roomRole":"Moderator","subscribing":true,"add":true},
Subscription: {"__typename":"ChatSubscription","type":"Subscription","id":"cc51028f-4042-45b5-9b64-8ce03fb0b5c5","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-51995646","username":"dlive-51995646","displayname":"GrimGriz","avatar":"https://images.prd.dlivecdn.com/avatar/c8e244e6-5c97-11e9-ab17-865634f95b6b","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":true,"month":3},
SubStreak: {"__typename":"ChatSubStreak","id":"3bd0a19e-8791-410d-b3b2-9f044ba33881","length":2,"role":"None","roomRole":"Member","sender":{"__typename":"StreamchatUser","avatar":"https://images.prd.dlivecdn.com/avatar/f85df577-6e2f-11ea-8119-a272e850df75","badges":[],"displayname":"PROPRBOY","effect":null,"id":"streamchatuser:proprboy","partnerStatus":"NONE","username":"proprboy"},"subscribing":true,"type":"SubStreak"},
TCValue: {"__typename":"ChatTCValueAdd","type":"TCValue","id":"47f8158d-2006-418f-9954-99c160349a5d","sender":{"__typename":"StreamchatUser","id":"streamchatuser:vampirefrog","username":"vampirefrog","displayname":"vampirefrog","avatar":"https://images.prd.dlivecdn.com/avatar/e3d74c4e-d4fc-11ea-8cd4-c20daac9fa96","partnerStatus":"AFFILIATE","badges":[],"effect":null},"role":"None","roomRole":"Owner","subscribing":false,"amount":"3000000","totalAmount":"5139478"},
Timeout: {"__typename":"ChatTimeout","type":"Timeout","id":"0320ec61-2679-4a3e-9f61-c09bcddad6a0","sender":{"__typename":"StreamchatUser","id":"streamchatuser:dlive-woabgpyuop","username":"dlive-woabgpyuop","displayname":"M_o_h_a_m_a_d","avatar":"https://image.dlivecdn.com/avatar/default7.png","partnerStatus":"NONE","badges":[],"effect":null},"role":"None","roomRole":"Member","subscribing":false,"bannedBy":{"__typename":"StreamchatUser","id":"streamchatuser:cascadiannationalist","username":"cascadiannationalist","displayname":"CascadiaPNW","avatar":"https://images.prd.dlivecdn.com/avatar/52b10bde-b03d-11ea-b737-e2443572cd01","partnerStatus":"NONE"},"minute":5,"bannedByRoomRole":"Moderator"},
ValueUpdated: {"id":"1","payload":{"data":{"treasureChestMessageReceived":{"__typename":"TreasureChestValueUpdated","type":"ValueUpdated","value":"659998"}}},"type":"data"},
ValueUpdated2: {"payload":{"data":{"treasureChestMessageReceived":{"__typename":"TreasureChestValueUpdated","type":"ValueUpdated","value":"58949778"}}},"id":"1","type":"data"},
};
if(msg.type == 'Message' && this.getChannelByName(msg.sender.username) && testMessages[msg.content]) {
msg = testMessages[msg.content];
@ -175,6 +184,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'chat',
client: this,
source: source,
id: msg.id,
original: msg,
text: text,
@ -215,6 +225,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'chat',
client: this,
source: source,
id: msg.id,
original: msg,
text: text,
@ -230,11 +241,16 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'gift',
client: this,
source: source,
id: msg.id,
original: msg,
message: msg.message,
giftType: msg.gift,
currency: 'LEMON',
value: this.getGiftValue(msg.gift),
amount: parseInt(msg.amount),
message: msg.message,
username: msg.sender.username,
displayName: msg.sender.displayname,
avatar: msg.sender.avatar
@ -244,6 +260,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'follow',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -255,6 +272,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'host',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -268,6 +286,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'subscribe',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -280,6 +299,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'resubscribe',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -293,6 +313,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'giftSub',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -305,6 +326,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'giftSubReceive',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -317,6 +339,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'subStreak',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -325,12 +348,12 @@ class DLiveChat extends Chat {
length: msg.length
});
break;
case 'TCValue':
this.emit('message', {
type: 'chestValue',
client: this,
id: msg.id,
source: source,
original: msg,
username: msg.sender.username,
displayName: msg.sender.displayname,
@ -345,11 +368,11 @@ class DLiveChat extends Chat {
break;
case 'Clip':
break;
case 'Delete':
this.emit('message', {
type: 'delete',
client: this,
source: source,
id: msg.id,
original: msg,
client: this,
@ -361,6 +384,7 @@ class DLiveChat extends Chat {
type: 'ban',
client: this,
id: msg.id,
source: source,
original: msg,
username: msg.sender.username,
displayName: msg.sender.displayname,
@ -377,6 +401,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'timeout',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -389,6 +414,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'moderator',
client: this,
source: source,
id: msg.id,
original: msg,
username: msg.sender.username,
@ -406,6 +432,7 @@ class DLiveChat extends Chat {
this.emit('message', {
type: 'unknown',
client: this,
source: source,
id: msg.id,
original: msg
});
@ -417,6 +444,13 @@ class DLiveChat extends Chat {
if(!data.type)
return;
var source = null;
for(let i in this.channels) {
if(this.channels[i].id == data.id) {
source = this.channels[i];
}
}
if(data.type == 'connection_ack') {
if(this.state != 'connected') {
this.state = 'connected';
@ -436,7 +470,7 @@ class DLiveChat extends Chat {
if(data.payload.data.streamMessageReceived) {
for(let i in data.payload.data.streamMessageReceived) {
let msg = data.payload.data.streamMessageReceived[i];
this.handleStreamMessage(msg);
this.handleStreamMessage(msg, source);
}
}
}

@ -0,0 +1,512 @@
if(typeof process === 'object') {
// node.js only
var Chat = require('./Chat');
var TrovoSocket = require('./trovo.js/lib/socket/TrovoSocket');
var TrovoApollo = require('./trovo.js/lib/api/TrovoApollo');
var EventEmitter = require('events');
var fetch = require('node-fetch');
}
class TrovoChat extends Chat {
constructor(settings) {
super(settings);
this.settings = settings || {};
this.gifts = {};
this.emotes = {};
this.client = new TrovoApollo();
if(!this.settings.email || !this.settings.password) {
this.connect();
return;
}
this.log('Logging in with email and password', this.settings.email);
this.client.login(this.settings.email, this.settings.password).then((login) => {
this.emit('auth', login);
this.log('AUTH', login);
this.connect();
}).catch((e) => {
this.error('Error logging in', e);
});
}
loadEmotes() {
var emotesUrl = 'https://console.trovo.live/api/public/object?appid=madcat&schemaid=emotes&appkey=884aa07fbdbb42ffbd6a851f6cae43d6&size=total';
var fetchData = {
method: 'GET',
headers: {
'Content-type': 'application/json',
}
};
fetch(emotesUrl, fetchData)
.then((response) => {
return response.json();
})
.then((json) => {
this.emotes = {};
for(var i in json.data) {
this.emotes[json.data[i].hold] = json.data[i];
}
})
.catch((error) => {
reject(error);
})
;
}
getPlatformName() { return 'trovo'; }
createChannelWS(channel) {
var testEvents = {
userFollowed: {
unknownInt: 101379536,
identifier: '1611412852879554538_101588242_101379536_2886928683_1',
user: 'konic',
content: 'just followed channel!',
id: 1611412852879558000,
chatType: 5003,
anotherIdentifier: '101588242_101588242_1611401808',
iconURL: '2dwqubqaaaaaazbwhlpmzdc2cy.jpeg?t=1',
accountName: 'konic40',
'follow.chatViewerThreshold': '100',
'follow.chatShowAuth': '100000|100001',
'live.viewers': '8'
},
giftReceived: {
unknownInt: 101528826,
identifier: '1611412000411439538_101588242_101528826_2886928683_1',
user: 'Rainpipe',
content: { id: 520010002, num: 1, name: 'Stay Safe', type: 'MANA', value: 100 },
id: 1611412000411441000,
chatType: 5,
anotherIdentifier: '101588242_101588242_1611401808',
iconURL: '7i2a2bqaaaaabuwpez2xrz2zcy.jpeg?t=0',
accountName: 'Rainpipe'
},
giftReceived2: {
unknownInt: 101379536,
identifier: '1611414744841871626_101588242_101379536_2886928683_1',
user: 'konic',
content: { id: 520010003, num: 1, name: 'On Fire', type: 'MANA', value: 500 },
id: 1611414744841873200,
chatType: 5,
anotherIdentifier: '101588242_101588242_1611401808',
iconURL: '2dwqubqaaaaaazbwhlpmzdc2cy.jpeg?t=1',
accountName: 'konic40'
},
giftReceived3: {
unknownInt: 101488110,
identifier: '1611430885375436015_101588242_101488110_2886928683_1',
user: 'comfyfren',
content: 'Poopoo https://www.youtube.com/watch?v=lzv0crh5tWM Pee Pee https://www.youtube.com/watch?v=o-ITxecOAlA doo doo',
id: 1611430885375437300,
chatType: 6,
anotherIdentifier: '101588242_101588242_1611401808',
iconURL: '5.png',
accountName: 'comfyfren',
'magicChat.magicChatGiftID': '520000995',
webmsgid: '98955522'
},
userJoined: {
unknownInt: 101518072,
identifier: '1611419853281181128_101588242_101518072_2886928017_1',
user: 'innsmouthlook',
content: 'just joined channel!',
id: 1611419853281186300,
chatType: 5004,
anotherIdentifier: '101588242_101588242_1611401808',
iconURL: '7afa2bqaaaaab5nyypujbm2zcy.jpeg?t=0',
accountName: 'innsmouthlook',
'welcome.chatViewerThreshold': '100',
'welcome.chatShowAuth': '100000|100001',
'live.viewers': '6'
},
};
return new Promise((resolve, reject) => {
this.log('Opening WebSocket', channel.channelName);
this.client.GetLiveInfo(channel.channelName).then((data) => {
// get gift data
this.client.GetGiftShop({
"channelID": data.getLiveInfo.channelInfo.id,
"channelOnly": false,
"includeOffShelf": true,
"customGift": true
}).then((data) => {
this.gifts = {};
for(let info of data.getGiftShop.shopItemInfo) {
this.gifts[info.giftInfo.giftID] = info;
}
}).catch((e) => {
this.error('Could not get gift shop', e);
});
var emitter = new EventEmitter();
var ws = new TrovoSocket(data.getLiveInfo.channelInfo.id, emitter);
emitter.on('socketMessage', (event) => {
this.log('RECV', event.data);
});
emitter.on('chatMessage', (message) => {
this.log('chatMessage', JSON.stringify(message));
if(message.user == channel.channelName && testEvents[message.content]) {
this.handleChatEvent(channel, message.content.replace(/[0-9]+$/, ''), testEvents[message.content]);
return;
}
this.handleChatMessage(channel, message);
});
emitter.on('chatEvent', (type, data) => {
this.handleChatEvent(channel, type, data);
});
ws.connect();
channel.ws = ws;
}).catch((e) => {
this.error(`Could not get live info for ${channel.channelName}`, e);
});
});
}
getAvatarUrl(iconURL) {
return 'https://headicon.trovo.live/user/'+iconURL+'?max_age=31536000&imageView2/2/w/100/h/100/format/webp'
}
handleChatMessage(channel, message) {
var spans = [];
var state = 'none', emote = '', span = '';
var eatChar = (c) => {
switch(state) {
case 'none':
if(c == ':') {
if(span) spans.push(span);
span = '';
state = 'emote';
emote = '';
} else if(c === null) {
spans.push(span);
} else {
span += c;
}
break;
case 'emote':
if(c == ' ' || c === null) {
if(this.emotes[emote]) {
console.log('emote', emote, this.emotes[emote]);
spans.push({
type: 'image',
size: 'small',
class: 'emote',
src: this.emotes[emote].name,
alt: this.emotes[emote].desc||emote
});
span = (c || '');
} else {
span += ':' + emote + (c||'');
}
state = 'none';
} else {
emote += c;
}
break;
}
};
// we use a simple state machine to parse the emotes
for(let i = 0; i < message.content.length; i++) {
eatChar(message.content[i]);
}
// process state machine once more after end of string
eatChar(null);
this.emit('message', {
type: 'chat',
client: this,
source: { channelName: channel.channelName, data: channel.data },
id: message.id,
original: message,
text: message.content,
spans: spans,
username: message.accountName,
displayName: message.user,
avatar: this.getAvatarUrl(message.iconURL)
});
}
handleChatEvent(channel, type, data) {
switch(type) {
case 'giftReceived':
var message, giftId, currency, value, amount, giftName, icon;
if(data.chatType == 5) {
message = '';
giftId = data.content.id.toString();
let giftData = this.gifts[giftId];
if(giftData) {
currency = giftData.priceInfo.currencyType.replace(/^EM_CURRENCY_TYPE_/, '');
value = giftData.priceInfo.number;
giftName = giftData.giftInfo.name;
icon = giftData.giftInfo.icon;
}
amount = data.content.num;
} else {
message = data.content;
giftId = data['magicChat.magicChatGiftID'];
}
let giftData = this.gifts[giftId];
if(giftData) {
currency = giftData.priceInfo.currencyType.replace(/^EM_CURRENCY_TYPE_/, '');
value = giftData.priceInfo.number;
amount = giftData.giftInfo.number;
giftName = giftData.giftInfo.name;
icon = giftData.giftInfo.icon;
}
this.emit('message', {
type: 'gift',
client: this,
source: { channelName: channel.channelName, data: channel.data },
id: data.id,
original: data,
message: message,
giftType: giftName,
currency: currency,
value: value,
amount: amount,
icon: icon,
username: data.accountName,
displayName: data.user,
avatar: this.getAvatarUrl(data.iconURL)
});
break;
case 'userFollowed':
this.emit('message', {
type: 'follow',
client: this,
source: { channelName: channel.channelName, data: channel.data },
id: data.id,
original: data,
username: data.accountName,
displayName: data.user,
avatar: this.getAvatarUrl(data.iconURL)
});
break;
case 'userJoined':
this.emit('message', {
type: 'join',
client: this,
source: { channelName: channel.channelName, data: channel.data },
id: data.id,
original: data,
username: data.accountName,
displayName: data.user,
avatar: this.getAvatarUrl(data.iconURL)
});
break;
case 'userSubbed':
break;
case 'raidUser':
break;
}
}
connect() {
this.log('CONNECT');
this.state = 'connected';
this.emotes = {};
this.loadEmotes();
for(let i in this.channels) {
this.createChannelWS(this.channels[i]).then((ws) => {
this.channels[i].ws = ws;
}).catch((e) => {
this.error('Could not create channel WebSocket', e);
});
}
}
joinChannel(channelName, data) {
var channelData = {
channelName: channelName,
data: data,
joined: false
};
if(this.state == 'connected') {
this.createChannelWS(channelData).then((ws) => {
channelData.ws = ws;
}).catch((e) => {
this.error('Could not create channel WebSocket', e);
});
}
this.channels.push(channelData);
}
leaveChannel(channelName) {
return new Promise((resolve, reject) => {
var channel = this.getChannelByName(channelName);
if(!channel) reject(new Error('Channel unrecognized'));
var data = {
id: user.id,
type:'stop'
};
this.send(data);
resolve(true);
});
}
getChannelById(id) {
for(let i in this.channels) {
if(this.channels[i].id == id)
return this.channels[i];
}
return null;
}
getChannelByName(channelName) {
for(let i in this.channels) {
if(this.channels[i].channelName == channelName)
return this.channels[i];
}
return null;
}
getChannelData(channelName) {
var channel = this.getChannelByName(channelName);
if(!channel) return null;
return channel.data;
}
isJoined(channelName) {
var channel = this.getChannelByName();
if(!channel) return null;
return channel.joined;
}
getJoinedChannels() {
var ret = [];
for(let i in this.channels) {
if(this.channels[i].joined)
ret.push(this.channels[i].channelName);
}
return ret;
}
isConnected() {
return this.state == 'connected';
}
sendStreamChatMessage(message, streamer) {
return new Promise((resolve, reject) => {
reject('Not implemented');
if(!streamer && !this.loginUser) {
reject(new Error('No streamer or login user specified'));
return;
}
streamer = streamer || this.loginUser;
this.post({
"operationName":"SendStreamChatMessage",
"variables":{
"input":{
"streamer":streamer,
"message":message,
"roomRole":"Member",
"subscribing":true
}
},
"query": `
mutation SendStreamChatMessage($input: SendStreamchatMessageInput!) {
sendStreamchatMessage(input: $input) {
err {
message
code
}
message {
type
... on ChatText {
id
emojis
content
createdAt
subLength
subscribing
role
roomRole
sender {
id
username
displayname
avatar
partnerStatus
badges
effect
}
}
}
}
}
`
}).then((data) => {
if(!data || !data.sendStreamchatMessage) {
reject(data);
return;
}
if(data.sendStreamchatMessage.err) {
reject(data.sendStreamchatMessage.err);
} else {
resolve(data.sendStreamchatMessage.message);
}
}).catch((err) => {
reject(err);
});
});
}
livestreamChatroomInfo(displayname) {
let isLoading = true;
return this.post({
operationName: 'LivestreamChatroomInfo',
variables: {
displayname: displayname
},
query: `
query LivestreamChatroomInfo(
$displayname: String!
) {
userByDisplayName(displayname: $displayname) {
id
username
displayname
avatar
partnerStatus
myChatBadges
}
}
`
});
}
}
if(typeof process === 'object') {
module.exports = TrovoChat;
}

@ -5,16 +5,12 @@ if(typeof process === 'object') {
class TwitchChat extends Chat {
constructor(settings) {
super();
super(settings);
settings = settings || {};
this.wsUrl = settings.wsUrl || 'wss://irc-ws.chat.twitch.tv/';
this.state = 'none';
this.verbose = settings.verbose || false;
// Keepalive
this.pingTime = settings.pingTime || 20000; // miliseconds
this.pingInterval = null;

@ -1,3 +1,4 @@
'use strict'
exports.DLiveChat = require('./DLiveChat');
exports.TwitchChat = require('./TwitchChat');
exports.TrovoChat = require('./TrovoChat');

Loading…
Cancel
Save