BotKit by Fedify :botkit:'s avatar

BotKit by Fedify :botkit:

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

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

just small circles ๐Ÿ•Š's avatar
just small circles ๐Ÿ•Š

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

@botkit @gaebalgom

The development of fedify and botkit are handled splendidly, and all the progress is delightful to behold. Thanks to everyone involved for all the great work you do!

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

@botkit@hollo.social

We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as now supports .js alongside , making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred runtime while building with the same powerful BotKit APIs.

One of the most requested features has landed: poll support! You can now create interactive polls in your messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major platforms like Mastodon and Misskey.

// Create a poll with multiple choices
await session.publish(text`What's your favorite programming language?`, {
  class: Question,
  poll: {
    multiple: true,  // Allow multiple selections
    options: ["JavaScript", "TypeScript", "Python", "Rust"],
    endTime: Temporal.Now.instant().add({ hours: 24 }),
  },
});

// Handle votes
bot.onVote = async (session, vote) => {
  console.log(`${vote.actor} voted for "${vote.option}"`);
};

The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.

For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.

This release also includes an important security update: we've upgraded to 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.

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

@botkit@hollo.social

๐Ÿ”’ Security Update for BotKit Users

We've released patch versions BotKit 0.1.2 and 0.2.2 to address CVE-2025-54888, a security discovered in . These updates incorporate the latest patched version of Fedify to ensure your bots remain secure.

We strongly recommend all users update to the latest patch version immediately. Thank you for keeping the safe! ๐Ÿ›ก๏ธ

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

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

BotKit by Fedify๏ผš่ชฐใงใ‚‚็ฐกๅ˜ใซไฝœใ‚Œใ‚‹ActivityPubใƒœใƒƒใƒˆ

ๆœฌๆ—ฅOSC 2025ไบฌ้ƒฝใง้–‹ๅ‚ฌใ•ใ‚ŒใŸใ€ŒFediverseใฎใคใใ‚Šใ‹ใŸ ใ€œ้–‹็™บ่€…ใƒป็ฎก็†่€…ใŸใกใฎ็พๅ ดใ‹ใ‚‰ใ€œใ€ใ‚ปใƒŸใƒŠใƒผใง็™บ่กจใ—ใŸใ€ŒBotKit by Fedify๏ผš่ชฐใงใ‚‚็ฐกๅ˜ใซไฝœใ‚Œใ‚‹ActivityPubใƒœใƒƒใƒˆใ€ใฎ็™บ่กจ่ณ‡ๆ–™ใ‚’ๅ…ฑๆœ‰ใ—ใพใ™ใ€‚ใ”ๆธ…่ดใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ—ใŸใ€‚

ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†'s avatar
ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†

@Yohei_Zuho@mstdn.y-zu.org

ใ€OSCไบฌ้ƒฝใง :fediverse: ใซ้–ข้€ฃใ—ใŸใ‚ปใƒŸใƒŠใƒผใ‚’้–‹ๅ‚ฌใ—ใพใ™๏ผใ€‘
2025ๅนด8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰ใฎ13:00ใ€œ ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นไบฌ้ƒฝ ใงใ€Œๅˆ†ๆ•ฃๅž‹SNSใƒฆใƒผใ‚ถใƒผๆœ‰ๅฟ—ใ€ใจใ—ใฆใ€

ใ€ŒFediverseใฎใคใใ‚Šใ‹ใŸ ใ€œ้–‹็™บ่€…ใƒป็ฎก็†่€…ใŸใกใฎ็พๅ ดใ‹ใ‚‰ใ€œใ€

ใจ้กŒใ—ใฆใ‚ปใƒŸใƒŠใƒผ่ฌ›ๆผ”ใ‚’่กŒใ„ใพใ™๏ผ
็™ปๅฃ‡่€…ใจใ—ใฆ็งใฎใปใ‹ใ€
:fedibird1: ้‹ๅ–ถ่€…ใฎ @noellabo ใ•ใ‚“
:fedify: :hollo: ็ญ‰ใฎ้–‹็™บ่€…ใงใ‚ใ‚‹ @hongminhee ใ•ใ‚“
ไบฌ้ƒฝใฎMastodonๅœฐๅŸŸใ‚ตใƒผใƒใƒผ ็ฎก็†ไบบใฎ @7_nana ใ•ใ‚“
ใ‚’ใŠๅ‘ผใณใ—ใฆ้–‹ๅ‚ฌใ—ใพใ™ใ€‚
ActivityPubใ‚’ไธญๅฟƒใจใ—ใŸFediverseใฎไปŠใŒ็Ÿฅใ‚Œใ‚‹ใ‚ปใƒŸใƒŠใƒผใงใ™ใ€‚ใœใฒใ”ๅ‚ๅŠ ใใ ใ•ใ„๏ผ

