BotKit by Fedify :botkit:'s avatar

BotKit by Fedify :botkit:

@botkit@hollo.social ยท 3 following ยท 168 followers

:botkit: A framework for creating ActivityPub bots. Powered by :fedify: @fedify.

Emelia ๐Ÿ‘ธ๐Ÿป's avatar
Emelia ๐Ÿ‘ธ๐Ÿป

@thisismissem@hachyderm.io

I love the chaotic energy of this:
hollo.social/@hongminhee/0197c

ๆดช ๆฐ‘ๆ†™ (Hong Minhee)'s avatar
ๆดช ๆฐ‘ๆ†™ (Hong Minhee)

@hongminhee@hollo.social ยท Reply to ๆดช ๆฐ‘ๆ†™ (Hong Minhee)'s post

Testing out BotKit's new poll functionality with this emoji OTP demo. Enter your fediverse handle, get a poll in your DMs, vote for the right emojis, and you're authenticated. Shows how social protocols can power real-world auth flows.

Screen recording showing BotKit's emoji OTP authentication demo. Left side displays a web form where a fediverse handle is entered, followed by a page showing 7 emoji symbols. Right side shows the Phanpy (a Mastodon client) receiving a direct message with a poll containing various emoji options. The user votes for the matching emojis in the poll, then returns to the web page which displays โ€œAuthenticatedโ€ confirming successful login.
ALT text detailsScreen recording showing BotKit's emoji OTP authentication demo. Left side displays a web form where a fediverse handle is entered, followed by a page showing 7 emoji symbols. Right side shows the Phanpy (a Mastodon client) receiving a direct message with a poll containing various emoji options. The user votes for the matching emojis in the poll, then returns to the web page which displays โ€œAuthenticatedโ€ confirming successful login.
ๆดช ๆฐ‘ๆ†™ (Hong Minhee)'s avatar
ๆดช ๆฐ‘ๆ†™ (Hong Minhee)

@hongminhee@hollo.social

I'm currently experimenting with a poll creation feature for @botkit. If this experiment pans out, the feature will likely be included in the next release, BotKit 0.3.0. So far, so good. Each vote will trigger a Bot.onVote event in real-time. This could open up a lot of interesting possibilities, like a bot that uses emoji selection for one-time authentication.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

We're pleased to announce that .js support has been merged and will be available in 0.3.0.

Now you can build your bots with both and Node.js, giving you more flexibility in choosing your preferred runtime environment.

Stay tuned for BotKit 0.3.0!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

BotKit 0.2.0ใฎใƒชใƒชใƒผใ‚น

BotKit 0.2.0ใ‚’ใƒชใƒชใƒผใ‚นใ—ใพใ—ใŸ๏ผBotKitใ‚’ๅˆใ‚ใฆ็Ÿฅใ‚‹ๆ–นใฎใŸใ‚ใซ็ฐกๅ˜ใซ่ชฌๆ˜Žใ™ใ‚‹ใจใ€BotKitใฏTypeScriptใง้–‹็™บใ•ใ‚ŒใŸใ‚นใ‚ฟใƒณใƒ‰ใ‚ขใƒญใƒณใฎActivityPubใƒœใƒƒใƒˆใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚Mastodonใ€Misskeyใชใฉใ•ใพใ–ใพใชใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚น๏ผˆ๏ผ‰ใฎใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใจ้€ฃๆบใงใใ€ๆ—ขๅญ˜ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใฎๅˆถ็ด„ใชใ—ใซ่‡ช็”ฑใซใƒœใƒƒใƒˆใ‚’ไฝœๆˆใงใใพใ™ใ€‚

ใ“ใฎใƒชใƒชใƒผใ‚นใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใซใŠใ‘ใ‚‹ใƒœใƒƒใƒˆ้–‹็™บใ‚’ใ‚ˆใ‚Š็ฐกๅ˜ใงๅผทๅŠ›ใซใ™ใ‚‹ใŸใ‚ใฎๆ—…ใฎ้‡่ฆใชไธ€ๆญฉใงใ‚ใ‚Šใ€ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใ‹ใ‚‰่ฆๆœ›ใฎใ‚ใฃใŸๆฉŸ่ƒฝใ‚’ๅคšๆ•ฐๅฐŽๅ…ฅใ—ใฆใ„ใพใ™ใ€‚

ใ‚ˆใ‚Š่‰ฏใ„ใƒœใƒƒใƒˆใ‚คใƒณใ‚ฟใƒฉใ‚ฏใ‚ทใƒงใƒณใธใฎๆ—…

BotKitใฎ้–‹็™บใซใŠใ„ใฆใ€็งใŸใกใฏๅธธใซใƒœใƒƒใƒˆใ‚’ใ‚ˆใ‚Š่กจ็พๅŠ›่ฑŠใ‹ใงใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใซใ™ใ‚‹ใ“ใจใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใฆใใพใ—ใŸใ€‚ใƒใƒผใ‚ธใƒงใƒณ0.2.0ใงใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใฎ็คพไผš็š„ๅด้ขใ‚’ใƒœใƒƒใƒˆใซๅ–ใ‚Šๅ…ฅใ‚Œใ‚‹ใ“ใจใงใ€ใ•ใ‚‰ใซไธ€ๆญฉๅ‰้€ฒใ—ใพใ—ใŸใ€‚

ใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒœใƒƒใƒˆใฎๅ€‹ๆ€งใ‚’่กจ็พ

ๆœ€ใ‚‚่ฆๆœ›ใฎๅคšใ‹ใฃใŸๆฉŸ่ƒฝใฎไธ€ใคใŒใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใฎใ‚ตใƒใƒผใƒˆใงใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏ็‹ฌ่‡ชใฎ่ฆ–่ฆš่ฆ็ด ใงใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’็›ฎ็ซ‹ใŸใ›ใ€่‡ชๅˆ†ใ ใ‘ใฎๅ€‹ๆ€งใ‚’่กจ็พใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

