Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MastoBot-Python

MastoBot is a generic Python package which allows for customizable Mastodon bots to be created. This bots can do anything from simply liking posts by specific users, cross-posting to other platforms or simulating Mastodon groups. One such example is the implementation for the 3D printing group bot.

Motivation

Mastodon allows for the use of hashtags on the platform. Users can use these hashtags to allow others to subscribe to topics and search for trends. These hashtags however suffer from the lack of moderation. Malicious users are able to hijack trends and topics by simply using the tags in their posts. Users are unable to avoid such post except for muting or blocking such users.

As Mastodon has grown in popularity the need for larger communities and discussions has grown. This bot allows users to mention the username of the bot, no different from mentioning any other user. The bot can then perform certain actions on this post. This most common reaction is to boost the post for other users following the bot to see. Moderators can then remove rule-breaking posts, block user on their current account and new accounts they move to and run various other automation. Such groups can also be made open-source to allow the community to contribute to the development of the bot. Such groups grant moderators more granular control and allows for an improved experience for communities.

As the project grew, the implementation became more generic and the original idea was forked and this package was created.

Configuration

Config.py

config.py is used to load custom configs and modified implementations. It allows for the specification of parameters that change the behavior of the bot. Currently no main-stream functionality is included using this file, but it has already been added for future features.

Credentials.py

credentials.py is used to load custom credentials and is kept separate to allow for the sharing of configs and implementations, but keeping credentials secret.

Currently the following credentials are implemented and should be provided in credentials.yml:

  • mastodon: secret: Your Mastodon secret key, found under development in your settings base_url: Your base url for my instance it would be "https://techhub.social/"

Docker

For simplicity the main focus of this bot has been to develop it to run in Docker. This allows for a simpler deployment of the bot and binds all of its components together. It also allows less technical users to easily host multiple bots and track their performance.

Installation

To start, first install this package in your project

```bash
pip install git+https://github.com/e-dreyer/mastoBot
```

The pip installation can then be frozen to create a requirements file

```bash
pip freeze > requirements.txt
```

From here the package can simply be imported and used.

Usage

Start by first copying the credentials.yml and config.yml files from the example folder. Add your desired config to config.yml and copy and paste the required credentials into you credentials.yml file. These credentials can be found on your Mastodon profile, under settings > development.

Import the following modules and packages:

```python
from mastoBot.configManager import ConfigAccessor
from mastoBot.mastoBot import MastoBot, handleMastodonExceptions
```

Then create a new class inheriting from MastoBot. The following code can be copied directly. Each of these functions are required to be implemented and will automatically be executed for all notifications received over the Mastodon API. Thus, you can specify the behavior for each type of notification.

```python
class MyBot(MastoBot):
@handleMastodonExceptions
def processMention(self, mention: Dict):
self.dismissNotification(mention.get("id"))
@handleMastodonExceptions
def processReblog(self, reblog: Dict):
self.dismissNotification(reblog.get("id"))
@handleMastodonExceptions
def processFavourite(self, favourite: Dict):
self.dismissNotification(favourite.get("id"))
@handleMastodonExceptions
def processFollow(self, follow: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processPoll(self, poll: Dict):
self.dismissNotification(poll.get("id"))
@handleMastodonExceptions
def processFollowRequest(self, follow_request: Dict):
self.dismissNotification(follow_request.get("id"))
```

Then all that is left to do is run the main function

```python
class MyBot(MastoBot):
...
if __name__ == "__main__":
# Your config is imported here. ConfigAccessor allows us to easily extend these files and get errors for incorrect and missing fields and values
config = ConfigAccessor("config.yml")
credentials = ConfigAccessor("credentials.yml")
# Create an instance of your bot
bot = MyBot(credentials=credentials, config=config)
# Run the bot
bot.run()
```

As an example, here is an implementation for sending a welcoming message to all new followers:

```python
def processFollow(self, follow: Dict):
# The follow notification is automatically passed as a parameter to this function
# We use this notification to get the account of the new follower
api_account = self.getAccount(follow.get("account"))
# We then get the username@domain value of the account
account = api_account.get("acct")
# We can then try to import a Jinja2 template
try:
file_loader = FileSystemLoader("templates")
env = Environment(loader=file_loader)
template = env.get_template("new_follow.txt")
output = template.render(account=account)
except Exception as e:
logging.critical("Error initializing template")
raise e
# The template can then be rendered
try:
self._api.status_post(status=output, visibility="direct")
except Exception as e:
logging.critical("Error posting Status")
raise e
logging.info(f"Follow processed: {follow.get('id')}")
# Finally, we can dismiss the notification at the API level.
# This basically deletes the notification and this function will not be called for it again
self.dismissNotification(follow.get("id"))
```

Finally, you can simply run:

```bash
docker-compose up -d --build
```

And your bot will be up and running in Docker!

About

A Mastodon bot for the @python@techhub.social account using MastoBot

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages