UNPKG

tweeter-client

Version:
6 lines • 9.57 kB
#!/usr/bin/env node /*! *** Tweeter Client 4.2.2 *** Copyright © 2020, Jaid <jaid.jsx@gmail.com> (https://github.com/Jaid) *** @license MIT !*/!function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=21)}([function(e,t,n){"use strict";n.d(t,"c",(function(){return c})),n.d(t,"a",(function(){return l}));var i=n(4),o=n.n(i),r=n(8),s=n.n(r);const a=new o.a({name:"Tweeter Client",version:"4.2.2",gotLogLevel:"info",useGot:!0,configSetup:{defaults:s(),secretKeys:["apiKey"]}}),c=a.logger,l=a.config;t.b=a},function(e,t){e.exports=require("@hapi/joi")},function(e,t){e.exports=require("jimp")},function(e,t){e.exports=require("has-content")},function(e,t){e.exports=require("jaid-core")},function(e,t){e.exports=require("@absolunet/fsp")},function(e,t){e.exports=require("canvas")},function(e,t){e.exports=require("yargs")},function(e,t){e.exports={apiHost:"localhost",apiProtocol:"http",apiPort:80,tweeters:[],apiUser:"jaid"}},function(e,t){e.exports=require("ensure-array")},function(e,t){e.exports=require("dead-by-daylight")},function(e,t){e.exports=require("handlebars")},function(e,t){e.exports=require("humanize-list")},function(e,t){e.exports=require("node-schedule")},function(e,t){e.exports=require("pick-random")},function(e,t){e.exports=require("render-dead-by-daylight-build")},function(e,t){e.exports=require("got")},function(e,t){e.exports=require("jsqr")},function(e,t){e.exports=require("twit")},function(e,t){e.exports=require("moment")},function(e,t){e.exports=require("steam-game-update-watcher")},function(e,t,n){"use strict";n.r(t);var i=n(7),o=n.n(i),r=n(0);function s(e){var t;(null===r.b||void 0===r.b||null===(t=r.b.logger)||void 0===t?void 0:t.error)?r.b.logger.error(e):console.error(e)}process.on("unhandledRejection",e=>{s(e?`Unhandled promise rejection: ${(null==e?void 0:e.message)||e}`:"Unhandled promise rejection"),(null==e?void 0:e.stack)&&s(e.stack)}),o.a.scriptName("tweeter-client").version("4.2.2").command("$0","Creates tweets.",{},(function(){(async function(){const e={},t=n(22);for(const n of t.keys()){const{pluginName:i}=n.match(/[/\\](?<pluginName>.+?)[/\\]index\.js$/).groups;e[i]=t(n).default}await r.b.init(e)})().catch(e=>{s("Core process crashed"),s(e),process.exit(1)})})).argv},function(e,t,n){var i={"./main/index.js":23};function o(e){var t=r(e);return n(t)}function r(e){if(!n.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}o.keys=function(){return Object.keys(i)},o.resolve=r,e.exports=o,o.id=22},function(e,t,n){"use strict";n.r(t);var i=n(9),o=n.n(i),r=n(3),s=n(4),a=n(0);let c=1;class l{constructor(e,t,n){this.handle=e,this.dry=t,this.index=c,this.options=n,c++}static initStatic(){const e=Q.core.got;l.apiGot=e.extend({method:"POST",prefixUrl:`${a.a.apiProtocol}://${a.a.apiHost}`,port:a.a.apiPort,hooks:{init:[e=>{e.json||(e.json={}),Object.assign(e.json,{apiUser:a.a.apiUser,apiKey:a.a.apiKey})}]}})}async post(e,t){try{a.c.info("[Tweeter #%s] @%s: %s",this.index,this.handle,e),a.c.debug(`Media length: ${t.length}`);const n=await l.apiGot.post("tweet",{json:{text:e,media:t,handle:this.handle}});a.c.debug("Tweet result: [%s %s] %s",n.statusCode,n.statusMessage,n.body)}catch(e){a.c.error("[Tweeter #%s] Could not send tweet: %s",this.index,e)}}async postMedia(e){await this.post("",e)}}l.apiGot=null;var u=n(5),d=n.n(u),p=n(1),f=n.n(p),h=n(10),g=n.n(h),y=n(11),w=n.n(y),m=n(12),x=n.n(m),b=n(2),v=n.n(b),T=n(13),j=n.n(T),k=n(14),q=n.n(k),D=n(15),P=n.n(D),O=new Intl.Collator(void 0);function _(e,t){return O.compare(e.title,t.title)}class S extends l{async start(){this.template=w.a.compile(this.options.template),this.options.cron||await this.run(),j.a.scheduleJob(this.options.cron,()=>{this.run()})}getPerkPool(){const e=Object.values(g.a.perks);return this.options.perksType?e.filter(e=>!!e.visible&&e.for===this.options.perksType):e.filter(e=>!!e.visible)}getPicks(){const e=this.getPerkPool(),t=q()(e,{count:4});return t.sort(_),t}getText(e){return this.template({perks:x()(e.map(e=>e.title)),options:this.options})}async getBackgroundBuffer(){return await d.a.readFile(this.options.backgroundFile)}async run(){const e=this.getPicks(),t=e=>e.id,n=Array(e.length);for(let i=0;i<=e.length-1;i++)n[i]=t(e[i]);const i=await P()(n),o=await v.a.create(i),r=await this.getBackgroundBuffer(),s=await v.a.create(r);s.composite(o,0,0);const a=await s.getBase64Async(v.a.MIME_PNG);await this.post(this.getText(e),a)}}S.displayName="DeadByDaylightBuild",S.schema=f.a.object().keys({perksType:f.a.string(),cron:f.a.string(),backgroundFile:f.a.string().required(),template:f.a.string().default("Today's Dead by Daylight {{{options.perksType}}} build contains {{{perks}}}.")});var C=n(16),M=n.n(C),U=n(17),B=n.n(U),N=async e=>{const t=await v.a.read(e),n=t.getWidth(),i=t.getHeight(),o=new Uint8ClampedArray(n*i*4);for(let e=0;i>e;e++)for(let i=0;n>i;i++){const r=v.a.intToRGBA(t.getPixelColor(i,e));o[4*(e*n+i)+0]=r.r,o[4*(e*n+i)+1]=r.g,o[4*(e*n+i)+2]=r.b,o[4*(e*n+i)+3]=r.a}return B()(o,n,i)},$=n(18),I=n.n($);class R extends l{constructor(...e){super(...e),this.twit=null}async start(){const e=await l.apiGot("credentials",{json:{handle:this.handle}}).json();this.twit=new I.a(e);const t={};this.options.track&&(t.track=this.options.track),this.options.language&&(t.language=this.options.language),this.twit.stream("statuses/filter",t).on("tweet",async e=>{if(!e.retweeted_status&&(this.options.includeReplies||!e.in_reply_to_status_id)){if(this.shouldHandleTweet&&!await this.shouldHandleTweet(e))return;await this.reactToTweet(e.id_str)}})}async reactToTweet(e){this.options.reaction&&("retweet"!==this.options.reaction||await this.twit.post(`statuses/retweet/${e}`))}}R.baseSchema={reaction:f.a.any(),includeReplies:f.a.boolean().default(!0),track:f.a.any(),language:f.a.any()};class G extends R{async shouldHandleTweet(e){var t;if(Object(r.isEmpty)(null===(t=e.extended_entities)||void 0===t?void 0:t.media))return!1;for(const t of e.extended_entities.media)if("photo"!==t.type)return!1;const n=[];for(const t of e.extended_entities.media){var i;const e=await M()(t.media_url).buffer(),o=await N(e);(null==o||null===(i=o.binaryData)||void 0===i?void 0:i.length)&&n.push(o)}return!Object(r.isEmpty)(n)}}G.displayName="RetweetQrCodes",G.schema=f.a.object().keys({...R.baseSchema});var H=n(6),A=n(19),E=n.n(A),F=n(20),K=n.n(F);class L extends l{async start(){this.watcher=new K.a({depotId:this.options.depotId}),this.watcher.on("contentChanged",async()=>{try{const e=await this.renderImage();a.c.info(e.slice(0,50)),await this.postMedia(e)}catch(e){a.c.error("Tweeter %s could not generate tweet: %s",this.id,e)}}),this.watcher.start(),a.c.info("Started watching on Steam depot %s (%s)",this.options.depotId,this.options.title)}async renderImage(){const e=Object(H.createCanvas)(1920,1080),t=e.getContext("2d");if(this.info.backgroundFile){let e=await d.a.readFile(this.info.backgroundFile);if(this.info.randomHue){const t=await v.a.read(e);t.color([{apply:"hue",params:[Math.random()*this.info.randomHue-this.info.randomHue/2]}]),e=await t.getBufferAsync("image/png")}const n=await Object(H.loadImage)(e);t.drawImage(n,0,0)}else t.fillStyle="#000",t.fillRect(0,0,1920,1080);t.fillStyle="#DDD",t.textAlign="center",t.textBaseline="top",t.font="240px Ubuntu",t.fillText("New Patch",960,300),t.fillStyle="#DDD",t.textAlign="center",t.textBaseline="top",t.font="60px Ubuntu",t.fillText(`in ${this.info.title}`,960,600);const n=E()().format("MMMM DD, YYYY");return t.fillStyle="#DDD",t.textAlign="center",t.textBaseline="bottom",t.font="60px Ubuntu",t.fillText(n,960,290),e.toDataURL()}}L.displayName="SteamGameUpdate";class Y extends l{async start(){this.post(`Tweeter Client v4.2.2, ${Date.now()}`)}}Y.displayName="Test";var J={test:{Type:Y},steamGameUpdate:{Type:L},deadByDaylightBuild:{Type:S},qrCodeReactions:{Type:G}};class z extends s.JaidCorePlugin{constructor(...e){super(...e),this.tweeters=[]}setCoreReference(e){this.core=e}async init(){l.initStatic();const e=o()(this.core.config.tweeters);if(Object(r.isEmpty)(e))this.log("No tweeters configured!");else{for(const{type:t,handle:n,dry:i,...o}of e){const e=J[t];if(!e)return void this.logger.warn(`Unknown tweeter type ${t}`);const r=e.Type;let s=o;if(r.schema){const e=r.schema.validate(o);if(e.error)throw this.logger.warn(`Invalid configuration for tweeter type ${t}`),this.logger.warn(e.error.message),new Error(e.error.message);s=e.value}const a=new r(n,i,s);if(!n)return void this.log(`Tweeter #${a.index} does not have a handle`);this.tweeters.push(a),this.log("Registered tweeter #%s (%s) for @%s",a.index,r.displayName,n)}for(const e of this.tweeters){var t;await(null===(t=e.start)||void 0===t?void 0:t.call(e))}}}}var Q=t.default=new z}]);