Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] Noon message not sent #1061

Closed
C0ZEN opened this issue Oct 25, 2020 · 3 comments · Fixed by #1063
Closed

[BUG] Noon message not sent #1061

C0ZEN opened this issue Oct 25, 2020 · 3 comments · Fixed by #1063
Assignees
Labels
bug Something isn't working released Added when a Github/npm release was made
Milestone

Comments

@C0ZEN
Copy link
Member

C0ZEN commented Oct 25, 2020

Describe the bug
The noon message was not sent the 25/10/2020.

Expected behavior
The noon message should at least be sent in two channels of the Sonia guild.

@C0ZEN C0ZEN added the bug Something isn't working label Oct 25, 2020
@C0ZEN C0ZEN added this to the v2.0.0 milestone Oct 25, 2020
@C0ZEN C0ZEN self-assigned this Oct 25, 2020
@issue-label-bot
Copy link

Issue-Label Bot is automatically applying the label bug to this issue, with a confidence of 0.99. Please mark this comment with 👍 or 👎 to give our bot feedback!

Links: app homepage, dashboard and code for this bot.

@C0ZEN
Copy link
Member Author

C0ZEN commented Oct 25, 2020

So basically, the error Error: Invalid guild is causing the noon job to fail.
A catch should be missing but also the coverage seems not to be covering this case so we should enforce the tests.

Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:023] job triggered
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:024] fetching Firebase guild 264445053596991498
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:026] fetching Firebase guild 361233849847644160
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:026] fetching Firebase guild 464493369687539713
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:027] fetching Firebase guild 524004090989248522
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:027] fetching Firebase guild 532753259740266506
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:027] fetching Firebase guild 645243775777636395
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:028] fetching Firebase guild 670959886372175872
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:028] fetching Firebase guild 689176948139884566
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:028] fetching Firebase guild 689833865279307782
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:029] fetching Firebase guild 695680651814502481
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:029] fetching Firebase guild 697833083201650689
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:029] fetching Firebase guild 699730180419092591
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:029] fetching Firebase guild 722154397332668467
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:031] next job: in an hour (12:00:00)
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:212] Firebase guild 264445053596991498 fetched
 Oct 25 04:00:00 sonia-discord app/web.1 ● [DiscordMessageScheduleNoonService][11:00:00:212] Firebase guild 264445053596991498 is invalid
 Oct 25 04:00:00 sonia-discord app/web.1 /app/dist/index.js:414
 Oct 25 04:00:00 sonia-discord app/web.1 "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DiscordMessageScheduleNoonService=void 0;const e=require("tslib"),s=e.__importDefault(require("lodash")),i=e.__importDefault(require("moment-timezone")),n=require("node-schedule"),t=require("../../../../../classes/services/abstract.service"),a=require("../../../../../enums/service-name.enum"),r=require("../../../../../functions/schedule/get-every-hour-schedule-rule"),l=require("../../../../firebase/functions/guilds/is-up-to-date-firebase-guild"),o=require("../../../../firebase/services/guilds/channels/features/firebase-guilds-channels-features.service"),c=require("../../../../firebase/services/guilds/channels/features/noon/firebase-guilds-channels-features-noon.service"),g=require("../../../../firebase/services/guilds/channels/firebase-guilds-channels.service"),d=require("../../../../firebase/services/guilds/firebase-guilds.service"),u=require("../../../../logger/services/chalk/chalk.service"),h=require("../../../../logger/services/logger.service"),v=require("../../../../schedules/functions/get-next-job-date"),_=require("../../../../schedules/functions/get-next-job-date-humanized"),b=require("../../../../time/enums/timezone.enum"),S=require("../../../channels/functions/types/is-discord-guild-channel-writable"),m=require("../../../guilds/enums/discord-guild-sonia-channel-name.enum"),I=require("../../../guilds/services/config/discord-guild-config.service"),N=require("../../../guilds/services/discord-guild-sonia.service"),C=require("../../../logger/services/discord-logger-error.service"),f=require("../../../services/discord-client.service"),x=12;class k extends t.AbstractService{constructor(){super(a.ServiceNameEnum.DISCORD_MESSAGE_SCHEDULE_NOON_SERVICE),this._rule=r.getEveryHourScheduleRule(),this._job=void 0}static getInstance(){return s.default.isNil(k._instance)&&(k._instance=new k),k._instance}init(){this.startSchedule()}startSchedule(){this._createSchedule()}sendMessage(e){return this._logFetchingFirebaseGuild(e),d.FirebaseGuildsService.getInstance().getGuild(e.id).then(i=>(this._logFirebaseGuildFetched(e),this._isValidGuild(i)?(this._logValidFirebaseGuild(e),Promise.all(s.default.map(i.channels,s=>this.sendMessageByChannel(s,i,e).catch(()=>Promise.resolve())))):(this._logInvalidFirebaseGuild(e),Promise.reject(new Error("Invalid guild")))))}sendMessageByChannel(e,i,n){if(this._isNoonEnabled(e,i)){this._logFirebaseGuildChannelNoonEnabled(n,e);const i=n.channels.cache.get(e.id);return s.default.isNil(i)?(this._logInValidDiscordGuildChannel(n,e),Promise.reject(new Error("Guild channel not found"))):(this._logValidDiscordGuildChannel(n,e),this.sendMessageResponse(i))}return this._logFirebaseGuildChannelNoonDisabled(n),Promise.reject(new Error("Noon state disabled"))}handleMessages(){this._canSendMessage()&&f.DiscordClientService.getInstance().getClient().guilds.cache.forEach(e=>{this.sendMessage(e)})}sendMessageResponse(e){const s=this._getMessageResponse();return S.isDiscordGuildChannelWritable(e)?(this._logSendingMessagesForNoon(e),e.send(s.response,s.options).then(s=>(this._logNoonMessageSent(e),Promise.resolve(s))).catch(s=>(this._onMessageError(s,e),Promise.reject(s)))):(this._logGuildChannelNotWritable(e),Promise.reject(new Error("Guild channel not writable")))}_isNoonEnabled({id:e},i){var n,t,a,r,l;return!(s.default.isNil(e)||!this._isValidChannel(e,i)||!this._isValidFeature(e,i)||!this._isValidNoonFeature(e,i))&&(null!==(l=null===(r=null===(a=null===(t=null===(n=i.channels)||void 0===n?void 0:n[e])||void 0===t?void 0:t.features)||void 0===a?void 0:a.noon)||void 0===r?void 0:r.isEnabled)&&void 0!==l&&l)}_isValidChannel(e,s){return g.FirebaseGuildsChannelsService.getInstance().isValid(s.channels&&s.channels[e])}_isValidFeature(e,s){return o.FirebaseGuildsChannelsFeaturesService.getInstance().isValid(s.channels&&s.channels[e].features)}_isValidNoonFeature(e,s){var i;return c.FirebaseGuildsChannelsFeaturesNoonService.getInstance().isValid(s.channels&&(null===(i=s.channels[e].features)||void 0===i?void 0:i.noon))}_isValidGuild(e){return!s.default.isNil(e)&&l.isUpToDateFirebaseGuild(e)}_createSchedule(){this._logJobRule(this._rule,"job"),this._job=n.scheduleJob(this._rule,()=>{this._executeJob()}),this._logNextJobDate()}_executeJob(){this._logJobTriggered(),this.handleMessages(),this._logNextJobDate()}_logJobTriggered(){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text("job triggered")})}_logFetchingFirebaseGuild({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`fetching Firebase guild ${u.ChalkService.getInstance().value(e)}`)})}_logFirebaseGuildFetched({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Firebase guild ${u.ChalkService.getInstance().value(e)} fetched`)})}_logValidFirebaseGuild({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Firebase guild ${u.ChalkService.getInstance().value(e)} is valid`)})}_logInvalidFirebaseGuild({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Firebase guild ${u.ChalkService.getInstance().value(e)} is invalid`)})}_logFirebaseGuildChannelNoonEnabled({id:e},s){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Firebase guild ${u.ChalkService.getInstance().value(e)} channel ${u.ChalkService.getInstance().value(s.id)} noon feature is enabled`)})}_logFirebaseGuildChannelNoonDisabled({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Firebase guild ${u.ChalkService.getInstance().value(e)} noon feature is disabled`)})}_logValidDiscordGuildChannel({id:e},s){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Discord guild ${u.ChalkService.getInstance().value(e)} channel ${u.ChalkService.getInstance().value(s.id)} is valid`)})}_logInValidDiscordGuildChannel({id:e},s){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`Discord guild ${u.ChalkService.getInstance().value(e)} channel ${u.ChalkService.getInstance().value(s.id)} is invalid`)})}_logNextJobDate(){s.default.isNil(this._job)||h.LoggerService.getInstance().logJobDate({context:this._serviceName,jobDate:v.getNextJobDate(this._job),jobDateHumanized:_.getNextJobDateHumanized(this._job),jobName:"next"})}_getMessageResponse(){return{options:{split:!1},response:"Il est midi!"}}_canSendMessage(){if(I.DiscordGuildConfigService.getInstance().shouldSendNoonMessage()){if(this._isNoonInParis())return!0;this._logNotNoonInParis()}else this._logNoonMessageSendingDisabled();return!1}_logNotNoonInParis(){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text("not noon in Paris")})}_logNoonMessageSendingDisabled(){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text("noon message sending disabled")})}_isNoonInParis(){return s.default.isEqual(i.default().tz(b.TimezoneEnum.PARIS).get("hour"),x)}_logSendingMessagesForNoon({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`sending message for noon for guild channel ${u.ChalkService.getInstance().value(e)}...`)})}_logNoonMessageSent({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`noon message sent for guild channel ${u.ChalkService.getInstance().value(e)}`)})}_logGuildChannelNotWritable({id:e}){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`the guild channel ${u.ChalkService.getInstance().value(e)} is not writable`)})}_onMessageError(e,s){this._messageErrorLog(e,s),this._sendMessageToSoniaDiscord(e)}_messageErrorLog(e,{id:s}){h.LoggerService.getInstance().error({context:this._serviceName,message:u.ChalkService.getInstance().text(`noon message sending failed for guild channel ${u.ChalkService.getInstance().value(s)}`)}),h.LoggerService.getInstance().error({context:this._serviceName,message:u.ChalkService.getInstance().error(e)})}_sendMessageToSoniaDiscord(e){N.DiscordGuildSoniaService.getInstance().sendMessageToChannel({channelName:m.DiscordGuildSoniaChannelNameEnum.ERRORS,messageResponse:C.DiscordLoggerErrorService.getInstance().getErrorMessageResponse(e)})}_logJobRule(e,s){h.LoggerService.getInstance().debug({context:this._serviceName,message:u.ChalkService.getInstance().text(`${s} rule: ${u.ChalkService.getInstance().value(e)}`)})}}exports.DiscordMessageScheduleNoonService=k;
 Oct 25 04:00:00 sonia-discord app/web.1
 Oct 25 04:00:00 sonia-discord app/web.1
 Oct 25 04:00:00 sonia-discord app/web.1 Error: Invalid guild
 Oct 25 04:00:00 sonia-discord app/web.1 at /app/dist/index.js:414:2330
 Oct 25 04:00:00 sonia-discord app/web.1 at runMicrotasks (<anonymous>)
 Oct 25 04:00:00 sonia-discord app/web.1 at processTicksAndRejections (node:internal/process/task_queues:93:5)

C0ZEN added a commit that referenced this issue Oct 25, 2020
…xists

as seen in the logs #1061 it could happen that some guilds or channels no longer exists.
in such case the process of sending noon messages should not be stopped at all since this is quite normal
@github-actions
Copy link
Contributor

🎉 This issue has been resolved in version 1.81.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@github-actions github-actions bot added the released Added when a Github/npm release was made label Oct 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working released Added when a Github/npm release was made
Projects
None yet
1 participant