ไผšๅ ด๏ผšKRP ใƒซใƒผใƒ 2B๏ผˆ2้šŽ๏ผ‰
ๆ—ฅๆ™‚๏ผš2025ๅนด8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰13:00ใ€œ
ๅ‚ๅŠ ่ฒป๏ผš็„กๆ–™
ใ‚ปใƒŸใƒŠใƒผ่ฉณ็ดฐ๏ผš
event.ospn.jp/osc2025-kyoto/se

ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†'s avatar
ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†

@Yohei_Zuho@mstdn.y-zu.org

ใ€OSCไบฌ้ƒฝใง :fediverse: ใซ้–ข้€ฃใ—ใŸใ‚ปใƒŸใƒŠใƒผใ‚’้–‹ๅ‚ฌใ—ใพใ™๏ผใ€‘
ๆœฌๆ—ฅใฎ13:00ใ€œ ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นไบฌ้ƒฝ ใงใ€Œๅˆ†ๆ•ฃๅž‹SNSใƒฆใƒผใ‚ถใƒผๆœ‰ๅฟ—ใ€ใจใ—ใฆใ€

ใ€ŒFediverseใฎใคใใ‚Šใ‹ใŸ ใ€œ้–‹็™บ่€…ใƒป็ฎก็†่€…ใŸใกใฎ็พๅ ดใ‹ใ‚‰ใ€œใ€

ใจ้กŒใ—ใฆใ‚ปใƒŸใƒŠใƒผ่ฌ›ๆผ”ใ‚’่กŒใ„ใพใ™๏ผ
็™ปๅฃ‡่€…ใจใ—ใฆ็งใฎใปใ‹ใ€
:fedibird1: ้‹ๅ–ถ่€…ใฎ @noellabo ใ•ใ‚“
:fedify: :hollo: ็ญ‰ใฎ้–‹็™บ่€…ใงใ‚ใ‚‹ @hongminhee ใ•ใ‚“
ไบฌ้ƒฝใฎMastodonๅœฐๅŸŸใ‚ตใƒผใƒใƒผ ็ฎก็†ไบบใฎ @7_nana ใ•ใ‚“
ใ‚’ใŠๅ‘ผใณใ—ใฆ้–‹ๅ‚ฌใ—ใพใ™ใ€‚
ActivityPubใ‚’ไธญๅฟƒใจใ—ใŸFediverseใฎไปŠใŒ็Ÿฅใ‚Œใ‚‹ใ‚ปใƒŸใƒŠใƒผใงใ™ใ€‚ใœใฒใ”ๅ‚ๅŠ ใใ ใ•ใ„๏ผ
ๆฑๆตท้“ใ‚‰ใใ•ใ‚“ใฎใ‚ปใƒŸใƒŠใƒผใฎใ‚ชใƒณใƒฉใ‚คใƒณURLใงใฎๅŒๆ™‚้…ไฟกใ‚‚ใ—ใพใ™๏ผ๏ผ
tokaidolug.connpass.com/event/

ไผšๅ ด๏ผšKRP ใƒซใƒผใƒ 2B๏ผˆ2้šŽ๏ผ‰
ๆ—ฅๆ™‚๏ผš2025ๅนด8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰13:00ใ€œ
ๅ‚ๅŠ ่ฒป๏ผš็„กๆ–™
ใ‚ปใƒŸใƒŠใƒผ่ฉณ็ดฐ๏ผš
event.ospn.jp/osc2025-kyoto/se

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

@hongminhee@hollo.social

8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰ใซOSC 2025 ไบฌ้ƒฝใง้–‹ๅ‚ฌใ•ใ‚Œใ‚‹ใ€ŒFediverseใฎใคใใ‚Šใ‹ใŸ ใ€œ้–‹็™บ่€…ใƒป็ฎก็†่€…ใŸใกใฎ็พๅ ดใ‹ใ‚‰ใ€œใ€ใ‚ปใƒŸใƒŠใƒผใงใ€ใ€ŒBotKit by Fedify๏ผš่ชฐใงใ‚‚็ฐกๅ˜ใซไฝœใ‚Œใ‚‹ActivityPubใƒœใƒƒใƒˆใ€ใจใ„ใ†ใƒ†ใƒผใƒžใงใ‚ชใƒณใƒฉใ‚คใƒณใซใฆ็ด„10ๅˆ†้–“็™บ่กจใ—ใพใ™ใ€‚ๆ™ฎๆฎตใ‹ใ‚‰ใƒ•ใ‚งใƒ‡ใ‚ฃใƒใƒผใ‚นใƒœใƒƒใƒˆใฎๅˆถไฝœใซ่ˆˆๅ‘ณใŒใ‚ใ‚‹ๆ–นใซใฏใ€ใใฃใจ่ˆˆๅ‘ณๆทฑใ่žใ„ใฆใ„ใŸใ ใ‘ใ‚‹ใฎใงใฏใชใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚ๅ‚ๅŠ ่ฒปใ‚‚็„กๆ–™ใงใ™ใฎใงใ€ใœใฒๅคšใใฎๆ–นใฎใ”ๅ‚ๅŠ ใ‚’ใŠๅพ…ใกใ—ใฆใŠใ‚Šใพใ™ใ€‚

ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†'s avatar
ใ‚‚ใกใ‚‚ใกใšใใ‚“ :teto_zuho: ๐Ÿ†