// ใƒœใƒƒใƒˆ็”จใฎใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใ‚’ๅฎš็พฉ
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// ใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใ‚’ไฝฟ็”จ
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)}ใฏใ€Fedify ${customEmoji(emojis.fedify)}ใซใ‚ˆใฃใฆๆ”ฏใˆใ‚‰ใ‚Œใฆใ„ใพใ™`
);

ใ“ใฎๆ–ฐใ—ใ„APIใงใฏใ€ๆฌกใฎใ“ใจใŒๅฏ่ƒฝใซใชใ‚Šใพใ—ใŸใ€‚

ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใซใ‚ˆใ‚‹ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณ

ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใฏๅ˜ใซใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆŠ•็จฟใ™ใ‚‹ใ ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ไป–ใฎไบบใฎใƒกใƒƒใ‚ปใƒผใ‚ธใซๅๅฟœใ™ใ‚‹ใ“ใจใ‚‚้‡่ฆใงใ™ใ€‚ๆ–ฐใ—ใ„ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚ทใ‚นใƒ†ใƒ ใฏใ€ใƒœใƒƒใƒˆใจใƒ•ใ‚ฉใƒญใƒฏใƒผใฎ้–“ใซ่‡ช็„ถใชไบคๆตใƒใ‚คใƒณใƒˆใ‚’ไฝœใ‚Šๅ‡บใ—ใพใ™ใ€‚

// ๆจ™ๆบ–ใฎUnicode็ตตๆ–‡ๅญ—ใงใƒกใƒƒใ‚ปใƒผใ‚ธใซใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
await message.react(emoji`๐Ÿ‘`);

// ใพใŸใฏๅฎš็พฉใ—ใŸใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
await message.react(emojis.botkit);

// ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚’่ช่ญ˜ใ—ใฆๅฟœ็ญ”ใ™ใ‚‹ใƒœใƒƒใƒˆใ‚’ไฝœๆˆ
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`${reaction.actor}ใ•ใ‚“ใ€็งใฎใƒกใƒƒใ‚ปใƒผใ‚ธใซ${reaction.emoji}ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ—ใฆใใ‚Œใฆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ`,
    { visibility: "direct" }
  );
};

ใ“ใฎๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏๆฌกใฎใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

  • Message.react()ใ‚’ไฝฟ็”จใ—ใฆUnicode็ตตๆ–‡ๅญ—ใงใƒกใƒƒใ‚ปใƒผใ‚ธใซใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
  • ๅฎš็พฉใ—ใŸใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
  • Bot.onReactใจBot.onUnreactใƒใƒณใƒ‰ใƒฉใƒผใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚คใƒ™ใƒณใƒˆใ‚’ๅ‡ฆ็†

ๅผ•็”จใซใ‚ˆใ‚‹ไผš่ฉฑ

่ญฐ่ซ–ใงใฏใ€ไป–ใฎไบบใŒ่จ€ใฃใŸใ“ใจใ‚’ๅ‚็…งใ™ใ‚‹ๅฟ…่ฆใŒใ—ใฐใ—ใฐใ‚ใ‚Šใพใ™ใ€‚ๆ–ฐใ—ใ„ๅผ•็”จๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใ‚ˆใ‚Š็ตๆŸๅŠ›ใฎใ‚ใ‚‹ไผš่ฉฑใ‚นใƒฌใƒƒใƒ‰ใ‚’ไฝœๆˆใงใใพใ™ใ€‚

// ใƒœใƒƒใƒˆใฎๆŠ•็จฟใงไป–ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จ
await session.publish(
  text`ใ“ใฎ่ˆˆๅ‘ณๆทฑใ„่ฆ–็‚นใซใคใ„ใฆ็ญ”ใˆใพใ™...`,
  { quoteTarget: originalMessage }
);

// ใƒฆใƒผใ‚ถใƒผใŒใƒœใƒƒใƒˆใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จใ—ใŸๅ ดๅˆใฎๅ‡ฆ็†
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`${quoteMessage.actor}ใ•ใ‚“ใ€็งใฎ่€ƒใˆใ‚’ๅ…ฑๆœ‰ใ—ใฆใใ‚Œใฆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ`,
    { visibility: "direct" }
  );
};

ๅผ•็”จๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏๆฌกใฎใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

  • quoteTargetใ‚ชใƒ—ใ‚ทใƒงใƒณใงใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จ
  • Message.quoteTargetใ‚’้€šใ˜ใฆๅผ•็”จใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ขใ‚ฏใ‚ปใ‚น
  • ๆ–ฐใ—ใ„Bot.onQuoteใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใงๅผ•็”จใ‚คใƒ™ใƒณใƒˆใ‚’ๅ‡ฆ็†

่ฆ–่ฆš็š„ใชๆ”นๅ–„

ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใซใฏ่ฆ–่ฆš็š„่ฆ็ด ใ‚‚้‡่ฆใชใŸใ‚ใ€ใƒœใƒƒใƒˆใฎ่กจ็พๆ–นๆณ•ใ‚’ๆ”นๅ–„ใ—ใพใ—ใŸใ€‚

  • ใ‚ฆใ‚งใƒ–ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใง็”ปๅƒๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใŒๆญฃใ—ใ่กจ็คบใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸ
  • ใƒœใƒƒใƒˆใฎใ‚ณใƒณใƒ†ใƒณใƒ„ใŒใ‚ˆใ‚Š่ฆ‹ใ‚„ใ™ใใชใ‚Šใ€่ฑŠใ‹ใชไฝ“้จ“ใ‚’ๆไพ›ใ—ใพใ™

ๅ†…้ƒจๆ”นๅ–„๏ผšๆดปๅ‹•ใฎไผๆ’ญใฎๅผทๅŒ–

ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใงใฎๆดปๅ‹•ใŒไผๆ’ญใ™ใ‚‹ๆ–นๆณ•ใ‚‚ๆ”นๅ–„ใ•ใ‚Œใพใ—ใŸใ€‚

  • ่ฟ”ไฟกใ€ๅ…ฑๆœ‰ใ€ๆ›ดๆ–ฐใ€ๅ‰Š้™คใฎใ‚ˆใ‚Šๆญฃ็ขบใชไผๆ’ญ
  • ๅ…ƒใฎใƒกใƒƒใ‚ปใƒผใ‚ธไฝœๆˆ่€…ใซๆดปๅ‹•ใŒ้ฉๅˆ‡ใซ้€ไฟกใ•ใ‚Œใพใ™

ใ“ใ‚Œใ‚‰ใฎๆ”นๅ–„ใซใ‚ˆใ‚Šใ€ๆง˜ใ€…ใชใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใงใฎใƒœใƒƒใƒˆใฎ็›ธไบ’ไฝœ็”จใŒไธ€่ฒซๆ€งใจไฟก้ ผๆ€งใ‚’ๆŒใคใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

BotKit 0.2.0ใงๆœ€ๅˆใฎไธ€ๆญฉใ‚’่ธใฟๅ‡บใ™

ใ“ใ‚Œใ‚‰ใฎๆ–ฐๆฉŸ่ƒฝใ‚’ไฝ“้จ“ใ—ใฆใฟใŸใ„ใงใ™ใ‹๏ผŸBotKit 0.2.0ใฏJSRใงๅˆฉ็”จๅฏ่ƒฝใงใ€็ฐกๅ˜ใชใ‚ณใƒžใƒณใƒ‰ใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใพใ™ใ€‚

deno add jsr:@fedify/botkit@0.2.0

BotKitใฏTemporal API๏ผˆJavaScriptใงใฏใพใ ่ฉฆ้จ“็š„ใชๆฉŸ่ƒฝ๏ผ‰ใ‚’ไฝฟ็”จใ™ใ‚‹ใŸใ‚ใ€deno.jsonใงใ“ใ‚Œใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

ใ“ใ‚Œใ‚‰ใฎ็ฐกๅ˜ใชใ‚นใƒ†ใƒƒใƒ—ใงใ€ๆœ€ๆ–ฐๆฉŸ่ƒฝใ‚’ไฝฟใฃใฆใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆใ‚’ไฝœๆˆใพใŸใฏใ‚ขใƒƒใƒ—ใ‚ฐใƒฌใƒผใƒ‰ใ™ใ‚‹ๆบ–ๅ‚™ใŒๆ•ดใ„ใพใ—ใŸใ€‚

ไปŠๅพŒใฎๅฑ•ๆœ›

0.2.0ใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆ้–‹็™บใ‚’ใ‚ขใ‚ฏใ‚ปใ‚นใ—ใ‚„ใ™ใใ€ๅผทๅŠ›ใ‹ใคๆฅฝใ—ใ„ใ‚‚ใฎใซใ™ใ‚‹ใŸใ‚ใฎ็งใŸใกใฎ็ถ™็ถš็š„ใชๅ–ใ‚Š็ต„ใฟใ‚’็คบใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎๆ–ฐๆฉŸ่ƒฝใŒใ€็š†ใ•ใ‚“ใฎใƒœใƒƒใƒˆใ‚’ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใงใ‚ˆใ‚Š้ญ…ๅŠ›็š„ใงใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใชใƒกใƒณใƒใƒผใซใ™ใ‚‹ใฎใซๅฝน็ซ‹ใคใจไฟกใ˜ใฆใ„ใพใ™ใ€‚

ๅฎŒๅ…จใชใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใจ่ฉณ็ดฐใชไพ‹ใซใคใ„ใฆใฏใ€็งใŸใกใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚ตใ‚คใƒˆใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚

ใƒ•ใ‚ฃใƒผใƒ‰ใƒใƒƒใ‚ฏใ€ๆฉŸ่ƒฝใƒชใ‚ฏใ‚จใ‚นใƒˆใ€ใ‚ณใƒผใƒ‰่ฒข็Œฎใ‚’้€šใ˜ใฆใ“ใฎใƒชใƒชใƒผใ‚นใซ่ฒข็Œฎใ—ใฆใใ ใ•ใฃใŸใ™ในใฆใฎๆ–นใ€…ใซๆ„Ÿ่ฌใ—ใพใ™ใ€‚BotKitใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใฏๆˆ้•ทใ‚’็ถšใ‘ใฆใŠใ‚Šใ€็š†ใ•ใ‚“ใŒไฝœๆˆใ™ใ‚‹ใ‚‚ใฎใ‚’ๆฅฝใ—ใฟใซใ—ใฆใ„ใพใ™๏ผ


BotKitใฏใ€ActivityPubใ‚ตใƒผใƒใƒผใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ไฝœๆˆใ™ใ‚‹ใŸใ‚ใฎไฝŽใƒฌใƒ™ใƒซใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏFedifyใซใ‚ˆใฃใฆๆ”ฏใˆใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

BotKit 0.2.0 ๋ฆด๋ฆฌ์Šค

BotKit 0.2.0 ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค! BotKit์„ ์ฒ˜์Œ ์ ‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•˜์ž๋ฉด, BotKit์€ TypeScript๋กœ ๊ฐœ๋ฐœ๋œ ๋…๋ฆฝํ˜• ๋ด‡ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Mastodon, Misskey ๋“ฑ ๋‹ค์–‘ํ•œ () ํ”Œ๋žซํผ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ์กด ํ”Œ๋žซํผ์˜ ์ œ์•ฝ์—์„œ ๋ฒ—์–ด๋‚˜ ์ž์œ ๋กญ๊ฒŒ ๋ด‡์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค๋Š” ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡ ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์—ฌ์ •์—์„œ ์ค‘์š”ํ•œ ๋ฐœ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์š”์ฒญํ•ด ์™”๋˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ์ƒˆ๋กญ๊ฒŒ ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ด‡ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ์—ฌ์ •

BotKit์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ด‡์ด ๋” ํ‘œํ˜„๋ ฅ ์žˆ๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ํ’๋ถ€ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•ด ์™”์Šต๋‹ˆ๋‹ค. 0.2.0 ๋ฒ„์ „์—์„œ๋Š” ์—ฐํ•ฉ์šฐ์ฃผ์˜ ์‚ฌํšŒ์  ์ธก๋ฉด์„ ๋ด‡์— ์ ‘๋ชฉ์‹œ์ผœ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ด‡์˜ ๊ฐœ์„ฑ ํ‘œํ˜„ํ•˜๊ธฐ

๊ฐ€์žฅ ๋งŽ์ด ์š”์ฒญ๋ฐ›์•˜๋˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ง€์›์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ด‡์€ ๋…ํŠนํ•œ ์‹œ๊ฐ์  ์š”์†Œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹๋ณด์ด๊ฒŒ ํ•˜๋ฉฐ ์ž์‹ ๋งŒ์˜ ๊ฐœ์„ฑ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ด‡์˜ ์ปค์Šคํ…€ ์—๋ชจ์ง€ ์ •์˜ํ•˜๊ธฐ
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// ๋ฉ”์‹œ์ง€์— ์ปค์Šคํ…€ ์—๋ชจ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)}์€ Fedify ${customEmoji(emojis.fedify)}์˜ ์ง€์›์„ ๋ฐ›์Šต๋‹ˆ๋‹ค`
);

์ด ์ƒˆ๋กœ์šด API๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘์„ ํ†ตํ•œ ์†Œํ†ต

์†Œํ†ต์€ ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ˜์‘ ์‹œ์Šคํ…œ์€ ๋ด‡๊ณผ ํŒ”๋กœ์›Œ ์‚ฌ์ด์— ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒํ˜ธ์ž‘์šฉ ์ง€์ ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

// ํ‘œ์ค€ ์œ ๋‹ˆ์ฝ”๋“œ ์—๋ชจ์ง€๋กœ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๊ธฐ
await message.react(emoji`๐Ÿ‘`);

// ๋˜๋Š” ์ •์˜ํ•œ ์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ฐ˜์‘ํ•˜๊ธฐ
await message.react(emojis.botkit);

// ๋ฐ˜์‘์„ ์ธ์‹ํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๋ด‡ ๋งŒ๋“ค๊ธฐ
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`${reaction.actor}๋‹˜, ์ œ ๋ฉ”์‹œ์ง€์— ${reaction.emoji} ๋ฐ˜์‘์„ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!`,
    { visibility: "direct" }
  );
};

์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ด‡์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Message.react()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋‹ˆ์ฝ”๋“œ ์—๋ชจ์ง€๋กœ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๊ธฐ
  • ์ •์˜ํ•œ ์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ฐ˜์‘ํ•˜๊ธฐ
  • Bot.onReact์™€ Bot.onUnreact ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ฐ˜์‘ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ธ์šฉ์„ ํ†ตํ•œ ๋Œ€ํ™”

ํ† ๋ก ์—์„œ๋Š” ์ข…์ข… ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งํ•œ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ๋” ์‘์ง‘๋ ฅ ์žˆ๋Š” ๋Œ€ํ™” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

// ๋ด‡์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ธ์šฉํ•˜๊ธฐ
await session.publish(
  text`์ด ํฅ๋ฏธ๋กœ์šด ๊ด€์ ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค...`,
  { quoteTarget: originalMessage }
);

