telescope-bot: A new user has joined the Telescope community
Tags: opensource, docker, beginners, javascript
Published: 2022-12-12 00:16:01

My final contribution to an open-source project this year was enabling the existing Slack Bot to announce signups when a new user successfully creates a [Telescope](https://telescope.cdot.systems) account.

As recommended by the project maintainer, I used [Slack Bolt](https://api.slack.com/bolt) for Javascript to send a notification whenever there's new signup. I had to familiarize myself with the Slack Bolt API to use its client functionality to send messages. 

### Writing The Code
I had to revise my code several times to make log messages clear and make code optional, as we do not want the signup process to be halted in the use-case where we cannot send a Slack signup notification. 

```node
const { logger } = require('@senecacdot/satellite');
const { App } = require('@slack/bolt');

const { SLACK_BOT_CHANNEL_ID } = process.env;

const createSlackApp = () => {
  const { SLACK_BOT_TOKEN, SLACK_BOT_SIGNING_SECRET } = process.env;
  if (!(SLACK_BOT_TOKEN && SLACK_BOT_SIGNING_SECRET && SLACK_BOT_CHANNEL_ID)) {
    logger.info('Skipping Slack Bot integration, not configured');
    return false;
  }

  const app = new App({
    token: SLACK_BOT_TOKEN.trim(),
    signingSecret: SLACK_BOT_SIGNING_SECRET.trim(),
  });

  return app;
};

const constructMessageBlocks = (displayName, githubUsername, blogUrl) => {
  const messageBlocks = [
    {
      type: 'header',
      text: {
        type: 'plain_text',
        emoji: true,
        text: 'New Member Notification :tada:',
      },
    },
    {
      type: 'divider',
    },
    {
      type: 'context',
      elements: [
        {
          type: 'image',
          image_url: `https://github.com/${githubUsername}.png?size=64`,
          alt_text: 'avatar',
        },
        {
          type: 'mrkdwn',
          text: `*${displayName}* has joined the Telescope community. Be the first one to welcome them.`,
        },
        {
          type: 'mrkdwn',
          text: `<https://www.github.com/${githubUsername} | *Visit Github Profile*>`,
        },
        {
          type: 'mrkdwn',
          text: `<${blogUrl} | *Visit Blog*>`,
        },
      ],
    },
  ];
  return messageBlocks;
};

const publishSignUpMessage = async (displayName, githubUsername, blogUrl) => {
  if (!(displayName && githubUsername && blogUrl))
    throw new Error(
      'displayName, gitHubUsername, and blogUrl are required to send sign up announcement'
    );
  const app = createSlackApp();
  if (app) {
    try {
      const messageBlocks = constructMessageBlocks(displayName, githubUsername, blogUrl);

      const result = await app.client.chat.postMessage({
        channel: SLACK_BOT_CHANNEL_ID.trim(),
        text: `${displayName} has joined the Telescope community. Be the first one to welcome them.`,
        blocks: messageBlocks,
        unfurl_links: false,
      });
      logger.debug({ result }, 'Slack Bot message delivery successful');
    } catch (error) {
      logger.warn({ error }, 'Slack Bot message delivery unsuccessful');
    }
  }
};

module.exports = publishSignUpMessage;

```


### Problems Encountered 
Since I have no background in working with projects using Docker, I was habitually looking for logging messages outputted to the terminal used to start the services. Using [Docker Desktop](https://www.docker.com/products/docker-desktop/) client, I had to click on the container I was working with, the SSO container, to see the log messages.
Another problem was that even though I added the environment variables to the `env` files, I did not update the `docker-compose`, so I had to update it as follows:
```yml
sso:
    init: true
    container_name: 'sso'
    environment:
      # Slack Bolt config
      - SLACK_BOT_TOKEN
      - SLACK_BOT_SIGNING_SECRET
      - SLACK_BOT_CHANNEL_ID
```
Now, when I start the project and inspect the SSO container using the Docker client, I see the variables required to configure the Slack Bolt app:

![sso container inspect screenshot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1oh34nsgpwp91m1gb76x.png)

### Outcome
When a new user goes through the signup process, the `telescope-bot` should send an announcement notification in the #telescope-channel so the community members can welcome the new user. 

![sign up notification sample](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/24ep093556mns9y5h4z9.png)

### Final Thoughts
Making the Slack bot announce signups [issue](https://github.com/Seneca-CDOT/telescope/issues/3604) was fun to work on, despite the technical difficulties with the e2e tests, when I got close to getting my [PR](https://github.com/Seneca-CDOT/telescope/pull/3773)  merged. 
One cannot always rely on technology, as occasional downtime is inevitable.