Social Extension — AthenaBot Plugin

Dashboard & Accounts

Add accounts, pick a channel and role ping, configure emojis and embeds.

Dashboard & Accounts

The whole configuration happens on the Social page in the dashboard.

General

SettingMeaning
Enable SocialMaster switch for the whole plugin
Check interval (min)How often each account is checked for new posts
Max posts / checkCap per account per check (avoids flooding)
Default embed colourHex without # (e.g. 2B2D31) or a colour name
Mention above embedRole ping on its own line above the embed
Show statisticsShow likes/reposts/comments when available

API Credentials

The Twitter/X Bearer Token goes here. Instagram tokens are set per account.

For security, saved tokens are never shown again. Leaving the field blank on save keeps the existing token.

Custom Emojis

For each label (X logo, Instagram logo, verified badge, likes, reposts, comments, views, link) you pick the index of a custom emoji from your application. Only custom emojis are used.

Add an account

Click Add account and fill in:

FieldDescription
PlatformTwitter/X or Instagram
UsernameHandle without @
ChannelTarget channel for new posts
Role to pingRole that gets pinged (optional)
Ping @everyonePing everyone instead of a role
FormatEmbed (rich card) or Text (plain message; Discord renders the link preview)
RSS feed URLOptional: crawl an RSS/Atom feed instead of the API (e.g. RSS.app) — no API keys needed
Message above the postOptional text, placeholders %username% and %url%
Embed colourOptional colour for this account only (only with Embed format)

Source: if an RSS feed URL is set, the feed is crawled — otherwise the API is used. Twitter/X only (without RSS): include replies, include reposts. Instagram only (without RSS): Instagram account id and access token.

Use Test connection to check that the credentials work and the latest post can be fetched — without sending anything to the channel. Save the account first; the test uses the stored credentials.

Example configuration

If you prefer editing the file directly: the saved configuration lives at configuration/social-extension.json5 (defaults & comments in plugins/social-extension/data/configs/en-social-extension.json5). It mirrors the dashboard fields exactly.

config: {
  global: {
    enabled: true,
    poll_interval_minutes: 5,   // check interval in minutes
    max_posts_per_check: 3,     // cap per account & check
    mention_above_embed: true,
    show_statistics: true,
    embed_color: "2B2D31",      // hex without # or a colour name
  },
  credentials: {
    twitter_bearer_token: "YOUR_X_BEARER_TOKEN",
  },
  // index of a custom emoji from your application per label
  emojis: { twitter: 0, instagram: 1, verified: 2, like: 3, repost: 4, comment: 5, view: 6, link: 7 },
  // list (array) of accounts — each with a unique "id"
  accounts: [
    // Twitter / X — uses the global bearer token above
    {
      id: "discord_x",
      enabled: true,
      platform: "twitter",
      username: "discord",                  // handle without @
      channel_id: "123456789012345678",     // target channel
      mention_role_id: "234567890123456789", // role to ping ("" = off)
      mention_everyone: false,
      format: "embed",                       // "embed" or "text"
      custom_message: "New post by %username%!", // %username%, %url%
      embed_color: "1D9BF0",
      include_replies: false,
      include_retweets: true,
    },
    // Instagram via RSS — no API keys needed (e.g. an RSS.app feed)
    {
      id: "natgeo_ig",
      enabled: true,
      platform: "instagram",
      username: "natgeo",
      channel_id: "345678901234567890",
      mention_role_id: "",
      mention_everyone: false,
      format: "text",                        // plain text + link preview
      rss_url: "https://rss.app/feeds/your-instagram.xml", // set -> feed instead of API
      custom_message: "",
      embed_color: "E1306C",
      // ig_user_id / access_token only needed when NOT using rss_url
    },
  ],
}
Secrets (twitter_bearer_token, access_token) are never shown again in the dashboard. When editing through the dashboard, a blank field = the existing value is kept.

Behaviour

  • On the first check of a new account, existing posts are only memorised silently — the channel is not flooded with the back catalogue. Only posts published afterwards are announced.
  • Already-sent posts are tracked in configuration/social-state.json (per install, not in the repository).
Commands and troubleshooting are under Commands & FAQ.
Copyright © 2026