// ์‚ฌ์šฉ์ž๊ฐ€ ๋ด‡์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์šฉํ•  ๋•Œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`${quoteMessage.actor}๋‹˜, ์ œ ์ƒ๊ฐ์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!`,
    { visibility: "direct" }
  );
};

์ธ์šฉ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ด‡์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • quoteTarget ์˜ต์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ธ์šฉํ•˜๊ธฐ
  • Message.quoteTarget์„ ํ†ตํ•ด ์ธ์šฉ๋œ ๋ฉ”์‹œ์ง€์— ์ ‘๊ทผํ•˜๊ธฐ
  • ์ƒˆ๋กœ์šด Bot.onQuote ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ธ์šฉ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์‹œ๊ฐ์  ๊ฐœ์„ 

์†Œํ†ต์€ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๋„ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ด‡์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
  • ๋ด‡์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ๋” ๋ณด๊ธฐ ์ข‹์•„์ง€๊ณ  ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

๋‚ด๋ถ€ ๊ฐœ์„ : ํ–ฅ์ƒ๋œ ์•กํ‹ฐ๋น„ํ‹ฐ ์ „ํŒŒ

์—ฐํ•ฉ์šฐ์ฃผ์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹๋„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ต๊ธ€, ๊ณต์œ , ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ์˜ ๋” ์ •ํ™•ํ•œ ์ „ํŒŒ
  • ์›๋ณธ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค

์ด๋Ÿฌํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์€ ๋‹ค์–‘ํ•œ ์—ฐํ•ฉ์šฐ์ฃผ ํ”Œ๋žซํผ์—์„œ ๋ด‡์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ๊ด€๋˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

BotKit 0.2.0์œผ๋กœ ์ฒซ ๊ฑธ์Œ ๋–ผ๊ธฐ

์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฒฝํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? BotKit 0.2.0์€ JSR์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

deno add jsr:@fedify/botkit@0.2.0

BotKit์€ Temporal API(JavaScript์—์„œ ์•„์ง ์‹œ๋ฒ”์ ์ธ ๊ธฐ๋Šฅ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ deno.json์—์„œ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

์ด ๊ฐ„๋‹จํ•œ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ตœ์‹  ๊ธฐ๋Šฅ์œผ๋กœ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ์ „๋ง

BotKit 0.2.0์€ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡ ๊ฐœ๋ฐœ์„ ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ•๋ ฅํ•˜๋ฉฐ, ์ฆ๊ฒ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฐ๋ฆฌ์˜ ์ง€์†์ ์ธ ๋…ธ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ด‡์ด ์—ฐํ•ฉ์šฐ์ฃผ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ๋งค๋ ฅ์ ์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ํ’๋ถ€ํ•œ ๊ตฌ์„ฑ์›์ด ๋˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋ฌธ์„œ์™€ ๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” ์ €ํฌ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ, ๊ธฐ๋Šฅ ์š”์ฒญ, ์ฝ”๋“œ ๊ธฐ์—ฌ๋ฅผ ํ†ตํ•ด ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์— ๋„์›€์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. BotKit ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“ค์–ด๋‚ผ ์ž‘ํ’ˆ๋“ค์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!


BotKit์€ ActivityPub ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•˜์œ„ ๋ ˆ๋ฒจ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Fedify์˜ ์ง€์›์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

BotKit 0.2.0 Released

We're pleased to announce the release of BotKit 0.2.0! For those new to our project, is a framework for creating standalone bots that can interact with Mastodon, Misskey, and other platforms without the constraints of these existing platforms.

This release marks an important step in our journey to make fediverse bot development more accessible and powerful, introducing several features that our community has been requesting.

The Journey to Better Bot Interactions

In building BotKit, we've always focused on making bots more expressive and interactive. With version 0.2.0, we're taking this to the next level by bringing the social aspects of the fediverse to your bots.

Expressing Your Bot's Personality with Custom Emojis

One of the most requested features has been support. Now your bots can truly express their personality with unique visuals that make their messages stand out.

// Define custom emojis for your bot
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// Use these custom emojis in your messages
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)} is powered by Fedify ${customEmoji(emojis.fedify)}`
);

With this new API, you can:

Engaging Through Reactions

Communication isn't just about posting messagesโ€”it's also about responding to others. The new reaction system creates natural interaction points between your bot and its followers:

// React to a message with a standard Unicode emoji
await message.react(emoji`๐Ÿ‘`);

// Or use one of your custom emojis as a reaction
await message.react(emojis.botkit);

// Create a responsive bot that acknowledges reactions
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`Thanks for reacting with ${reaction.emoji} to my message, ${reaction.actor}!`,
    { visibility: "direct" }
  );
};

This feature allows your bot to:

Conversations Through Quotes

Discussions often involve referencing what others have said. Our new support enables more cohesive conversation threads:

// Quote another message in your bot's post
await session.publish(
  text`Responding to this interesting point...`,
  { quoteTarget: originalMessage }
);

// Handle when users quote your bot's messages
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`Thanks for sharing my thoughts, ${quoteMessage.actor}!`,
    { visibility: "direct" }
  );
};

With quote support, your bot can:

Visual Enhancements

Because communication is visual too, we've improved how your bot presents itself:

  • Image attachments now properly display in the web interface
  • Your bot's content looks better and provides a richer experience

Behind the Scenes: Enhanced Activity Propagation

We've also improved how activities propagate through the fediverse:

  • More precise propagation of replies, shares, updates, and deletes
  • Activities are now properly sent to the original message authors

These improvements ensure your bot's interactions are consistent and reliable across different fediverse platforms.

Taking Your First Steps with BotKit 0.2.0

Ready to experience these new features? BotKit 0.2.0 is available on JSR and can be installed with a simple command:

deno add jsr:@fedify/botkit@0.2.0

Since BotKit uses the Temporal API (which is still evolving in JavaScript), remember to enable it in your deno.json:

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

With these simple steps, you're ready to create or upgrade your fediverse bot with our latest features.

Looking Forward

BotKit 0.2.0 represents our ongoing commitment to making fediverse bot development accessible, powerful, and enjoyable. We believe these new features will help your bots become more engaging and interactive members of the fediverse community.

For complete docs and more examples, visit our docs site.

Thank you to everyone who contributed to this release through feedback, feature requests, and code contributions. The BotKit community continues to grow, and we're excited to see what you'll create!


BotKit is powered by Fedify, a lower-level framework for creating ActivityPub server applications.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

BotKit 0.2.0ใฎใƒชใƒชใƒผใ‚น

BotKit 0.2.0ใ‚’ใƒชใƒชใƒผใ‚นใ—ใพใ—ใŸ๏ผBotKitใ‚’ๅˆใ‚ใฆ็Ÿฅใ‚‹ๆ–นใฎใŸใ‚ใซ็ฐกๅ˜ใซ่ชฌๆ˜Žใ™ใ‚‹ใจใ€BotKitใฏTypeScriptใง้–‹็™บใ•ใ‚ŒใŸใ‚นใ‚ฟใƒณใƒ‰ใ‚ขใƒญใƒณใฎActivityPubใƒœใƒƒใƒˆใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚Mastodonใ€Misskeyใชใฉใ•ใพใ–ใพใชใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚น๏ผˆ๏ผ‰ใฎใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใจ้€ฃๆบใงใใ€ๆ—ขๅญ˜ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใฎๅˆถ็ด„ใชใ—ใซ่‡ช็”ฑใซใƒœใƒƒใƒˆใ‚’ไฝœๆˆใงใใพใ™ใ€‚

ใ“ใฎใƒชใƒชใƒผใ‚นใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใซใŠใ‘ใ‚‹ใƒœใƒƒใƒˆ้–‹็™บใ‚’ใ‚ˆใ‚Š็ฐกๅ˜ใงๅผทๅŠ›ใซใ™ใ‚‹ใŸใ‚ใฎๆ—…ใฎ้‡่ฆใชไธ€ๆญฉใงใ‚ใ‚Šใ€ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใ‹ใ‚‰่ฆๆœ›ใฎใ‚ใฃใŸๆฉŸ่ƒฝใ‚’ๅคšๆ•ฐๅฐŽๅ…ฅใ—ใฆใ„ใพใ™ใ€‚

ใ‚ˆใ‚Š่‰ฏใ„ใƒœใƒƒใƒˆใ‚คใƒณใ‚ฟใƒฉใ‚ฏใ‚ทใƒงใƒณใธใฎๆ—…

BotKitใฎ้–‹็™บใซใŠใ„ใฆใ€็งใŸใกใฏๅธธใซใƒœใƒƒใƒˆใ‚’ใ‚ˆใ‚Š่กจ็พๅŠ›่ฑŠใ‹ใงใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใซใ™ใ‚‹ใ“ใจใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใฆใใพใ—ใŸใ€‚ใƒใƒผใ‚ธใƒงใƒณ0.2.0ใงใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใฎ็คพไผš็š„ๅด้ขใ‚’ใƒœใƒƒใƒˆใซๅ–ใ‚Šๅ…ฅใ‚Œใ‚‹ใ“ใจใงใ€ใ•ใ‚‰ใซไธ€ๆญฉๅ‰้€ฒใ—ใพใ—ใŸใ€‚

ใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒœใƒƒใƒˆใฎๅ€‹ๆ€งใ‚’่กจ็พ

ๆœ€ใ‚‚่ฆๆœ›ใฎๅคšใ‹ใฃใŸๆฉŸ่ƒฝใฎไธ€ใคใŒใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใฎใ‚ตใƒใƒผใƒˆใงใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏ็‹ฌ่‡ชใฎ่ฆ–่ฆš่ฆ็ด ใงใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’็›ฎ็ซ‹ใŸใ›ใ€่‡ชๅˆ†ใ ใ‘ใฎๅ€‹ๆ€งใ‚’่กจ็พใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

// ใƒœใƒƒใƒˆ็”จใฎใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใ‚’ๅฎš็พฉ
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// ใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใ‚’ไฝฟ็”จ
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)}ใฏใ€Fedify ${customEmoji(emojis.fedify)}ใซใ‚ˆใฃใฆๆ”ฏใˆใ‚‰ใ‚Œใฆใ„ใพใ™`
);