@Yohei_Zuho@mstdn.y-zu.org

ใ€OSCไบฌ้ƒฝใง :fediverse: ใซ้–ข้€ฃใ—ใŸใ‚ปใƒŸใƒŠใƒผใ‚’้–‹ๅ‚ฌใ—ใพใ™๏ผใ€‘
2025ๅนด8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰ใฎ13:00ใ€œ ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใ‚ซใƒณใƒ•ใ‚กใƒฌใƒณใ‚นไบฌ้ƒฝ ใงใ€Œๅˆ†ๆ•ฃๅž‹SNSใƒฆใƒผใ‚ถใƒผๆœ‰ๅฟ—ใ€ใจใ—ใฆใ€

ใ€ŒFediverseใฎใคใใ‚Šใ‹ใŸ ใ€œ้–‹็™บ่€…ใƒป็ฎก็†่€…ใŸใกใฎ็พๅ ดใ‹ใ‚‰ใ€œใ€

ใจ้กŒใ—ใฆใ‚ปใƒŸใƒŠใƒผ่ฌ›ๆผ”ใ‚’่กŒใ„ใพใ™๏ผ
็™ปๅฃ‡่€…ใจใ—ใฆ็งใฎใปใ‹ใ€
:fedibird1: ้‹ๅ–ถ่€…ใฎ @noellabo ใ•ใ‚“
:fedify: :hollo: ็ญ‰ใฎ้–‹็™บ่€…ใงใ‚ใ‚‹ @hongminhee ใ•ใ‚“
ไบฌ้ƒฝใฎMastodonๅœฐๅŸŸใ‚ตใƒผใƒใƒผ ็ฎก็†ไบบใฎ @7_nana ใ•ใ‚“
ใ‚’ใŠๅ‘ผใณใ—ใฆ้–‹ๅ‚ฌใ—ใพใ™ใ€‚
ActivityPubใ‚’ไธญๅฟƒใจใ—ใŸFediverseใฎไปŠใŒ็Ÿฅใ‚Œใ‚‹ใ‚ปใƒŸใƒŠใƒผใงใ™ใ€‚ใœใฒใ”ๅ‚ๅŠ ใใ ใ•ใ„๏ผ

ไผšๅ ด๏ผšKRP ใƒซใƒผใƒ 2B๏ผˆ2้šŽ๏ผ‰
ๆ—ฅๆ™‚๏ผš2025ๅนด8ๆœˆ3ๆ—ฅ๏ผˆๆ—ฅ๏ผ‰13:00ใ€œ
ๅ‚ๅŠ ่ฒป๏ผš็„กๆ–™
ใ‚ปใƒŸใƒŠใƒผ่ฉณ็ดฐ๏ผš
event.ospn.jp/osc2025-kyoto/se

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

@hongminhee@hollo.social

OSCไบฌ้ƒฝ2025ใงใฉใกใ‚‰ใฎ็™บ่กจใ‚’่žใใŸใ„ใงใ™ใ‹๏ผŸ

8ๆœˆ3ๆ—ฅใฎOSCไบฌ้ƒฝใง10ๅˆ†้–“ใฎใ‚ปใƒŸใƒŠใƒผ็™บ่กจใ‚’ใ™ใ‚‹ใ“ใจใซใชใ‚Šใพใ—ใŸใ€‚ไบŒใคใฎใƒ†ใƒผใƒžใง่ฟทใฃใฆใ„ใ‚‹ใฎใงใ€็š†ใ•ใ‚“ใฎใ”ๆ„่ฆ‹ใ‚’ใŠ่žใ‹ใ›ใใ ใ•ใ„๏ผ

ใฉใกใ‚‰ใฎใƒ†ใƒผใƒžใซ่ˆˆๅ‘ณใŒใ‚ใ‚Šใพใ™ใ‹๏ผŸ

OptionVoters
Fedify CLI๏ผšActivityPubใƒ‡ใƒใƒƒใ‚ฐใƒ„ใƒผใƒซ13 (50%)
BotKit๏ผš่ชฐใงใ‚‚ไฝœใ‚Œใ‚‹ActivityPubใƒœใƒƒใƒˆ13 (50%)
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!

Older โ†’