@vigilant-broccoli/slackbots 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +7 -0
  2. package/package.json +18 -0
  3. package/src/index.d.ts +6 -0
  4. package/src/index.js +11 -0
  5. package/src/index.js.map +1 -0
  6. package/src/lib/consts.d.ts +3 -0
  7. package/src/lib/consts.js +8 -0
  8. package/src/lib/consts.js.map +1 -0
  9. package/src/lib/utils/modal.utils.d.ts +13 -0
  10. package/src/lib/utils/modal.utils.js +63 -0
  11. package/src/lib/utils/modal.utils.js.map +1 -0
  12. package/src/lib/utils/utils.d.ts +13 -0
  13. package/src/lib/utils/utils.js +54 -0
  14. package/src/lib/utils/utils.js.map +1 -0
  15. package/src/lib/utils/view-builder.utils.d.ts +22 -0
  16. package/src/lib/utils/view-builder.utils.js +34 -0
  17. package/src/lib/utils/view-builder.utils.js.map +1 -0
  18. package/src/office-presence-app/app-reminder.d.ts +2 -0
  19. package/src/office-presence-app/app-reminder.js +69 -0
  20. package/src/office-presence-app/app-reminder.js.map +1 -0
  21. package/src/office-presence-app/consts/app-copy.const.d.ts +54 -0
  22. package/src/office-presence-app/consts/app-copy.const.js +66 -0
  23. package/src/office-presence-app/consts/app-copy.const.js.map +1 -0
  24. package/src/office-presence-app/consts/app.consts.d.ts +10 -0
  25. package/src/office-presence-app/consts/app.consts.js +14 -0
  26. package/src/office-presence-app/consts/app.consts.js.map +1 -0
  27. package/src/office-presence-app/consts/data.consts.d.ts +2 -0
  28. package/src/office-presence-app/consts/data.consts.js +27 -0
  29. package/src/office-presence-app/consts/data.consts.js.map +1 -0
  30. package/src/office-presence-app/consts/modals.const.d.ts +5 -0
  31. package/src/office-presence-app/consts/modals.const.js +199 -0
  32. package/src/office-presence-app/consts/modals.const.js.map +1 -0
  33. package/src/office-presence-app/office-presence-app.d.ts +10 -0
  34. package/src/office-presence-app/office-presence-app.js +100 -0
  35. package/src/office-presence-app/office-presence-app.js.map +1 -0
  36. package/src/office-presence-app/types.d.ts +25 -0
  37. package/src/office-presence-app/types.js +9 -0
  38. package/src/office-presence-app/types.js.map +1 -0
  39. package/src/office-presence-app/utils/action.utils.d.ts +6 -0
  40. package/src/office-presence-app/utils/action.utils.js +83 -0
  41. package/src/office-presence-app/utils/action.utils.js.map +1 -0
  42. package/src/office-presence-app/utils/date.utils.d.ts +4 -0
  43. package/src/office-presence-app/utils/date.utils.js +43 -0
  44. package/src/office-presence-app/utils/date.utils.js.map +1 -0
  45. package/src/office-presence-app/utils/db.utils.d.ts +4 -0
  46. package/src/office-presence-app/utils/db.utils.js +66 -0
  47. package/src/office-presence-app/utils/db.utils.js.map +1 -0
  48. package/src/office-presence-app/utils/view.utils.d.ts +12 -0
  49. package/src/office-presence-app/utils/view.utils.js +130 -0
  50. package/src/office-presence-app/utils/view.utils.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # slack-bots
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Building
6
+
7
+ Run `nx build slack-bots` to build the library.
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "@vigilant-broccoli/slackbots",
3
+ "version": "0.0.1",
4
+ "type": "commonjs",
5
+ "main": "./src/index.js",
6
+ "types": "./src/index.d.ts",
7
+ "dependencies": {
8
+ "tslib": "^2.3.0",
9
+ "@slack/bolt": "*",
10
+ "@slack/types": "*",
11
+ "@slack/web-api": "*",
12
+ "node-cron": "^4.2.1",
13
+ "better-sqlite3": "^12.4.1"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ }
18
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './lib/consts';
2
+ export * from './lib/utils/modal.utils';
3
+ export * from './lib/utils/utils';
4
+ export * from './lib/utils/view-builder.utils';
5
+ export { runOfficePresenceApp } from './office-presence-app/office-presence-app';
6
+ export type { OfficePresenceAppRunConfig } from './office-presence-app/office-presence-app';
package/src/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runOfficePresenceApp = void 0;
4
+ const tslib_1 = require("tslib");
5
+ tslib_1.__exportStar(require("./lib/consts"), exports);
6
+ tslib_1.__exportStar(require("./lib/utils/modal.utils"), exports);
7
+ tslib_1.__exportStar(require("./lib/utils/utils"), exports);
8
+ tslib_1.__exportStar(require("./lib/utils/view-builder.utils"), exports);
9
+ var office_presence_app_1 = require("./office-presence-app/office-presence-app");
10
+ Object.defineProperty(exports, "runOfficePresenceApp", { enumerable: true, get: function () { return office_presence_app_1.runOfficePresenceApp; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/@vigilant-broccoli/slackbots/src/index.ts"],"names":[],"mappings":";;;;AAAA,uDAA6B;AAC7B,kEAAwC;AACxC,4DAAkC;AAClC,yEAA+C;AAE/C,iFAAiF;AAAxE,2HAAA,oBAAoB,OAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const SLACK_EVENT: {
2
+ HOME_OPENED: "app_home_opened";
3
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SLACK_EVENT = void 0;
4
+ exports.SLACK_EVENT = {
5
+ // eslint-disable-next-line @typescript-eslint/prefer-as-const
6
+ HOME_OPENED: 'app_home_opened',
7
+ };
8
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../../../../libs/@vigilant-broccoli/slackbots/src/lib/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG;IACzB,8DAA8D;IAC9D,WAAW,EAAE,iBAAsC;CACpD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Middleware, SlackActionMiddlewareArgs, SlackCommandMiddlewareArgs, BlockAction, BlockElementAction } from '@slack/bolt';
2
+ import { View } from '@slack/types';
3
+ declare function createModalHandler(modalFactory: () => View): Middleware<SlackActionMiddlewareArgs<BlockAction<BlockElementAction>>>;
4
+ declare function createModalHandlerWithUserId(modalFactory: (userId: string) => View): Middleware<SlackActionMiddlewareArgs<BlockAction<BlockElementAction>>>;
5
+ declare function createModalHandlerWithChannelId(modalFactory: (channelId: string) => View): Middleware<SlackCommandMiddlewareArgs>;
6
+ declare function createModalHandlerWithActionValue<T extends object>(modalFactory: (parsedValue: T) => View): Middleware<SlackActionMiddlewareArgs<BlockAction<BlockElementAction>>>;
7
+ export declare const SlackModalUtils: {
8
+ createModalHandler: typeof createModalHandler;
9
+ createModalHandlerWithUserId: typeof createModalHandlerWithUserId;
10
+ createModalHandlerWithChannelId: typeof createModalHandlerWithChannelId;
11
+ createModalHandlerWithActionValue: typeof createModalHandlerWithActionValue;
12
+ };
13
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SlackModalUtils = void 0;
4
+ const tslib_1 = require("tslib");
5
+ function createModalHandlerGeneric(modalFactory) {
6
+ return function (args) {
7
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
8
+ const { ack, body, client } = args;
9
+ yield ack();
10
+ const view = modalFactory(args);
11
+ yield client.views.open({
12
+ trigger_id: body.trigger_id,
13
+ view,
14
+ });
15
+ });
16
+ };
17
+ }
18
+ function createModalHandler(modalFactory) {
19
+ return createModalHandlerGeneric(function () {
20
+ return modalFactory();
21
+ });
22
+ }
23
+ function createModalHandlerWithUserId(modalFactory) {
24
+ return createModalHandlerGeneric(function ({ body }) {
25
+ return modalFactory(body.user.id);
26
+ });
27
+ }
28
+ function createModalHandlerWithChannelId(modalFactory) {
29
+ return createModalHandlerGeneric(function ({ command, }) {
30
+ return modalFactory(command.channel_id);
31
+ });
32
+ }
33
+ function createModalHandlerWithActionValue(modalFactory) {
34
+ return function (_a) {
35
+ return tslib_1.__awaiter(this, arguments, void 0, function* ({ ack, body, client }) {
36
+ var _b, _c, _d;
37
+ yield ack();
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
+ const rawValue = (_d = (_c = (_b = body.actions) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '{}';
40
+ const parsed = safeJsonParse(rawValue, {});
41
+ const view = modalFactory(parsed);
42
+ yield client.views.open({
43
+ trigger_id: body.trigger_id,
44
+ view,
45
+ });
46
+ });
47
+ };
48
+ }
49
+ function safeJsonParse(json, fallback) {
50
+ try {
51
+ return JSON.parse(json);
52
+ }
53
+ catch (_a) {
54
+ return fallback;
55
+ }
56
+ }
57
+ exports.SlackModalUtils = {
58
+ createModalHandler,
59
+ createModalHandlerWithUserId,
60
+ createModalHandlerWithChannelId,
61
+ createModalHandlerWithActionValue,
62
+ };
63
+ //# sourceMappingURL=modal.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal.utils.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/lib/utils/modal.utils.ts"],"names":[],"mappings":";;;;AASA,SAAS,yBAAyB,CAIhC,YAA+B;IAC/B,OAAO,UAAgB,IAAI;;YACzB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;YACnC,MAAM,GAAG,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAwB;IAClD,OAAO,yBAAyB,CAE9B;QACA,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,4BAA4B,CAAC,YAAsC;IAC1E,OAAO,yBAAyB,CAE9B,UAAU,EAAE,IAAI,EAAE;QAClB,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,+BAA+B,CACtC,YAAyC;IAEzC,OAAO,yBAAyB,CAA6B,UAAU,EACrE,OAAO,GACR;QACC,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iCAAiC,CACxC,YAAsC;IAEtC,OAAO;qEAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;;YAC1C,MAAM,GAAG,EAAE,CAAC;YACZ,8DAA8D;YAC9D,MAAM,QAAQ,GAAG,MAAA,MAAC,MAAA,IAAI,CAAC,OAAO,0CAAG,CAAC,CAAS,0CAAE,KAAK,mCAAI,IAAI,CAAC;YAC3D,MAAM,MAAM,GAAM,aAAa,CAAI,QAAQ,EAAE,EAAO,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAI,IAAY,EAAE,QAAW;IACjD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAEY,QAAA,eAAe,GAAG;IAC7B,kBAAkB;IAClB,4BAA4B;IAC5B,+BAA+B;IAC/B,iCAAiC;CAClC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { App, SlackViewAction, BlockAction } from '@slack/bolt';
2
+ import { AppHomeOpenedEvent } from '@slack/types';
3
+ import type { WebClient } from '@slack/web-api';
4
+ declare function getSocketApp(token?: string, appToken?: string): App<import("@slack/bolt").StringIndexed>;
5
+ type SlackUserSource = SlackViewAction | AppHomeOpenedEvent | BlockAction;
6
+ declare function getIsAdmin(source: SlackUserSource, client: WebClient): Promise<boolean>;
7
+ declare function getAllRealUsers(client: WebClient): Promise<any[]>;
8
+ export declare const SlackUtils: {
9
+ getIsAdmin: typeof getIsAdmin;
10
+ getAllRealUsers: typeof getAllRealUsers;
11
+ getSocketApp: typeof getSocketApp;
12
+ };
13
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SlackUtils = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const bolt_1 = require("@slack/bolt");
6
+ function getSocketApp(token = process.env.SLACK_BOT_TOKEN, appToken = process.env.SLACK_APP_TOKEN) {
7
+ return new bolt_1.App({
8
+ token,
9
+ appToken,
10
+ socketMode: true,
11
+ });
12
+ }
13
+ function extractUserId(source) {
14
+ var _a;
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ if (typeof ((_a = source.user) === null || _a === void 0 ? void 0 : _a.id) === 'string') {
17
+ return source.user.id;
18
+ }
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ if (typeof source.user === 'string') {
21
+ return source.user;
22
+ }
23
+ throw new Error('Unable to extract user ID from source');
24
+ }
25
+ function getIsAdmin(source, client) {
26
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
27
+ var _a, _b;
28
+ const userId = extractUserId(source);
29
+ const userInfo = yield client.users.info({ user: userId });
30
+ return ((_a = userInfo.user) === null || _a === void 0 ? void 0 : _a.is_admin) === true || ((_b = userInfo.user) === null || _b === void 0 ? void 0 : _b.is_owner) === true;
31
+ });
32
+ }
33
+ function getAllRealUsers(client) {
34
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
35
+ var _a;
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ let allUsers = [];
38
+ let cursor;
39
+ do {
40
+ const res = yield client.users.list({ cursor });
41
+ allUsers = allUsers.concat(res.members || []);
42
+ cursor = (_a = res.response_metadata) === null || _a === void 0 ? void 0 : _a.next_cursor;
43
+ } while (cursor);
44
+ // Filter to active, non-bot, non-Slackbot users
45
+ const realUsers = allUsers.filter(u => !u.is_bot && !u.deleted && u.id !== 'USLACKBOT');
46
+ return realUsers;
47
+ });
48
+ }
49
+ exports.SlackUtils = {
50
+ getIsAdmin,
51
+ getAllRealUsers,
52
+ getSocketApp,
53
+ };
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/lib/utils/utils.ts"],"names":[],"mappings":";;;;AAAA,sCAAgE;AAIhE,SAAS,YAAY,CACnB,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EACnC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;IAEtC,OAAO,IAAI,UAAG,CAAC;QACb,KAAK;QACL,QAAQ;QACR,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;AACL,CAAC;AAGD,SAAS,aAAa,CAAC,MAAuB;;IAC5C,8DAA8D;IAC9D,IAAI,OAAO,CAAA,MAAC,MAAc,CAAC,IAAI,0CAAE,EAAE,CAAA,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAQ,MAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,8DAA8D;IAC9D,IAAI,OAAQ,MAAc,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,OAAQ,MAA6B,CAAC,IAAI,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAe,UAAU,CACvB,MAAuB,EACvB,MAAiB;;;QAEjB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAA,MAAA,QAAQ,CAAC,IAAI,0CAAE,QAAQ,MAAK,IAAI,IAAI,CAAA,MAAA,QAAQ,CAAC,IAAI,0CAAE,QAAQ,MAAK,IAAI,CAAC;IAC9E,CAAC;CAAA;AAED,SAAe,eAAe,CAAC,MAAiB;;;QAC9C,8DAA8D;QAC9D,IAAI,QAAQ,GAAU,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC;QAEX,GAAG,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,GAAG,MAAA,GAAG,CAAC,iBAAiB,0CAAE,WAAW,CAAC;QAC9C,CAAC,QAAQ,MAAM,EAAE;QAEjB,gDAAgD;QAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,KAAK,WAAW,CACrD,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;CAAA;AAEY,QAAA,UAAU,GAAG;IACxB,UAAU;IACV,eAAe;IACf,YAAY;CACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { PlainTextElement } from '@slack/types';
2
+ declare function generatePlainText(text: string): PlainTextElement;
3
+ declare function generateHeader(text: string): {
4
+ type: string;
5
+ text: PlainTextElement;
6
+ };
7
+ declare function generateMarkdownSection(markdown: string): {
8
+ type: string;
9
+ text: {
10
+ type: string;
11
+ text: string;
12
+ };
13
+ };
14
+ export declare const SlackViewBuilder: {
15
+ generatePlainText: typeof generatePlainText;
16
+ generateMarkdownSection: typeof generateMarkdownSection;
17
+ generateHeader: typeof generateHeader;
18
+ DIVIDER: {
19
+ type: string;
20
+ };
21
+ };
22
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SlackViewBuilder = void 0;
4
+ function generatePlainText(text) {
5
+ return {
6
+ type: 'plain_text',
7
+ text,
8
+ };
9
+ }
10
+ function generateMarkdownText(markdown) {
11
+ return {
12
+ type: 'mrkdwn',
13
+ text: markdown,
14
+ };
15
+ }
16
+ function generateHeader(text) {
17
+ return {
18
+ type: 'header',
19
+ text: generatePlainText(text),
20
+ };
21
+ }
22
+ function generateMarkdownSection(markdown) {
23
+ return {
24
+ type: 'section',
25
+ text: generateMarkdownText(markdown),
26
+ };
27
+ }
28
+ exports.SlackViewBuilder = {
29
+ generatePlainText,
30
+ generateMarkdownSection,
31
+ generateHeader,
32
+ DIVIDER: { type: 'divider' },
33
+ };
34
+ //# sourceMappingURL=view-builder.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-builder.utils.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/lib/utils/view-builder.utils.ts"],"names":[],"mappings":";;;AAEA,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC;KACrC,CAAC;AACJ,CAAC;AAEY,QAAA,gBAAgB,GAAG;IAC9B,iBAAiB;IACjB,uBAAuB;IACvB,cAAc;IACd,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { AppConfig } from './types';
2
+ export declare function createReminderSender(appConfig: AppConfig): () => Promise<void>;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createReminderSender = createReminderSender;
4
+ const tslib_1 = require("tslib");
5
+ const web_api_1 = require("@slack/web-api");
6
+ const utils_1 = require("../lib/utils/utils");
7
+ const app_copy_const_1 = require("./consts/app-copy.const");
8
+ function getClient() {
9
+ const token = process.env.SLACK_BOT_TOKEN;
10
+ if (!token)
11
+ throw new Error('SLACK_BOT_TOKEN is not set');
12
+ return new web_api_1.WebClient(token);
13
+ }
14
+ function createReminderSender(appConfig) {
15
+ return function sendReminders() {
16
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
17
+ const client = getClient();
18
+ const allUsers = yield utils_1.SlackUtils.getAllRealUsers(client);
19
+ const userIds = allUsers.map(user => user.id);
20
+ for (const userId of userIds) {
21
+ yield postMessage(client, userId, appConfig);
22
+ }
23
+ });
24
+ };
25
+ }
26
+ function postMessage(client, channel, appConfig) {
27
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
28
+ const blocks = [
29
+ {
30
+ type: 'section',
31
+ text: {
32
+ type: 'mrkdwn',
33
+ text: app_copy_const_1.APP_COPY.REMINDER.SECTION_MARKDOWN,
34
+ },
35
+ },
36
+ ];
37
+ if (appConfig.id) {
38
+ blocks.push({
39
+ type: 'actions',
40
+ elements: [
41
+ {
42
+ type: 'button',
43
+ text: {
44
+ type: 'plain_text',
45
+ text: app_copy_const_1.APP_COPY.COMMON.OPEN_APP,
46
+ emoji: true,
47
+ },
48
+ url: getOpenAppUrl(appConfig.id),
49
+ },
50
+ ],
51
+ });
52
+ }
53
+ try {
54
+ yield client.chat.postMessage({
55
+ channel,
56
+ text: app_copy_const_1.APP_COPY.getReminderDmText(appConfig.APP_NAME),
57
+ blocks,
58
+ });
59
+ }
60
+ catch (error) {
61
+ // eslint-disable-next-line no-console
62
+ console.error('Error posting message:', error);
63
+ }
64
+ });
65
+ }
66
+ function getOpenAppUrl(appId) {
67
+ return `https://slack.com/app_redirect?app=${encodeURIComponent(appId)}`;
68
+ }
69
+ //# sourceMappingURL=app-reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-reminder.js","sourceRoot":"","sources":["../../../../../../libs/@vigilant-broccoli/slackbots/src/office-presence-app/app-reminder.ts"],"names":[],"mappings":";;AAWA,oDASC;;AApBD,4CAA2C;AAC3C,8CAAgD;AAEhD,4DAAmD;AAEnD,SAAS,SAAS;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC1D,OAAO,IAAI,mBAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,oBAAoB,CAAC,SAAoB;IACvD,OAAO,SAAe,aAAa;;YACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,kBAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,SAAe,WAAW,CACxB,MAAiB,EACjB,OAAe,EACf,SAAoB;;QAEpB,MAAM,MAAM,GAQN;YACJ;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,yBAAQ,CAAC,QAAQ,CAAC,gBAAgB;iBACzC;aACF;SACF,CAAC;QAEF,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE;4BACJ,IAAI,EAAE,YAAY;4BAClB,IAAI,EAAE,yBAAQ,CAAC,MAAM,CAAC,QAAQ;4BAC9B,KAAK,EAAE,IAAI;yBACZ;wBACD,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;qBACjC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC5B,OAAO;gBACP,IAAI,EAAE,yBAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACpD,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CAAA;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,sCAAsC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,54 @@
1
+ export declare const APP_COPY: {
2
+ COMMON: {
3
+ SUBMIT: string;
4
+ CANCEL: string;
5
+ CLOSE: string;
6
+ SAVE: string;
7
+ YES: string;
8
+ OPEN_APP: string;
9
+ };
10
+ HOME_VIEW: {
11
+ ASK_LUNCH_BUTTON: string;
12
+ CHECKOUT_BUTTON: string;
13
+ ADMIN_SETTINGS_BUTTON: string;
14
+ SELECT_OFFICE_DAYS_MARKDOWN: string;
15
+ ADD_VISIT_DETAILS_BUTTON: string;
16
+ WHO_IS_IN_OFFICE_MARKDOWN: string;
17
+ NO_ONE_SCHEDULED_MARKDOWN: string;
18
+ AFTERNOON_ONLY: string;
19
+ MORNING_ONLY: string;
20
+ };
21
+ PRESENCE_MODAL: {
22
+ TITLE: string;
23
+ SELECT_DAYS_LABEL: string;
24
+ WHOLE_DAY: string;
25
+ MORNING_ONLY: string;
26
+ AFTERNOON_ONLY: string;
27
+ PRESENCE_LABEL: string;
28
+ BRINGING_DOG_LABEL: string;
29
+ MESSAGE_LABEL: string;
30
+ OFFICE_LABEL: string;
31
+ };
32
+ SETTINGS_MODAL: {
33
+ TITLE: string;
34
+ COMING_SOON_MARKDOWN: string;
35
+ ADD_OFFICE_LABEL: string;
36
+ ADD_OFFICE_PLACEHOLDER: string;
37
+ };
38
+ ASK_LUNCH_MODAL: {
39
+ NO_USERS_MARKDOWN: string;
40
+ SELECT_USERS_MARKDOWN: string;
41
+ TITLE: string;
42
+ SUBMIT: string;
43
+ };
44
+ REMINDER: {
45
+ SECTION_MARKDOWN: string;
46
+ };
47
+ ACTIONS: {
48
+ NO_USERS_SELECTED: string;
49
+ askingAboutLunch(userId: string): string;
50
+ createdGroupChat(count: number): string;
51
+ };
52
+ getAppDescription(appName: string): string;
53
+ getReminderDmText(appName: string): string;
54
+ };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APP_COPY = void 0;
4
+ exports.APP_COPY = {
5
+ COMMON: {
6
+ SUBMIT: 'Submit',
7
+ CANCEL: 'Cancel',
8
+ CLOSE: 'Close',
9
+ SAVE: 'Save',
10
+ YES: 'Yes',
11
+ OPEN_APP: 'Open App',
12
+ },
13
+ HOME_VIEW: {
14
+ ASK_LUNCH_BUTTON: 'Ask about lunch πŸ”',
15
+ CHECKOUT_BUTTON: 'Check out πŸƒπŸ’¨',
16
+ ADMIN_SETTINGS_BUTTON: 'Admin Settings βš™οΈ',
17
+ SELECT_OFFICE_DAYS_MARKDOWN: '*Select your office days:*',
18
+ ADD_VISIT_DETAILS_BUTTON: 'Add visit details. πŸΆπŸ’πŸ•πŸ’¬',
19
+ WHO_IS_IN_OFFICE_MARKDOWN: "*Who's in the office?*",
20
+ NO_ONE_SCHEDULED_MARKDOWN: '_No one scheduled_',
21
+ AFTERNOON_ONLY: ' | πŸ• Afternoon only',
22
+ MORNING_ONLY: ' | πŸ•˜ Morning only',
23
+ },
24
+ PRESENCE_MODAL: {
25
+ TITLE: 'Schedule Office Visit',
26
+ SELECT_DAYS_LABEL: 'Select your office days',
27
+ WHOLE_DAY: 'the whole day',
28
+ MORNING_ONLY: 'the morning only',
29
+ AFTERNOON_ONLY: 'the afternoon only',
30
+ PRESENCE_LABEL: 'I will be here for.. πŸ•',
31
+ BRINGING_DOG_LABEL: 'Bringing dog? 🐢',
32
+ MESSAGE_LABEL: 'Message πŸ’¬',
33
+ OFFICE_LABEL: 'Which office are you checking into? 🏒',
34
+ },
35
+ SETTINGS_MODAL: {
36
+ TITLE: 'Settings',
37
+ COMING_SOON_MARKDOWN: '_Settings coming soon!_',
38
+ ADD_OFFICE_LABEL: 'Add a new office',
39
+ ADD_OFFICE_PLACEHOLDER: 'e.g. Berlin',
40
+ },
41
+ ASK_LUNCH_MODAL: {
42
+ NO_USERS_MARKDOWN: 'No other users are in the office today for lunch 😒',
43
+ SELECT_USERS_MARKDOWN: '*Select users to invite:*',
44
+ TITLE: 'Ask for Lunch',
45
+ SUBMIT: 'Send Invites',
46
+ },
47
+ REMINDER: {
48
+ SECTION_MARKDOWN: 'Friendly reminder to plan for your office presence with this app.',
49
+ },
50
+ ACTIONS: {
51
+ NO_USERS_SELECTED: "You didn't select any users to invite.",
52
+ askingAboutLunch(userId) {
53
+ return `<@${userId}> is asking about lunch today! πŸ”`;
54
+ },
55
+ createdGroupChat(count) {
56
+ return `Created a group chat with ${count} users!`;
57
+ },
58
+ },
59
+ getAppDescription(appName) {
60
+ return `${appName} makes it easy to plan your office visits. Mark which office you are visiting, when you’ll be in, whole day, morning, afternoon, or if you are bringing your dog. You can also leave a note for additional information about your visit ie _Bringing surdeg!_.`;
61
+ },
62
+ getReminderDmText(appName) {
63
+ return `Friendly reminder to plan for your office presence using ${appName}!`;
64
+ },
65
+ };
66
+ //# sourceMappingURL=app-copy.const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-copy.const.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/office-presence-app/consts/app-copy.const.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG;IACtB,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,UAAU;KACrB;IACD,SAAS,EAAE;QACT,gBAAgB,EAAE,oBAAoB;QACtC,eAAe,EAAE,gBAAgB;QACjC,qBAAqB,EAAE,mBAAmB;QAC1C,2BAA2B,EAAE,4BAA4B;QACzD,wBAAwB,EAAE,6BAA6B;QACvD,yBAAyB,EAAE,wBAAwB;QACnD,yBAAyB,EAAE,oBAAoB;QAC/C,cAAc,EAAE,sBAAsB;QACtC,YAAY,EAAE,oBAAoB;KACnC;IACD,cAAc,EAAE;QACd,KAAK,EAAE,uBAAuB;QAC9B,iBAAiB,EAAE,yBAAyB;QAC5C,SAAS,EAAE,eAAe;QAC1B,YAAY,EAAE,kBAAkB;QAChC,cAAc,EAAE,oBAAoB;QACpC,cAAc,EAAE,yBAAyB;QACzC,kBAAkB,EAAE,kBAAkB;QACtC,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,wCAAwC;KACvD;IACD,cAAc,EAAE;QACd,KAAK,EAAE,UAAU;QACjB,oBAAoB,EAAE,yBAAyB;QAC/C,gBAAgB,EAAE,kBAAkB;QACpC,sBAAsB,EAAE,aAAa;KACtC;IACD,eAAe,EAAE;QACf,iBAAiB,EAAE,qDAAqD;QACxE,qBAAqB,EAAE,2BAA2B;QAClD,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,cAAc;KACvB;IACD,QAAQ,EAAE;QACR,gBAAgB,EACd,mEAAmE;KACtE;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE,wCAAwC;QAC3D,gBAAgB,CAAC,MAAc;YAC7B,OAAO,KAAK,MAAM,mCAAmC,CAAC;QACxD,CAAC;QACD,gBAAgB,CAAC,KAAa;YAC5B,OAAO,6BAA6B,KAAK,SAAS,CAAC;QACrD,CAAC;KACF;IACD,iBAAiB,CAAC,OAAe;QAC/B,OAAO,GAAG,OAAO,gQAAgQ,CAAC;IACpR,CAAC;IACD,iBAAiB,CAAC,OAAe;QAC/B,OAAO,4DAA4D,OAAO,GAAG,CAAC;IAChF,CAAC;CACF,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const APP_ACTION: {
2
+ WORKDAY_CHECKBOXES: string;
3
+ OPEN_SCHEDULE_MODAL: string;
4
+ SUBMIT_SCHEDULE: string;
5
+ OPEN_SETTINGS_MODAL: string;
6
+ OPEN_ASK_LUNCH_MODAL: string;
7
+ SUBMIT_SETTINGS: string;
8
+ ASK_LUNCH: string;
9
+ SUBMIT_CHECKOUT: string;
10
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APP_ACTION = void 0;
4
+ exports.APP_ACTION = {
5
+ WORKDAY_CHECKBOXES: 'WORKDAY_CHECKBOXES',
6
+ OPEN_SCHEDULE_MODAL: 'OPEN_SCHEDULE_MODAL',
7
+ SUBMIT_SCHEDULE: 'SUBMIT_SCHEDULE',
8
+ OPEN_SETTINGS_MODAL: 'OPEN_SETTINGS_MODAL',
9
+ OPEN_ASK_LUNCH_MODAL: 'OPEN_ASK_LUNCH_MODAL',
10
+ SUBMIT_SETTINGS: 'SUBMIT_SETTINGS',
11
+ ASK_LUNCH: 'ASK_LUNCH',
12
+ SUBMIT_CHECKOUT: 'SUBMIT_CHECKOUT',
13
+ };
14
+ //# sourceMappingURL=app.consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.consts.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/office-presence-app/consts/app.consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;IACxB,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE,iBAAiB;IAClC,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,iBAAiB;CACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const WEEKDAYS: string[];
2
+ export declare const MONTHS: string[];
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MONTHS = exports.WEEKDAYS = void 0;
4
+ exports.WEEKDAYS = [
5
+ 'Sunday',
6
+ 'Monday',
7
+ 'Tuesday',
8
+ 'Wednesday',
9
+ 'Thursday',
10
+ 'Friday',
11
+ 'Saturday',
12
+ ];
13
+ exports.MONTHS = [
14
+ 'January',
15
+ 'February',
16
+ 'March',
17
+ 'April',
18
+ 'May',
19
+ 'June',
20
+ 'July',
21
+ 'August',
22
+ 'September',
23
+ 'October',
24
+ 'November',
25
+ 'December',
26
+ ];
27
+ //# sourceMappingURL=data.consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.consts.js","sourceRoot":"","sources":["../../../../../../../libs/@vigilant-broccoli/slackbots/src/office-presence-app/consts/data.consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG;IACtB,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC;AAEW,QAAA,MAAM,GAAG;IACpB,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ModalView, View } from '@slack/types';
2
+ import { AppConfig } from '../types';
3
+ export declare function createInputScheduleModal(appConfig: AppConfig): () => View;
4
+ export declare function getSettingModal(): View;
5
+ export declare function getAskLunchModal(userId: string): ModalView;