ใ“ใฎๆ–ฐใ—ใ„APIใงใฏใ€ๆฌกใฎใ“ใจใŒๅฏ่ƒฝใซใชใ‚Šใพใ—ใŸใ€‚

ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใซใ‚ˆใ‚‹ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณ

ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใฏๅ˜ใซใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๆŠ•็จฟใ™ใ‚‹ใ ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ไป–ใฎไบบใฎใƒกใƒƒใ‚ปใƒผใ‚ธใซๅๅฟœใ™ใ‚‹ใ“ใจใ‚‚้‡่ฆใงใ™ใ€‚ๆ–ฐใ—ใ„ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚ทใ‚นใƒ†ใƒ ใฏใ€ใƒœใƒƒใƒˆใจใƒ•ใ‚ฉใƒญใƒฏใƒผใฎ้–“ใซ่‡ช็„ถใชไบคๆตใƒใ‚คใƒณใƒˆใ‚’ไฝœใ‚Šๅ‡บใ—ใพใ™ใ€‚

// ๆจ™ๆบ–ใฎUnicode็ตตๆ–‡ๅญ—ใงใƒกใƒƒใ‚ปใƒผใ‚ธใซใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
await message.react(emoji`๐Ÿ‘`);

// ใพใŸใฏๅฎš็พฉใ—ใŸใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
await message.react(emojis.botkit);

// ใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚’่ช่ญ˜ใ—ใฆๅฟœ็ญ”ใ™ใ‚‹ใƒœใƒƒใƒˆใ‚’ไฝœๆˆ
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`${reaction.actor}ใ•ใ‚“ใ€็งใฎใƒกใƒƒใ‚ปใƒผใ‚ธใซ${reaction.emoji}ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ—ใฆใใ‚Œใฆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ`,
    { visibility: "direct" }
  );
};

ใ“ใฎๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏๆฌกใฎใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

  • Message.react()ใ‚’ไฝฟ็”จใ—ใฆUnicode็ตตๆ–‡ๅญ—ใงใƒกใƒƒใ‚ปใƒผใ‚ธใซใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
  • ๅฎš็พฉใ—ใŸใ‚ซใ‚นใ‚ฟใƒ ็ตตๆ–‡ๅญ—ใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณ
  • Bot.onReactใจBot.onUnreactใƒใƒณใƒ‰ใƒฉใƒผใงใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚คใƒ™ใƒณใƒˆใ‚’ๅ‡ฆ็†

ๅผ•็”จใซใ‚ˆใ‚‹ไผš่ฉฑ

่ญฐ่ซ–ใงใฏใ€ไป–ใฎไบบใŒ่จ€ใฃใŸใ“ใจใ‚’ๅ‚็…งใ™ใ‚‹ๅฟ…่ฆใŒใ—ใฐใ—ใฐใ‚ใ‚Šใพใ™ใ€‚ๆ–ฐใ—ใ„ๅผ•็”จๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใ‚ˆใ‚Š็ตๆŸๅŠ›ใฎใ‚ใ‚‹ไผš่ฉฑใ‚นใƒฌใƒƒใƒ‰ใ‚’ไฝœๆˆใงใใพใ™ใ€‚

// ใƒœใƒƒใƒˆใฎๆŠ•็จฟใงไป–ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จ
await session.publish(
  text`ใ“ใฎ่ˆˆๅ‘ณๆทฑใ„่ฆ–็‚นใซใคใ„ใฆ็ญ”ใˆใพใ™...`,
  { quoteTarget: originalMessage }
);

// ใƒฆใƒผใ‚ถใƒผใŒใƒœใƒƒใƒˆใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จใ—ใŸๅ ดๅˆใฎๅ‡ฆ็†
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`${quoteMessage.actor}ใ•ใ‚“ใ€็งใฎ่€ƒใˆใ‚’ๅ…ฑๆœ‰ใ—ใฆใใ‚Œใฆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ`,
    { visibility: "direct" }
  );
};

ๅผ•็”จๆฉŸ่ƒฝใซใ‚ˆใ‚Šใ€ใƒœใƒƒใƒˆใฏๆฌกใฎใ“ใจใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚

  • quoteTargetใ‚ชใƒ—ใ‚ทใƒงใƒณใงใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅผ•็”จ
  • Message.quoteTargetใ‚’้€šใ˜ใฆๅผ•็”จใ•ใ‚ŒใŸใƒกใƒƒใ‚ปใƒผใ‚ธใซใ‚ขใ‚ฏใ‚ปใ‚น
  • ๆ–ฐใ—ใ„Bot.onQuoteใ‚คใƒ™ใƒณใƒˆใƒใƒณใƒ‰ใƒฉใƒผใงๅผ•็”จใ‚คใƒ™ใƒณใƒˆใ‚’ๅ‡ฆ็†

่ฆ–่ฆš็š„ใชๆ”นๅ–„

ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณใซใฏ่ฆ–่ฆš็š„่ฆ็ด ใ‚‚้‡่ฆใชใŸใ‚ใ€ใƒœใƒƒใƒˆใฎ่กจ็พๆ–นๆณ•ใ‚’ๆ”นๅ–„ใ—ใพใ—ใŸใ€‚

  • ใ‚ฆใ‚งใƒ–ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใง็”ปๅƒๆทปไป˜ใƒ•ใ‚กใ‚คใƒซใŒๆญฃใ—ใ่กจ็คบใ•ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸ
  • ใƒœใƒƒใƒˆใฎใ‚ณใƒณใƒ†ใƒณใƒ„ใŒใ‚ˆใ‚Š่ฆ‹ใ‚„ใ™ใใชใ‚Šใ€่ฑŠใ‹ใชไฝ“้จ“ใ‚’ๆไพ›ใ—ใพใ™

ๅ†…้ƒจๆ”นๅ–„๏ผšๆดปๅ‹•ใฎไผๆ’ญใฎๅผทๅŒ–

ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใงใฎๆดปๅ‹•ใŒไผๆ’ญใ™ใ‚‹ๆ–นๆณ•ใ‚‚ๆ”นๅ–„ใ•ใ‚Œใพใ—ใŸใ€‚

  • ่ฟ”ไฟกใ€ๅ…ฑๆœ‰ใ€ๆ›ดๆ–ฐใ€ๅ‰Š้™คใฎใ‚ˆใ‚Šๆญฃ็ขบใชไผๆ’ญ
  • ๅ…ƒใฎใƒกใƒƒใ‚ปใƒผใ‚ธไฝœๆˆ่€…ใซๆดปๅ‹•ใŒ้ฉๅˆ‡ใซ้€ไฟกใ•ใ‚Œใพใ™

ใ“ใ‚Œใ‚‰ใฎๆ”นๅ–„ใซใ‚ˆใ‚Šใ€ๆง˜ใ€…ใชใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใงใฎใƒœใƒƒใƒˆใฎ็›ธไบ’ไฝœ็”จใŒไธ€่ฒซๆ€งใจไฟก้ ผๆ€งใ‚’ๆŒใคใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

BotKit 0.2.0ใงๆœ€ๅˆใฎไธ€ๆญฉใ‚’่ธใฟๅ‡บใ™

ใ“ใ‚Œใ‚‰ใฎๆ–ฐๆฉŸ่ƒฝใ‚’ไฝ“้จ“ใ—ใฆใฟใŸใ„ใงใ™ใ‹๏ผŸBotKit 0.2.0ใฏJSRใงๅˆฉ็”จๅฏ่ƒฝใงใ€็ฐกๅ˜ใชใ‚ณใƒžใƒณใƒ‰ใงใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใพใ™ใ€‚

deno add jsr:@fedify/botkit@0.2.0

BotKitใฏTemporal API๏ผˆJavaScriptใงใฏใพใ ่ฉฆ้จ“็š„ใชๆฉŸ่ƒฝ๏ผ‰ใ‚’ไฝฟ็”จใ™ใ‚‹ใŸใ‚ใ€deno.jsonใงใ“ใ‚Œใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

ใ“ใ‚Œใ‚‰ใฎ็ฐกๅ˜ใชใ‚นใƒ†ใƒƒใƒ—ใงใ€ๆœ€ๆ–ฐๆฉŸ่ƒฝใ‚’ไฝฟใฃใฆใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆใ‚’ไฝœๆˆใพใŸใฏใ‚ขใƒƒใƒ—ใ‚ฐใƒฌใƒผใƒ‰ใ™ใ‚‹ๆบ–ๅ‚™ใŒๆ•ดใ„ใพใ—ใŸใ€‚

ไปŠๅพŒใฎๅฑ•ๆœ›

0.2.0ใฏใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆ้–‹็™บใ‚’ใ‚ขใ‚ฏใ‚ปใ‚นใ—ใ‚„ใ™ใใ€ๅผทๅŠ›ใ‹ใคๆฅฝใ—ใ„ใ‚‚ใฎใซใ™ใ‚‹ใŸใ‚ใฎ็งใŸใกใฎ็ถ™็ถš็š„ใชๅ–ใ‚Š็ต„ใฟใ‚’็คบใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎๆ–ฐๆฉŸ่ƒฝใŒใ€็š†ใ•ใ‚“ใฎใƒœใƒƒใƒˆใ‚’ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใงใ‚ˆใ‚Š้ญ…ๅŠ›็š„ใงใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใชใƒกใƒณใƒใƒผใซใ™ใ‚‹ใฎใซๅฝน็ซ‹ใคใจไฟกใ˜ใฆใ„ใพใ™ใ€‚

ๅฎŒๅ…จใชใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใจ่ฉณ็ดฐใชไพ‹ใซใคใ„ใฆใฏใ€็งใŸใกใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚ตใ‚คใƒˆใ‚’ใ”่ฆงใใ ใ•ใ„ใ€‚

ใƒ•ใ‚ฃใƒผใƒ‰ใƒใƒƒใ‚ฏใ€ๆฉŸ่ƒฝใƒชใ‚ฏใ‚จใ‚นใƒˆใ€ใ‚ณใƒผใƒ‰่ฒข็Œฎใ‚’้€šใ˜ใฆใ“ใฎใƒชใƒชใƒผใ‚นใซ่ฒข็Œฎใ—ใฆใใ ใ•ใฃใŸใ™ในใฆใฎๆ–นใ€…ใซๆ„Ÿ่ฌใ—ใพใ™ใ€‚BotKitใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใฏๆˆ้•ทใ‚’็ถšใ‘ใฆใŠใ‚Šใ€็š†ใ•ใ‚“ใŒไฝœๆˆใ™ใ‚‹ใ‚‚ใฎใ‚’ๆฅฝใ—ใฟใซใ—ใฆใ„ใพใ™๏ผ


