Browse Source

prima aggiunta

jops 3 years ago
parent
commit
bf7cf01392
5 changed files with 99 additions and 0 deletions
  1. 14 0
      .env.sample
  2. 15 0
      Dockerfile
  3. 1 0
      last_id.txt
  4. 2 0
      requirements.txt
  5. 67 0
      welcomebot.py

+ 14 - 0
.env.sample

@@ -0,0 +1,14 @@
+# Mastodon Instance Base URL
+INSTANCE_BASE="https://yourmastodon.instance"
+# Values from Development Application
+CLIENT_ID="xxxxxx"
+CLIENT_SECRET="xxxxxx"
+ACCESS_TOKEN="xxxxxx"
+# Welcome message format string.
+# {username} will put the user's name.
+# {useracct} will use the user's acct value, which on local instances should be identical to the {username}.
+WELCOME_MESSAGE="Welcome, @{username}, to this instance!"
+# Welcome message visibility: 'direct', 'private', 'unlisted', 'public'
+MESSAGE_VISIBILITY="unlisted"
+# How long in seconds to wait between checks
+WAIT_TIME=300

+ 15 - 0
Dockerfile

@@ -0,0 +1,15 @@
+FROM python:3
+
+RUN mkdir /data
+
+WORKDIR "/usr/src/app"
+ENV IS_DOCKER 1
+
+COPY requirements.txt .
+RUN pip install --no-cache-dir -r requirements.txt
+
+COPY . .
+
+CMD [ "python", "./bot.py" ]
+
+VOLUME /data

+ 1 - 0
last_id.txt

@@ -0,0 +1 @@
+0

+ 2 - 0
requirements.txt

@@ -0,0 +1,2 @@
+Mastodon.py==1.3.1
+python-dotenv==0.9.1

+ 67 - 0
welcomebot.py

@@ -0,0 +1,67 @@
+from mastodon import Mastodon
+from dotenv import load_dotenv
+from pathlib import Path
+import os
+import time
+
+load_dotenv()
+
+INSTANCE_BASE = os.getenv('INSTANCE_BASE')
+CLIENT_ID = os.getenv('CLIENT_ID')
+CLIENT_SECRET = os.getenv('CLIENT_SECRET')
+ACCESS_TOKEN = os.getenv('ACCESS_TOKEN')
+WELCOME_MESSAGE = os.getenv('WELCOME_MESSAGE', 'Welcome to the instance, @{username}!').replace("\\n","\n")
+MESSAGE_VISIBILITY = os.getenv('MESSAGE_VISIBILITY', 'unlisted')
+WAIT_TIME = int(os.getenv('WAIT_TIME', 300))
+IS_DOCKER = os.getenv('IS_DOCKER', False)
+
+
+def contains_local_account(accounts):
+    for account in accounts:
+        if account.username == account.acct:
+            return True
+    return False
+
+def is_local_account(account):
+    return account.username == account.acct
+
+def send_welcome_message(mastodon, account):
+    formatted_message = WELCOME_MESSAGE.format(username=account.username, useracct=account.acct)
+    mastodon.status_post(formatted_message)
+
+last_id_file = Path('.') / 'last_id.txt'
+last_id = 0
+
+if IS_DOCKER:
+    last_id_file = Path('/data') / 'last_id'
+if last_id_file.is_file():
+    with open(str(last_id_file)) as f:
+        last_id = int(f.read())
+
+print('Botvenon is starting...')
+print('Welcoming any users after id %d' % last_id)
+
+mastodon = Mastodon(
+    client_id=CLIENT_ID,
+    client_secret=CLIENT_SECRET,
+    access_token=ACCESS_TOKEN,
+    api_base_url=INSTANCE_BASE)
+
+user = mastodon.account_verify_credentials()  # Get the current user
+
+followers = mastodon.account_followers(user)  # Get the latest followers
+
+
+# print(
+#     f'''Followed by: {account.username}
+# (Acct value: {account.acct}, id: {account.id})''')
+
+while True:
+    for account in mastodon.account_followers(user):
+        if is_local_account(account) and account.id > last_id and not account.bot:
+            last_id = account.id
+            with open(str(last_id_file), 'w+') as f:
+                f.write(str(last_id))
+            print('Welcoming %s...' % account.username)
+            send_welcome_message(mastodon, account)
+    time.sleep(WAIT_TIME)