BotKitใฏใ€ActivityPubใ‚ตใƒผใƒใƒผใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ไฝœๆˆใ™ใ‚‹ใŸใ‚ใฎไฝŽใƒฌใƒ™ใƒซใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏFedifyใซใ‚ˆใฃใฆๆ”ฏใˆใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

BotKit 0.2.0 ๋ฆด๋ฆฌ์Šค

BotKit 0.2.0 ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค! BotKit์„ ์ฒ˜์Œ ์ ‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•˜์ž๋ฉด, BotKit์€ TypeScript๋กœ ๊ฐœ๋ฐœ๋œ ๋…๋ฆฝํ˜• ๋ด‡ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Mastodon, Misskey ๋“ฑ ๋‹ค์–‘ํ•œ () ํ”Œ๋žซํผ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ์กด ํ”Œ๋žซํผ์˜ ์ œ์•ฝ์—์„œ ๋ฒ—์–ด๋‚˜ ์ž์œ ๋กญ๊ฒŒ ๋ด‡์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค๋Š” ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡ ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์—ฌ์ •์—์„œ ์ค‘์š”ํ•œ ๋ฐœ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์š”์ฒญํ•ด ์™”๋˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ์ƒˆ๋กญ๊ฒŒ ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ด‡ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ์—ฌ์ •

BotKit์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ด‡์ด ๋” ํ‘œํ˜„๋ ฅ ์žˆ๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ํ’๋ถ€ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•ด ์™”์Šต๋‹ˆ๋‹ค. 0.2.0 ๋ฒ„์ „์—์„œ๋Š” ์—ฐํ•ฉ์šฐ์ฃผ์˜ ์‚ฌํšŒ์  ์ธก๋ฉด์„ ๋ด‡์— ์ ‘๋ชฉ์‹œ์ผœ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ด‡์˜ ๊ฐœ์„ฑ ํ‘œํ˜„ํ•˜๊ธฐ

๊ฐ€์žฅ ๋งŽ์ด ์š”์ฒญ๋ฐ›์•˜๋˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ง€์›์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ด‡์€ ๋…ํŠนํ•œ ์‹œ๊ฐ์  ์š”์†Œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹๋ณด์ด๊ฒŒ ํ•˜๋ฉฐ ์ž์‹ ๋งŒ์˜ ๊ฐœ์„ฑ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ด‡์˜ ์ปค์Šคํ…€ ์—๋ชจ์ง€ ์ •์˜ํ•˜๊ธฐ
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// ๋ฉ”์‹œ์ง€์— ์ปค์Šคํ…€ ์—๋ชจ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)}์€ Fedify ${customEmoji(emojis.fedify)}์˜ ์ง€์›์„ ๋ฐ›์Šต๋‹ˆ๋‹ค`
);

์ด ์ƒˆ๋กœ์šด API๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘์„ ํ†ตํ•œ ์†Œํ†ต

์†Œํ†ต์€ ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฐ˜์‘ ์‹œ์Šคํ…œ์€ ๋ด‡๊ณผ ํŒ”๋กœ์›Œ ์‚ฌ์ด์— ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒํ˜ธ์ž‘์šฉ ์ง€์ ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

// ํ‘œ์ค€ ์œ ๋‹ˆ์ฝ”๋“œ ์—๋ชจ์ง€๋กœ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๊ธฐ
await message.react(emoji`๐Ÿ‘`);

// ๋˜๋Š” ์ •์˜ํ•œ ์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ฐ˜์‘ํ•˜๊ธฐ
await message.react(emojis.botkit);

// ๋ฐ˜์‘์„ ์ธ์‹ํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ๋ด‡ ๋งŒ๋“ค๊ธฐ
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`${reaction.actor}๋‹˜, ์ œ ๋ฉ”์‹œ์ง€์— ${reaction.emoji} ๋ฐ˜์‘์„ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!`,
    { visibility: "direct" }
  );
};

์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ด‡์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Message.react()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋‹ˆ์ฝ”๋“œ ์—๋ชจ์ง€๋กœ ๋ฉ”์‹œ์ง€์— ๋ฐ˜์‘ํ•˜๊ธฐ
  • ์ •์˜ํ•œ ์ปค์Šคํ…€ ์—๋ชจ์ง€๋กœ ๋ฐ˜์‘ํ•˜๊ธฐ
  • Bot.onReact์™€ Bot.onUnreact ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ฐ˜์‘ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ธ์šฉ์„ ํ†ตํ•œ ๋Œ€ํ™”

ํ† ๋ก ์—์„œ๋Š” ์ข…์ข… ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งํ•œ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ๋” ์‘์ง‘๋ ฅ ์žˆ๋Š” ๋Œ€ํ™” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

// ๋ด‡์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ธ์šฉํ•˜๊ธฐ
await session.publish(
  text`์ด ํฅ๋ฏธ๋กœ์šด ๊ด€์ ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค...`,
  { quoteTarget: originalMessage }
);

// ์‚ฌ์šฉ์ž๊ฐ€ ๋ด‡์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์šฉํ•  ๋•Œ ์ฒ˜๋ฆฌํ•˜๊ธฐ
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`${quoteMessage.actor}๋‹˜, ์ œ ์ƒ๊ฐ์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!`,
    { visibility: "direct" }
  );
};

์ธ์šฉ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ด‡์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • quoteTarget ์˜ต์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ธ์šฉํ•˜๊ธฐ
  • Message.quoteTarget์„ ํ†ตํ•ด ์ธ์šฉ๋œ ๋ฉ”์‹œ์ง€์— ์ ‘๊ทผํ•˜๊ธฐ
  • ์ƒˆ๋กœ์šด Bot.onQuote ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ธ์šฉ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์‹œ๊ฐ์  ๊ฐœ์„ 

์†Œํ†ต์€ ์‹œ๊ฐ์ ์ธ ์š”์†Œ๋„ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ด‡์˜ ํ‘œํ˜„ ๋ฐฉ์‹์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์›น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
  • ๋ด‡์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ๋” ๋ณด๊ธฐ ์ข‹์•„์ง€๊ณ  ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

๋‚ด๋ถ€ ๊ฐœ์„ : ํ–ฅ์ƒ๋œ ์•กํ‹ฐ๋น„ํ‹ฐ ์ „ํŒŒ

์—ฐํ•ฉ์šฐ์ฃผ์—์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹๋„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ต๊ธ€, ๊ณต์œ , ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ์˜ ๋” ์ •ํ™•ํ•œ ์ „ํŒŒ
  • ์›๋ณธ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค

์ด๋Ÿฌํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์€ ๋‹ค์–‘ํ•œ ์—ฐํ•ฉ์šฐ์ฃผ ํ”Œ๋žซํผ์—์„œ ๋ด‡์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ๊ด€๋˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

BotKit 0.2.0์œผ๋กœ ์ฒซ ๊ฑธ์Œ ๋–ผ๊ธฐ

์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฒฝํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? BotKit 0.2.0์€ JSR์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

deno add jsr:@fedify/botkit@0.2.0

BotKit์€ Temporal API(JavaScript์—์„œ ์•„์ง ์‹œ๋ฒ”์ ์ธ ๊ธฐ๋Šฅ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ deno.json์—์„œ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

์ด ๊ฐ„๋‹จํ•œ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ตœ์‹  ๊ธฐ๋Šฅ์œผ๋กœ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ์ „๋ง

BotKit 0.2.0์€ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡ ๊ฐœ๋ฐœ์„ ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ•๋ ฅํ•˜๋ฉฐ, ์ฆ๊ฒ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฐ๋ฆฌ์˜ ์ง€์†์ ์ธ ๋…ธ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ด‡์ด ์—ฐํ•ฉ์šฐ์ฃผ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ๋งค๋ ฅ์ ์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ํ’๋ถ€ํ•œ ๊ตฌ์„ฑ์›์ด ๋˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋ฌธ์„œ์™€ ๋” ๋งŽ์€ ์˜ˆ์ œ๋Š” ์ €ํฌ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ, ๊ธฐ๋Šฅ ์š”์ฒญ, ์ฝ”๋“œ ๊ธฐ์—ฌ๋ฅผ ํ†ตํ•ด ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์— ๋„์›€์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. BotKit ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“ค์–ด๋‚ผ ์ž‘ํ’ˆ๋“ค์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!


BotKit์€ ActivityPub ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ•˜์œ„ ๋ ˆ๋ฒจ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Fedify์˜ ์ง€์›์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

BotKit 0.2.0 Released

We're pleased to announce the release of BotKit 0.2.0! For those new to our project, is a framework for creating standalone bots that can interact with Mastodon, Misskey, and other platforms without the constraints of these existing platforms.

This release marks an important step in our journey to make fediverse bot development more accessible and powerful, introducing several features that our community has been requesting.

The Journey to Better Bot Interactions

In building BotKit, we've always focused on making bots more expressive and interactive. With version 0.2.0, we're taking this to the next level by bringing the social aspects of the fediverse to your bots.

Expressing Your Bot's Personality with Custom Emojis

One of the most requested features has been support. Now your bots can truly express their personality with unique visuals that make their messages stand out.

// Define custom emojis for your bot
const emojis = bot.addCustomEmojis({
  botkit: { 
    file: `${import.meta.dirname}/images/botkit.png`, 
    type: "image/png" 
  },
  fedify: { 
    url: "https://fedify.dev/logo.png", 
    type: "image/png" 
  }
});

// Use these custom emojis in your messages
await session.publish(
  text`BotKit ${customEmoji(emojis.botkit)} is powered by Fedify ${customEmoji(emojis.fedify)}`
);

With this new API, you can:

Engaging Through Reactions

Communication isn't just about posting messagesโ€”it's also about responding to others. The new reaction system creates natural interaction points between your bot and its followers:

// React to a message with a standard Unicode emoji
await message.react(emoji`๐Ÿ‘`);

// Or use one of your custom emojis as a reaction
await message.react(emojis.botkit);

// Create a responsive bot that acknowledges reactions
bot.onReact = async (session, reaction) => {
  await session.publish(
    text`Thanks for reacting with ${reaction.emoji} to my message, ${reaction.actor}!`,
    { visibility: "direct" }
  );
};

This feature allows your bot to:

Conversations Through Quotes

Discussions often involve referencing what others have said. Our new support enables more cohesive conversation threads:

// Quote another message in your bot's post
await session.publish(
  text`Responding to this interesting point...`,
  { quoteTarget: originalMessage }
);

// Handle when users quote your bot's messages
bot.onQuote = async (session, quoteMessage) => {
  await session.publish(
    text`Thanks for sharing my thoughts, ${quoteMessage.actor}!`,
    { visibility: "direct" }
  );
};

With quote support, your bot can:

Visual Enhancements

Because communication is visual too, we've improved how your bot presents itself:

  • Image attachments now properly display in the web interface
  • Your bot's content looks better and provides a richer experience

Behind the Scenes: Enhanced Activity Propagation

We've also improved how activities propagate through the fediverse:

  • More precise propagation of replies, shares, updates, and deletes
  • Activities are now properly sent to the original message authors

These improvements ensure your bot's interactions are consistent and reliable across different fediverse platforms.

Taking Your First Steps with BotKit 0.2.0

Ready to experience these new features? BotKit 0.2.0 is available on JSR and can be installed with a simple command:

deno add jsr:@fedify/botkit@0.2.0

Since BotKit uses the Temporal API (which is still evolving in JavaScript), remember to enable it in your deno.json:

{
  "imports": {
    "@fedify/botkit": "jsr:@fedify/botkit@0.2.0"
  },
  "unstable": ["temporal"]
}

With these simple steps, you're ready to create or upgrade your fediverse bot with our latest features.

Looking Forward

BotKit 0.2.0 represents our ongoing commitment to making fediverse bot development accessible, powerful, and enjoyable. We believe these new features will help your bots become more engaging and interactive members of the fediverse community.

For complete docs and more examples, visit our docs site.

Thank you to everyone who contributed to this release through feedback, feature requests, and code contributions. The BotKit community continues to grow, and we're excited to see what you'll create!


BotKit is powered by Fedify, a lower-level framework for creating ActivityPub server applications.

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

Coming soon in 0.2.0: Native post support!

We're excited to share a preview of the upcoming quoting features in BotKit 0.2.0. This update will make it easier for your bots to engage with quoted content across the fediverse.

The quoting feature set includes:

Here's a quick example of how you can use the quote detection:

bot.onQuote = async (session, quote) => {
  // The quote parameter is a Message object representing the post that quoted your bot
  await quote.reply(text`Thanks for quoting my post, ${quote.actor}!`);
  
  // You can access the original quoted message
  const originalPost = quote.quoteTarget;
  console.log(`Original message: ${originalPost?.text}`);
};

And creating quote posts is just as simple:

// Quote in a new post
await session.publish(
  text`I'm quoting this interesting message!`,
  { quoteTarget: someMessage }
);

// Or quote in a reply
await message.reply(
  text`Interesting point! I'm quoting another relevant post here.`,
  { quoteTarget: anotherMessage }
);

Remember that quoting behavior may vary across different implementationsโ€”some platforms like Misskey display quotes prominently, while others like Mastodon might implement them differently.

Want to try these features right now? You can install the development version from JSR:

deno add jsr:@fedify/botkit@0.2.0-dev.90+d6ab4bdc

We're looking forward to seeing how you use these quoting capabilities in your bots!

Esurio's avatar
Esurio

@esurio1673@c.koliosky.com

Botkit๏ผŒใƒชใ‚ขใ‚ฏใ‚ทใƒงใƒณใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸใฎใญ

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

Continuing our emoji reaction feature announcement, we're also introducing two new event handlersโ€”Bot.onReact and Bot.onUnreactโ€”that let your bot respond when users react to posts:

// When someone adds an emoji reaction to a post
bot.onReact = async (session, reaction) => {
  // Only respond when the reaction is to your bot's post
  if (reaction.message.actor.id?.href === session.actorId.href) {
    console.log(`${reaction.actor.preferredUsername} reacted with ${reaction.emoji}`);
    
    // You can respond differently based on the emoji
    if (reaction.emoji === "โค๏ธ") {
      await session.publish(
        text`Thanks for the love, ${reaction.actor}!`,
        { visibility: "direct" }
      );
    }
  }
};
// When someone removes their emoji reaction
bot.onUnreact = async (session, reaction) => {
  if (reaction.message.actor.id?.href === session.actorId.href) {
    console.log(`${reaction.actor.preferredUsername} removed their ${reaction.emoji} reaction`);
    
    // Optional: respond to reaction removal
    await session.publish(
      text`I noticed you removed your ${reaction.emoji} reaction, ${reaction.actor}.`,
      { visibility: "direct" }
    );
  }
};

These event handlers open up interesting interaction possibilitiesโ€”your bot can now track popular reactions, respond to specific emoji feedback, or create interactive experiences based on reactions.

Want to try these features now? You can install the development version from JSR today:

deno add jsr:@fedify/botkit@0.2.0-dev.86+cdbb52a2

The full documentation for these features will be available when BotKit 0.2.0 is officially released!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

We're excited to introduce emoji reactions in the upcoming 0.2.0 release!

With the new Message.react() method, your bot can now react to messages using standard Unicode :

await message.react(emoji`๐Ÿ‘`);

support is also included, allowing your bot to react with server-specific emojis:

const emojis = bot.addCustomEmojis({
  // Use a remote image URL:
  yesBlob: {
    url: "https://cdn3.emoji.gg/emojis/68238-yesblob.png",
    mediaType: "image/png",
  },
  // Use a local image file:
  noBlob: {
    file: `${import.meta.dirname}/emojis/no_blob.png`,
    mediaType: "image/webp",
  },
});

await message.react(emojis.yesBlob);

Reactions can be removed using the AuthorizedReaction.unreact() method:

const reaction = await message.react(emoji`โค๏ธ`);
await reaction.unreact();

Want to try these features now? You can install the development version from JSR today:

deno add jsr:@fedify/botkit@0.2.0-dev.84+c997c6a6

We're looking forward to seeing how your bots express themselves with this new feature!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

We're excited to announce that 0.2.0 will introduce custom emoji support! This feature allows your bots to express themselves with more personality and engagement.

What's included:

  • Add custom emojis to your bot with Bot.addCustomEmojis()
  • Use emoji in messages with the customEmoji() function
  • Support for both local image files and remote URLs as emoji sources
  • Full integration with BotKit's text formatting system

Simple example:

// Define custom emojis
const emojis = bot.addCustomEmojis({
  botkit: { file: "./botkit.png", type: "image/png" },
  fedify: { url: "https://fedify.dev/logo.png", type: "image/png" }
});

// Use in messages
await session.publish(
  text`Hello world! ${customEmoji(emojis.botkit)}`
);

Want to try it early? You can install the development version from JSR today:

deno add jsr:@fedify/botkit@0.2.0-dev.82+8a0438e6

ๆดช ๆฐ‘ๆ†™ (Hong Minhee)'s avatar
ๆดช ๆฐ‘ๆ†™ (Hong Minhee)

@hongminhee@hollo.social

I've been considering what to add in the next version of BotKit (v0.2.0) and wanted to share my current plans. After reviewing feedback and examining the ecosystem, I've identified three key features that would significantly enhance the framework's capabilities:

  1. Custom emoji support. This would allow bots to use server-defined custom emojis in their messages, making communication more expressive and allowing better integration with instance culture.

  2. Emoji reactions. I plan to implement both sending and receiving emoji reactions to messages. This provides a lightweight interaction model that many users prefer for simple acknowledgments or responses. This would manifest as new event handlers (like Bot.onReaction) and methods (like Message.react()).

  3. Quote posts. The ability to reference other posts with commentary is an important discourse feature in the fediverse. Supporting both sending quotes and detecting when bot posts have been quoted would enable more sophisticated conversational patterns.

These additions should make more capable while maintaining its simple, developer-friendly API. I expect implementation to involve extending the Message class and adding new Text processing capabilities, all while keeping backward compatibility with existing bots. Having built both Hollo and Hackers' Pub, I already have deep familiarity with how various ActivityPub implementations handle these features across the fediverse. I welcome any community feedback on priorities or implementation details before I begin coding.

Simon Park's avatar
Simon Park

@parksb@silicon.moe

BotKit์„ ์ด์šฉํ•ด ๊ตญ๋‚ด์™ธ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์˜ ์•„ํ‹ฐํด์„ ์—…๋กœ๋“œํ•˜๋Š” 'Tech Blog Bot'์„ ๋งŒ๋“ค์—ˆ๋‹ค. 1์‹œ๊ฐ„์— ํ•œ ๋ฒˆ์”ฉ ๊ตฌ๋…์ค‘์ธ ๋ธ”๋กœ๊ทธ๋“ค์˜ ์ƒˆ ์•„ํ‹ฐํด์„ ํ™•์ธํ•ด ํ์— ๋„ฃ๊ณ , 1๋ถ„์— ํ•˜๋‚˜์”ฉ ํ์˜ ์•„ํ‹ฐํด์„ ์—…๋กœ๋“œํ•œ๋‹ค. BotKit์˜ ์œ ๋ คํ•จ์— ์ฒซ ๋ฒˆ์งธ๋กœ ๋†€๋ž๊ณ , ํ…Œ์ŠคํŠธ๋กœ ๋Œ๋ ค๋ณธ ๋ด‡์ด ์ŠคํŒธ์ง“์„ ํ•˜๋Š” ๊ฑธ ๋ณด๋ฉด์„œ ๋‘ ๋ฒˆ์งธ๋กœ ๋†€๋ž๋‹ค. techblogbot.parksb.xyz/

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

๏ผˆ๏ผ‰็”จใฎใƒœใƒƒใƒˆใ‚’ไฝœใ‚ŠใŸใ„ใงใ™ใ‹๏ผŸ by Fedifyใ‚’ไฝฟใˆใฐใ€ใ‚ใšใ‹ๆ•ฐ่กŒใฎใ‚ณใƒผใƒ‰ใงใ‚นใ‚ฟใƒณใƒ‰ใ‚ขใƒญใƒณใฎActivityPubใƒœใƒƒใƒˆใ‚’ๆง‹็ฏ‰ใงใใพใ™๏ผๅพ“ๆฅใฎMastodonใ‚„Misskeyใƒœใƒƒใƒˆใจใฏ็•ฐใชใ‚Šใ€BotKitใฏใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใฎๅˆถ็ด„ใชใ—ใซๅฎŒๅ…จใชActivityPubใ‚ตใƒผใƒใƒผใ‚’ไฝœๆˆใงใใพใ™ใ€‚

BotKitใงใงใใ‚‹ใ“ใจ๏ผš

  • ใƒกใƒณใ‚ทใƒงใƒณใ€ใƒ•ใ‚ฉใƒญใƒผใ€ใƒกใƒƒใ‚ปใƒผใ‚ธใซๅฟœ็ญ”ใ™ใ‚‹ใƒœใƒƒใƒˆใฎๆง‹็ฏ‰
  • ๆ•ดๅฝขใ•ใ‚ŒใŸใƒ†ใ‚ญใ‚นใƒˆใ€ใƒกใƒณใ‚ทใƒงใƒณใ€ใƒกใƒ‡ใ‚ฃใ‚ขใ‚’ๅซใ‚€่ฑŠใ‹ใชใ‚ณใƒณใƒ†ใƒณใƒ„ใฎไฝœๆˆ
  • ไบˆ็ด„ๆŠ•็จฟใฎๅ…ฌ้–‹ใจไผš่ฉฑใฎ่‡ชๅ‹•็ฎก็†
  • Deno Deployใ€Dockerใ€ใพใŸใฏ่‡ชๅทฑใƒ›ใ‚นใƒ†ใ‚ฃใƒณใ‚ฐใ‚ตใƒผใƒใƒผใธใฎ็ฐกๅ˜ใชใƒ‡ใƒ—ใƒญใ‚ค

ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฏhttps://botkit.fedify.dev/ใง็ขบ่ชใ—ใ€ไปŠใ‹ใ‚‰ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆใฎๆง‹็ฏ‰ใ‚’ๅง‹ใ‚ใพใ—ใ‚‡ใ†๏ผ

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

()๋ฅผ ์œ„ํ•œ ๋ด‡์„ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? by Fedify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋…๋ฆฝํ˜• ๋ด‡์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ผ๋ฐ˜์ ์ธ Mastodon ๋˜๋Š” Misskey ๋ด‡๊ณผ ๋‹ฌ๋ฆฌ, BotKit์€ ํ”Œ๋žซํผ ์ œ์•ฝ ์—†์ด ์™„์ „ํ•œ ActivityPub ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

BotKit์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:

  • ๋ฉ˜์…˜, ํŒ”๋กœ์šฐ ๋ฐ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•˜๋Š” ๋ด‡ ๋งŒ๋“ค๊ธฐ
  • ํ˜•์‹ํ™”๋œ ํ…์ŠคํŠธ, ๋ฉ˜์…˜ ๋ฐ ๋ฏธ๋””์–ด๊ฐ€ ํฌํ•จ๋œ ํ’๋ถ€ํ•œ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ
  • ์˜ˆ์•ฝ๋œ ๊ฒŒ์‹œ๋ฌผ ๋ฐœํ–‰ ๋ฐ ๋Œ€ํ™” ์ž๋™ ๊ด€๋ฆฌ
  • Deno Deploy, Docker ๋˜๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ์„œ๋ฒ„์— ์‰ฝ๊ฒŒ ๋ฐฐํฌ

๋ฌธ์„œ๋Š” https://botkit.fedify.dev/์—์„œ ํ™•์ธํ•˜์‹œ๊ณ  ์ง€๊ธˆ ๋ฐ”๋กœ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

Want to create a for the ? by @fedify lets you build standalone bots with just a few lines of code! Unlike traditional Mastodon bots, BotKit helps you create complete ActivityPub servers without platform constraints.

With BotKit, you can:

  • Build bots that respond to mentions, follows, and messages
  • Create rich content with formatted text, mentions, and media
  • Publish scheduled posts and automatically manage conversations
  • Deploy easily on Deno Deploy, Docker, or self-hosted servers

Check out our documentation at https://botkit.fedify.dev/ and start building your fediverse bot today!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

๏ผˆ๏ผ‰็”จใฎใƒœใƒƒใƒˆใ‚’ไฝœใ‚ŠใŸใ„ใงใ™ใ‹๏ผŸ by Fedifyใ‚’ไฝฟใˆใฐใ€ใ‚ใšใ‹ๆ•ฐ่กŒใฎใ‚ณใƒผใƒ‰ใงใ‚นใ‚ฟใƒณใƒ‰ใ‚ขใƒญใƒณใฎActivityPubใƒœใƒƒใƒˆใ‚’ๆง‹็ฏ‰ใงใใพใ™๏ผๅพ“ๆฅใฎMastodonใ‚„Misskeyใƒœใƒƒใƒˆใจใฏ็•ฐใชใ‚Šใ€BotKitใฏใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใฎๅˆถ็ด„ใชใ—ใซๅฎŒๅ…จใชActivityPubใ‚ตใƒผใƒใƒผใ‚’ไฝœๆˆใงใใพใ™ใ€‚

BotKitใงใงใใ‚‹ใ“ใจ๏ผš

  • ใƒกใƒณใ‚ทใƒงใƒณใ€ใƒ•ใ‚ฉใƒญใƒผใ€ใƒกใƒƒใ‚ปใƒผใ‚ธใซๅฟœ็ญ”ใ™ใ‚‹ใƒœใƒƒใƒˆใฎๆง‹็ฏ‰
  • ๆ•ดๅฝขใ•ใ‚ŒใŸใƒ†ใ‚ญใ‚นใƒˆใ€ใƒกใƒณใ‚ทใƒงใƒณใ€ใƒกใƒ‡ใ‚ฃใ‚ขใ‚’ๅซใ‚€่ฑŠใ‹ใชใ‚ณใƒณใƒ†ใƒณใƒ„ใฎไฝœๆˆ
  • ไบˆ็ด„ๆŠ•็จฟใฎๅ…ฌ้–‹ใจไผš่ฉฑใฎ่‡ชๅ‹•็ฎก็†
  • Deno Deployใ€Dockerใ€ใพใŸใฏ่‡ชๅทฑใƒ›ใ‚นใƒ†ใ‚ฃใƒณใ‚ฐใ‚ตใƒผใƒใƒผใธใฎ็ฐกๅ˜ใชใƒ‡ใƒ—ใƒญใ‚ค

ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใฏhttps://botkit.fedify.dev/ใง็ขบ่ชใ—ใ€ไปŠใ‹ใ‚‰ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆใฎๆง‹็ฏ‰ใ‚’ๅง‹ใ‚ใพใ—ใ‚‡ใ†๏ผ

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social ยท Reply to BotKit by Fedify :botkit:'s post

()๋ฅผ ์œ„ํ•œ ๋ด‡์„ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? by Fedify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋…๋ฆฝํ˜• ๋ด‡์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ผ๋ฐ˜์ ์ธ Mastodon ๋˜๋Š” Misskey ๋ด‡๊ณผ ๋‹ฌ๋ฆฌ, BotKit์€ ํ”Œ๋žซํผ ์ œ์•ฝ ์—†์ด ์™„์ „ํ•œ ActivityPub ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

BotKit์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:

  • ๋ฉ˜์…˜, ํŒ”๋กœ์šฐ ๋ฐ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•˜๋Š” ๋ด‡ ๋งŒ๋“ค๊ธฐ
  • ํ˜•์‹ํ™”๋œ ํ…์ŠคํŠธ, ๋ฉ˜์…˜ ๋ฐ ๋ฏธ๋””์–ด๊ฐ€ ํฌํ•จ๋œ ํ’๋ถ€ํ•œ ์ฝ˜ํ…์ธ  ์ƒ์„ฑ
  • ์˜ˆ์•ฝ๋œ ๊ฒŒ์‹œ๋ฌผ ๋ฐœํ–‰ ๋ฐ ๋Œ€ํ™” ์ž๋™ ๊ด€๋ฆฌ
  • Deno Deploy, Docker ๋˜๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ์„œ๋ฒ„์— ์‰ฝ๊ฒŒ ๋ฐฐํฌ

๋ฌธ์„œ๋Š” https://botkit.fedify.dev/์—์„œ ํ™•์ธํ•˜์‹œ๊ณ  ์ง€๊ธˆ ๋ฐ”๋กœ ์—ฐํ•ฉ์šฐ์ฃผ ๋ด‡์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

Want to create a for the ? by @fedify lets you build standalone bots with just a few lines of code! Unlike traditional Mastodon bots, BotKit helps you create complete ActivityPub servers without platform constraints.

With BotKit, you can:

  • Build bots that respond to mentions, follows, and messages
  • Create rich content with formatted text, mentions, and media
  • Publish scheduled posts and automatically manage conversations
  • Deploy easily on Deno Deploy, Docker, or self-hosted servers

Check out our documentation at https://botkit.fedify.dev/ and start building your fediverse bot today!

Nelson's avatar
Nelson

@skyfaller@jawns.club ยท Reply to Loren's post

@loren BotKit looks like an interesting approach, but I've never made a bot so I can't evaluate it: botkit.fedify.dev/

Fedify: an ActivityPub server framework's avatar
Fedify: an ActivityPub server framework

@fedify@hollo.social ยท Reply to Fedify: an ActivityPub server framework's post

Fedifyใฎ้–ข้€ฃใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’ใ”็ดนไป‹ใ—ใŸใ„ใจๆ€ใ„ใพใ™ใ€‚ActivityPubใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณ้–‹็™บใ‚’ใ‚ˆใ‚Š็ฐกๅ˜ใซใ™ใ‚‹ใƒ„ใƒผใƒซ็พคใงใ™๏ผš

Fedify :fedify:

Fedify๏ผˆ@fedify๏ผ‰ใฏActivityPubใ‚„ใใฎไป–ใฎใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นๆจ™ๆบ–ใ‚’ๆดป็”จใ™ใ‚‹้€ฃๅˆๅž‹ใ‚ตใƒผใƒใƒผใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใŸใ‚ใฎTypeScriptใƒฉใ‚คใƒ–ใƒฉใƒชใงใ™ใ€‚Activity Vocabularyใฎๅž‹ๅฎ‰ๅ…จใชใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ€WebFingerใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใƒปใ‚ตใƒผใƒใƒผใ€HTTP Signaturesใชใฉใ‚’ๆไพ›ใ—ใ€ใƒœใ‚คใƒฉใƒผใƒ—ใƒฌใƒผใƒˆใ‚ณใƒผใƒ‰ใ‚’ๅ‰Šๆธ›ใ—ใฆใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใƒญใ‚ธใƒƒใ‚ฏใซ้›†ไธญใงใใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚

Hollo :hollo:

Hollo๏ผˆ@hollo๏ผ‰ใฏFedifyใงๅ‹•ไฝœใ™ใ‚‹ใŠไธ€ไบบๆง˜็”จใƒžใ‚คใ‚ฏใƒญใƒ–ใƒญใ‚ฐใ‚ตใƒผใƒใƒผใงใ™ใ€‚ๅ€‹ไบบๅ‘ใ‘ใซ่จญ่จˆใ•ใ‚Œใฆใ„ใพใ™ใŒใ€ActivityPubใ‚’้€šใ˜ใฆๅฎŒๅ…จใซ้€ฃๅˆๅŒ–ใ•ใ‚ŒใฆใŠใ‚Šใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นๅ…จไฝ“ใฎใƒฆใƒผใ‚ถใƒผใจไบคๆตใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚HolloใฏMastodonไบ’ๆ›APIใ‚’ๅฎŸ่ฃ…ใ—ใฆใ„ใ‚‹ใŸใ‚ใ€็‹ฌ่‡ชใฎใ‚ฆใ‚งใƒ–ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใŒใชใใฆใ‚‚ใ€ใปใจใ‚“ใฉใฎMastodonใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใจไบ’ๆ›ๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚

HolloใฏใพใŸใ€ๆญฃๅผใƒชใƒชใƒผใ‚นๅ‰ใฎๆœ€ๆ–ฐFedifyๆฉŸ่ƒฝใ‚’ใƒ†ใ‚นใƒˆใ™ใ‚‹ๅฎŸ้จ“ๅ ดใจใ—ใฆใ‚‚ๆดป็”จใ•ใ‚Œใฆใ„ใพใ™ใ€‚

BotKit :botkit:

BotKit๏ผˆ@botkit๏ผ‰ใฏ็งใŸใกใฎๆœ€ใ‚‚ๆ–ฐใ—ใ„ใƒกใƒณใƒใƒผใงใ€ActivityPubใƒœใƒƒใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใŸใ‚ใซ็‰นๅˆฅใซ่จญ่จˆใ•ใ‚ŒใŸใƒ•ใƒฌใƒผใƒ ใƒฏใƒผใ‚ฏใงใ™ใ€‚ๅพ“ๆฅใฎMastodonใƒœใƒƒใƒˆใจใฏ็•ฐใชใ‚Šใ€BotKitใฏใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๅ›บๆœ‰ใฎๅˆถ้™๏ผˆๆ–‡ๅญ—ๆ•ฐๅˆถ้™ใชใฉ๏ผ‰ใซ็ธ›ใ‚‰ใ‚Œใชใ„็‹ฌ็ซ‹ใ—ใŸActivityPubใ‚ตใƒผใƒใƒผใ‚’ไฝœๆˆใ—ใพใ™ใ€‚

BotKitใฎAPIใฏๆ„ๅ›ณ็š„ใซใ‚ทใƒณใƒ—ใƒซใซ่จญ่จˆใ•ใ‚ŒใฆใŠใ‚Šใ€ๅ˜ไธ€ใฎTypeScriptใƒ•ใ‚กใ‚คใƒซใงๅฎŒๅ…จใชใƒœใƒƒใƒˆใ‚’ไฝœๆˆใงใใพใ™๏ผ


ใ“ใ‚Œใ‚‰ไธ‰ใคใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฏใ™ในใฆ@fedify-dev GitHubใ‚ชใƒผใ‚ฌใƒ‹ใ‚ผใƒผใ‚ทใƒงใƒณใงใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใจใ—ใฆๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใใ‚Œใžใ‚Œ็•ฐใชใ‚‹็›ฎ็š„ใ‚’ๆŒใฃใฆใ„ใพใ™ใŒใ€ActivityPub้–‹็™บใ‚’ใ‚ˆใ‚Š่บซ่ฟ‘ใซใ—ใ€ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใฎใ‚จใ‚ณใ‚ทใ‚นใƒ†ใƒ ใ‚’ๆ‹กๅคงใ™ใ‚‹ใจใ„ใ†ๅ…ฑ้€šใฎ็›ฎๆจ™ใ‚’ๅ…ฑๆœ‰ใ—ใฆใ„ใพใ™ใ€‚

ใ“ใ‚Œใ‚‰ใฎใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’่ฉฆใ—ใฆใฟใŸใ‚Šใ€้–‹็™บใซ่ฒข็Œฎใ—ใŸใ‚Šใ™ใ‚‹ใ“ใจใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๅ ดๅˆใฏใ€ไปฅไธ‹ใ‚’ใ”่ฆงใใ ใ•ใ„๏ผš

Fedify: an ActivityPub server framework's avatar
Fedify: an ActivityPub server framework

@fedify@hollo.social ยท Reply to Fedify: an ActivityPub server framework's post

์ž๋งค ํ”„๋กœ์ ํŠธ๋“ค์„ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ด€๋ จ ๋„๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค:

Fedify :fedify:

Fedify(@fedify)๋Š” ActivityPub์™€ ๋‹ค๋ฅธ () ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐํ•ฉ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Activity Vocabulary๋ฅผ ์œ„ํ•œ ํƒ€์ž… ์•ˆ์ „ํ•œ ๊ฐ์ฒด, WebFinger ํด๋ผ์ด์–ธํŠธ·์„œ๋ฒ„, HTTP Signatures ๋“ฑ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Hollo :hollo:

Hollo(@hollo)๋Š” Fedify๋กœ ๊ตฌ๋™๋˜๋Š” 1์ธ ์‚ฌ์šฉ์ž์šฉ ๋งˆ์ดํฌ๋กœ๋ธ”๋กœ๊น… ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. 1์ธ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ActivityPub๋ฅผ ํ†ตํ•ด ์™„์ „ํžˆ ์—ฐํ•ฉ๋˜์–ด ์—ฐํ•ฉ์šฐ์ฃผ ์ „์ฒด์˜ ์‚ฌ์šฉ์ž๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hollo๋Š” Mastodon ํ˜ธํ™˜ API๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ž์ฒด ์›น ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด๋„ ๋Œ€๋ถ€๋ถ„์˜ Mastodon ํด๋ผ์ด์–ธํŠธ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Hollo๋Š” ๋˜ํ•œ ์ •์‹ ์ถœ์‹œ ์ „์— ์ตœ์‹  Fedify ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์‹คํ—˜์žฅ์œผ๋กœ๋„ ํ™œ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BotKit :botkit:

BotKit(@botkit)์€ ์ €ํฌ์˜ ๊ฐ€์žฅ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์›์œผ๋กœ, ActivityPub ๋ด‡์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ Mastodon ๋ด‡๊ณผ ๋‹ฌ๋ฆฌ, BotKit์€ ํ”Œ๋žซํผ๋ณ„ ์ œํ•œ(๊ธ€์ž ์ˆ˜ ์ œํ•œ ๋“ฑ)์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ๋…๋ฆฝ์ ์ธ ActivityPub ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

BotKit์˜ API๋Š” ์˜๋„์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ๋‹จ์ผ TypeScript ํŒŒ์ผ๋กœ ์™„์ „ํ•œ ๋ด‡์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


์„ธ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘ @fedify-dev GitHub ์กฐ์ง์—์„œ ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ActivityPub ๊ฐœ๋ฐœ์„ ๋” ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์—ฐํ•ฉ์šฐ์ฃผ ์ƒํƒœ๊ณ„๋ฅผ ํ™•์žฅํ•œ๋‹ค๋Š” ๊ณตํ†ต๋œ ๋ชฉํ‘œ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด, ๋‹ค์Œ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”:

Fedify: an ActivityPub server framework's avatar
Fedify: an ActivityPub server framework

@fedify@hollo.social

We'd like to introduce the project familyโ€”a set of related tools that make building applications more accessible:

Fedify :fedify:

Fedify (@fedify) is a library for building federated server applications powered by ActivityPub and other standards. It provides type-safe objects for Activity Vocabulary, WebFinger client/server, HTTP Signatures, and moreโ€”eliminating boilerplate code so you can focus on your application logic.

Hollo :hollo:

Hollo (@hollo) is a single-user microblogging server powered by Fedify. While designed for individual users, it's fully federated through ActivityPub, allowing interaction with users across the fediverse. implements Mastodon-compatible APIs, making it compatible with most Mastodon clients without needing its own web interface.

Hollo also serves as our testing ground for bleeding-edge Fedify features before they're officially released.

BotKit :botkit:

BotKit (@botkit) is our newest family memberโ€”a framework specifically designed for creating ActivityPub bots. Unlike traditional Mastodon bots, creates standalone ActivityPub servers that aren't constrained by platform-specific limitations (like character counts).

BotKit's API is intentionally simpleโ€”you can create a complete bot in a single TypeScript file!


All three projects are open source and hosted under the @fedify-dev GitHub organization. While they serve different purposes, they share common goals: making ActivityPub development more accessible and expanding the fediverse ecosystem.

If you're interested in trying any of these projects or contributing to their development, check out:

BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

Are you interested in creating bots for the ? Meet , a framework that makes bot development easier than ever!

Key Features:

True Independence

  • Create standalone bots
  • No need for a Mastodon or Misskey account
  • Free from platform-specific limitations

Simple and Intuitive API

  • Create a complete bot in a single TypeScript file
  • Intuitive event handlers for mentions, follows, and messages
  • Rich text formatting with Markdown support

Modern Deployment

  • Deploy on Deno Deploy, Fly.io, Railway, or any virtual server
  • Minimal dependencies
  • Designed for modern cloud platforms

Enterprise-Ready Foundation

  • Built on Fedify, a rock-solid ActivityPub framework
  • Seamless federation with Mastodon, Misskey, and other platforms
  • Robust compatibility across the fediverse

Developer Experience

  • Full TypeScript support with great IDE integration
  • Comprehensive documentation
  • Built-in testing utilities

Here's a quick example of how simple it is to create a bot:

import { createBot, mention, text } from "@fedify/botkit";

const bot = createBot<void>({
  username: "greetbot",
  name: "Greet Bot",
  summary: text`A friendly bot that greets people!`,
  // ... configuration ...
});

// Respond to mentions
bot.onMention = async (session, message) => {
  await message.reply(text`Hi, ${message.actor}! Thanks for saying hello!`);
};

export default bot;

Getting Started:

  1. Install
  2. Run: deno add jsr:@fedify/botkit@^0.1.0-dev
  3. Create your bot with just a few lines of code

Check out our documentation at https://botkit.fedify.dev/ to learn more!

TMNT Logo Generator's avatar
TMNT Logo Generator

@tmnt@logos.deno.dev ยท Reply to BotKit by Fedify :botkit:'s post

@botkit@hollo.social

Image showing the TMNT logo (with a white background) except the text is replaced with 'Powered by Fedify: BotKit
'
ALT text detailsImage showing the TMNT logo (with a white background) except the text is replaced with 'Powered by Fedify: BotKit '
BotKit by Fedify :botkit:'s avatar
BotKit by Fedify :botkit:

@botkit@hollo.social

@tmnt Powered by Fedify: BotKit

Older โ†’