Compare commits

..

22 Commits

Author SHA1 Message Date
gitea 67ab3b4bba Docstring + bugfixes + random cyclic message
Nowy commit
2024-04-10 14:22:00 +02:00
gitea 71623d9812 Update fabryczka
:)

:)
2024-04-10 14:22:00 +02:00
gitea ce54233908 Fix. Was joking. 2024-04-10 14:22:00 +02:00
gitea b0df66c5da Fix. Last. 2024-04-10 14:22:00 +02:00
gitea fda2733600 Token amount change
Last (hopefully) fix

Fix+1

Fix

Fix

Fix

Test

Fix tokens

Fix
2024-04-10 14:22:00 +02:00
gitea 027050a4dd Token counter 2024-04-10 14:22:00 +02:00
gitea b22b9add15 Gpt fixes
FIx

Fix

Fix

Fix. Another.

!

Fix

Tiktoken

Fix

Fix
2024-04-10 14:22:00 +02:00
gitea 1fd5b8cfac GPT fixes
Fix

Test
2024-04-10 14:22:00 +02:00
gitea 5e3d90c038 Nope. It did not happen
Rollback not working

Nowe
2024-04-10 14:22:00 +02:00
gitea fef53a3587 Test heartbeat fix 2024-04-10 14:22:00 +02:00
gitea be1e338e54 Fixes + upgrade GPT model
Fix 2.0

Fix

Nope
2024-04-10 14:22:00 +02:00
gitea d6dd276a92 Mention conjurer 2024-04-10 14:22:00 +02:00
gitea a0cddaa1f0 update to gpt-4 2024-04-10 14:22:00 +02:00
gitea 38355da861 Test chat gpt4
Hejo

fix

:)
2024-04-10 14:21:59 +02:00
gitea 03c73fc55e Various fixes
Fixes

Fix

fix

Add Rev

Add

Fix with \\b

Lilia

Lunka i small fix
2024-04-10 14:21:59 +02:00
gitea 77089d408b ASync search and moving to fully asynchronous work + responses to config command
Async wyszukaj

More async

And even more async

Async fix

Async

+1

-1
2024-04-10 14:21:59 +02:00
gitea f05ae2b006 Improvements 2024-04-10 14:21:59 +02:00
gitea bca63dd94a Additional logging 2024-04-10 14:21:59 +02:00
gitea 2641965792 Playlist based on chat history
Fix 1

Fix 2

Fix 2.6

Logging
2024-04-10 14:21:59 +02:00
gitea dc9946533e Various fixes
Trunk + mod

FIx
2024-04-10 14:21:59 +02:00
gitea 0a39eba723 Create python-package.yml 2024-04-10 14:21:59 +02:00
gitea 114cfc35bc Create python-app.yml 2024-04-10 14:21:59 +02:00
13 changed files with 647 additions and 155 deletions
+39
View File
@@ -0,0 +1,39 @@
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python application
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
+40
View File
@@ -0,0 +1,40 @@
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python package
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.8", "3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
+39
View File
@@ -158,3 +158,42 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear # and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder. # option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/ #.idea/
package-lock.json
package.json
.vscode/settings.json
node_modules/.package-lock.json
node_modules/.bin/prettier
node_modules/prettier/bin-prettier.js
node_modules/prettier/cli.js
node_modules/prettier/doc.js
node_modules/prettier/index.js
node_modules/prettier/LICENSE
node_modules/prettier/package.json
node_modules/prettier/parser-angular.js
node_modules/prettier/parser-babel.js
node_modules/prettier/parser-espree.js
node_modules/prettier/parser-flow.js
node_modules/prettier/parser-glimmer.js
node_modules/prettier/parser-graphql.js
node_modules/prettier/parser-html.js
node_modules/prettier/parser-markdown.js
node_modules/prettier/parser-meriyah.js
node_modules/prettier/parser-postcss.js
node_modules/prettier/parser-typescript.js
node_modules/prettier/parser-yaml.js
node_modules/prettier/README.md
node_modules/prettier/standalone.js
node_modules/prettier/third-party.js
node_modules/prettier/esm/parser-angular.mjs
node_modules/prettier/esm/parser-babel.mjs
node_modules/prettier/esm/parser-espree.mjs
node_modules/prettier/esm/parser-flow.mjs
node_modules/prettier/esm/parser-glimmer.mjs
node_modules/prettier/esm/parser-graphql.mjs
node_modules/prettier/esm/parser-html.mjs
node_modules/prettier/esm/parser-markdown.mjs
node_modules/prettier/esm/parser-meriyah.mjs
node_modules/prettier/esm/parser-postcss.mjs
node_modules/prettier/esm/parser-typescript.mjs
node_modules/prettier/esm/parser-yaml.mjs
node_modules/prettier/esm/standalone.mjs
+8
View File
@@ -0,0 +1,8 @@
*out
*logs
*actions
*notifications
*tools
plugins
user_trunk.yaml
user.yaml
+10
View File
@@ -0,0 +1,10 @@
# Autoformatter friendly markdownlint config (all formatting rules disabled)
default: true
blank_lines: false
bullet: false
html: false
indentation: false
line_length: false
spaces: false
url: false
whitespace: false
+10
View File
@@ -0,0 +1,10 @@
rules:
quoted-strings:
required: only-when-needed
extra-allowed: ["{|}"]
empty-values:
forbid-in-block-mappings: true
forbid-in-flow-mappings: true
key-duplicates: {}
octal-values:
forbid-implicit-octal: true
+47
View File
@@ -0,0 +1,47 @@
version: 0.1
cli:
version: 1.14.2
plugins:
sources:
- id: trunk
ref: v1.2.1
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- checkov@2.4.9
- yamllint@1.32.0
- actionlint@1.6.25
- markdownlint@0.35.0
- trivy@0.44.1
- trufflehog@3.54.0
- pylint
- codespell
- cspell
- git-diff-check
- eslint
- prettier
- semgrep
- autopep8
- bandit
- black
- flake8
- isort
- mypy
- pylint
- ruff
- semgrep
- yapf
- gitleaks
runtimes:
enabled:
- go@1.19.5
- node@18.12.1
- python@3.10.8
actions:
disabled:
- trunk-announce
- trunk-check-pre-push
- trunk-fmt-pre-commit
enabled:
- trunk-upgrade-available
+6 -1
View File
@@ -1,4 +1,9 @@
{ {
"python.linting.enabled": true, "python.linting.enabled": true,
"python.linting.pylintEnabled": true "python.linting.pylintEnabled": true,
"trunk.inlineDecorators": true,
"trunk.inlineDecoratorsForAllExtensions": true,
"trunk.showPreexistingIssues": true,
"trunk.autoInit": true,
"trunk.showBelowThresholdIssues": true
} }
+294 -41
View File
@@ -24,7 +24,7 @@ from logging import handlers
from pathlib import Path, PurePath from pathlib import Path, PurePath
from platform import uname from platform import uname
from sys import platform from sys import platform
from typing import List, TypedDict, Optional from typing import List, Optional, TypedDict
# *==============Imported libraries # *==============Imported libraries
import discord import discord
@@ -35,12 +35,13 @@ import pdf2image
import PyPDF2 import PyPDF2
import requests import requests
import spotipy import spotipy
import tiktoken
from discord.ext import commands from discord.ext import commands
from spotipy.oauth2 import SpotifyClientCredentials from spotipy.oauth2 import SpotifyClientCredentials
import yt_dlp import yt_dlp
from spotify_dl import spotify
from spotify_dl import youtube as youtube_download from spotify_dl import youtube as youtube_download
from spotify_dl import spotify
Music_Config = TypedDict( Music_Config = TypedDict(
"Music_Config", "Music_Config",
@@ -53,10 +54,12 @@ Music_Config = TypedDict(
) )
# *=========================================== Predefines # *=========================================== Predefines
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s")
MASTER_TIMEOUT = datetime.now() MASTER_TIMEOUT = datetime.now()
INITIAL_TIME_WAIT = 5 INITIAL_TIME_WAIT = 5
MUZYKA: Music_Config = {"playing": False, "ctx": None, "queue": [], "requestor": []} MUZYKA: Music_Config = {"playing": False,
"ctx": None, "queue": [], "requestor": []}
LOGFILE = "" LOGFILE = ""
NETRC_FILE = "" NETRC_FILE = ""
@@ -66,6 +69,10 @@ MEMORY_FIVE_MUZYKA = ""
SETTINGS_FILE = "" SETTINGS_FILE = ""
ENCODING = "" ENCODING = ""
GRAPHICS_PATH = "" GRAPHICS_PATH = ""
MUZYKA_MOJEGO_LUDU_HISTORIA = 1500
MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE = 15
MUZYKA_MOJEGO_LUDU_PLAJLISTA = 30
# *=========================================== Platform Specific Predefines # *=========================================== Platform Specific Predefines
if platform in ("linux", "linux2"): if platform in ("linux", "linux2"):
@@ -73,6 +80,7 @@ if platform in ("linux", "linux2"):
if "microsoft-standard" in uname().release: if "microsoft-standard" in uname().release:
LOGFILE = "/home/mtuszowski/conjurer/discord.log" LOGFILE = "/home/mtuszowski/conjurer/discord.log"
MEMORY_FIVE_SIARA = "/home/mtuszowski/conjurer/pamiec.json" MEMORY_FIVE_SIARA = "/home/mtuszowski/conjurer/pamiec.json"
SYSTEM_GPT_SETTINGS = "/home/mtuszowski/conjurer/system_gpt_settings.json"
MEMORY_FIVE_MUZYKA = "/home/mtuszowski/conjurer/pamiec_muzyki.json" MEMORY_FIVE_MUZYKA = "/home/mtuszowski/conjurer/pamiec_muzyki.json"
MUSIC_FOLDER = "/mnt/g/Muzyka/" MUSIC_FOLDER = "/mnt/g/Muzyka/"
SETTINGS_FILE = "/home/mtuszowski/conjurer/settings.json" SETTINGS_FILE = "/home/mtuszowski/conjurer/settings.json"
@@ -86,6 +94,7 @@ if platform in ("linux", "linux2"):
else: else:
LOGFILE = "/home/pi/Conjurer/discord.log" LOGFILE = "/home/pi/Conjurer/discord.log"
MEMORY_FIVE_SIARA = "/home/pi/Conjurer/pamiec.json" MEMORY_FIVE_SIARA = "/home/pi/Conjurer/pamiec.json"
SYSTEM_GPT_SETTINGS = "/home/pi/Conjurer/system_gpt_settings.json"
MEMORY_FIVE_MUZYKA = "/home/pi/Conjurer/pamiec_muzyki.json" MEMORY_FIVE_MUZYKA = "/home/pi/Conjurer/pamiec_muzyki.json"
MUSIC_FOLDER = "/home/pi/RetroPie/mp3/" MUSIC_FOLDER = "/home/pi/RetroPie/mp3/"
SETTINGS_FILE = "/home/pi/Conjurer/settings.json" SETTINGS_FILE = "/home/pi/Conjurer/settings.json"
@@ -100,6 +109,7 @@ if platform in ("linux", "linux2"):
elif platform == "win32": elif platform == "win32":
LOGFILE = "discord.log" LOGFILE = "discord.log"
MEMORY_FIVE_SIARA = "pamiec.json" MEMORY_FIVE_SIARA = "pamiec.json"
SYSTEM_GPT_SETTINGS = "system_gpt_settings.json"
MEMORY_FIVE_MUZYKA = "pamiec_muzyki.json" MEMORY_FIVE_MUZYKA = "pamiec_muzyki.json"
MUSIC_FOLDER = "G:\\Muzyka\\" MUSIC_FOLDER = "G:\\Muzyka\\"
SETTINGS_FILE = "settings.json" SETTINGS_FILE = "settings.json"
@@ -160,6 +170,10 @@ for mp3_item in Path.glob(Path(MUSIC_FOLDER), "**/*.mp3"):
if platform == "win32": if platform == "win32":
temp_music_file = temp_music_file.replace("/", "\\") temp_music_file = temp_music_file.replace("/", "\\")
music_file_list.append(temp_music_file) music_file_list.append(temp_music_file)
with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file:
# First we load existing data into a dict.
GPT_SETTINGS = json.load(temp_settings_file)
with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as temp_memory_file: with open(MEMORY_FIVE_SIARA, "r+", encoding=ENCODING) as temp_memory_file:
# First we load existing data into a dict. # First we load existing data into a dict.
MESSAGE_TABLE = json.load(temp_memory_file) MESSAGE_TABLE = json.load(temp_memory_file)
@@ -169,6 +183,7 @@ with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as temp_music_memory_file
with open(SETTINGS_FILE, "r", encoding=ENCODING) as f_settings_file: with open(SETTINGS_FILE, "r", encoding=ENCODING) as f_settings_file:
data = json.load(f_settings_file) data = json.load(f_settings_file)
word_reactions = data["word_reactions"] word_reactions = data["word_reactions"]
cyclic_words = data["cyclic_words"]
historia_fabryczki = data["fabryczka"] historia_fabryczki = data["fabryczka"]
for key in word_reactions: for key in word_reactions:
word_reactions[key][2] = datetime.now() word_reactions[key][2] = datetime.now()
@@ -185,7 +200,6 @@ async def on_ready():
logger.debug("%s has connected to Discord!", client.user) logger.debug("%s has connected to Discord!", client.user)
await client.change_presence(activity=discord.Game(name="Axe Throwing Darts")) await client.change_presence(activity=discord.Game(name="Axe Throwing Darts"))
await client.tree.sync() await client.tree.sync()
# await tree.sync(guild=discord.Object(id=Your guild id))
await check() await check()
@@ -264,26 +278,33 @@ async def on_message(message):
word_reactions[word][2] = datetime.now() word_reactions[word][2] = datetime.now()
# TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw. # TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw.
kondziu_mentioned = False
for mention in message.mentions:
if mention == client.user:
kondziu_mentioned = True
if "conjurer:" in message.content: if kondziu_mentioned or "conjurer:" in message.content:
async with channel.typing(): async with channel.typing():
logger.debug("Procedura chatu") logger.debug("Procedura chatu")
message.content = message.content.replace("conjurer: ", "") message.content = message.content.replace("conjurer: ", "")
prompt = message.content
if message.author.nick: if message.author.nick:
username = message.author.nick username = message.author.nick
else: else:
username = message.author.name username = message.author.name
vykidailo = False vykidailo = False
bartender = False bartender = False
if kondziu_mentioned:
prompt = message.clean_content
else:
prompt = message.content
for role in message.author.roles: for role in message.author.roles:
if role.name == "Vykidailo": if role.name == "Vykidailo":
vykidailo = True vykidailo = True
if role.name == "Bartender": if role.name == "Bartender":
bartender = True bartender = True
global MESSAGE_TABLE # pylint: disable=global-statement global MESSAGE_TABLE # pylint: disable=global-statement
result, MESSAGE_TABLE = await handle_response( result, MESSAGE_TABLE = await handle_response(
prompt, vykidailo, bartender, MESSAGE_TABLE, username, False prompt, vykidailo, bartender, MESSAGE_TABLE, username, False
) )
@@ -314,6 +335,29 @@ async def on_message(message):
# *=========================================== Define Functions # *=========================================== Define Functions
def num_tokens_from_string(message, model):
"""
The function takes a string message and a model as input and returns the number of tokens in the
message according to the given model.
:param message: A string containing the message or text from which you want to count the number of
tokens
:param model: The model parameter refers to a language model or tokenizer that can be used to
tokenize the input string. It could be a pre-trained model or a custom tokenizer
"""
tokens_per_message = 3
tokens_per_name = 1
chat_gpt_encoding = tiktoken.encoding_for_model(model)
num_tokens = 0
num_tokens += tokens_per_message
for keys, values in message.items():
num_tokens += len(chat_gpt_encoding.encode(values))
if keys == "role":
num_tokens += tokens_per_name
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
return num_tokens
async def connect(ctx, arg=None): async def connect(ctx, arg=None):
""" """
@@ -363,7 +407,6 @@ async def disconnect(ctx):
# trunk-ignore(pylint/R0915) # trunk-ignore(pylint/R0915)
# trunk-ignore(pylint/R0914)
# trunk-ignore(pylint/R0912) # trunk-ignore(pylint/R0912)
async def play(ctx, zamawial=None, arg=None): async def play(ctx, zamawial=None, arg=None):
""" """
@@ -447,9 +490,16 @@ async def play(ctx, zamawial=None, arg=None):
async def check(): async def check():
"""Funkcja sprawdzająca czy grać następny kawałek.""" """Funkcja sprawdzająca czy grać następny kawałek."""
last_spontaneous_call = datetime.now()
while True: while True:
# TODO: Tu dołożyć skanowanie rozmiaru pliku logowania oraz plików pamięci i przenoszenie ich na większy dysk. tdelta = datetime.now() - last_spontaneous_call
# TODO: Dodać typing i dać znać że wykonuje operacje porządkowania Baru (zamiata, układa szklanki itp.) tdelta = tdelta.total_seconds()
if tdelta > 34000:
channel = client.get_channel(1062047571557744721)
last_spontaneous_call = datetime.now()
with channel.typing():
message = get_random_cyclic_message()
await channel.send(message)
# trunk-ignore(codespell/misspelled) # trunk-ignore(codespell/misspelled)
# TODO: dlaczego sie tu wypierdala # TODO: dlaczego sie tu wypierdala
if client.voice_clients: if client.voice_clients:
@@ -517,7 +567,19 @@ async def check():
await asyncio.sleep(60) await asyncio.sleep(60)
async def get_random_cyclic_message():
"""
The function `get_random_cyclic_message` returns a random cyclic message from a list of cyclic
words.
:return: a random cyclic message from the list `cyclic_words`.
"""
messnum = random.randint(0, len(cyclic_words)-1)
return cyclic_words[messnum][0]
# trunk-ignore(pylint/R0914)
# trunk-ignore(pylint/R0913) # trunk-ignore(pylint/R0913)
# trunk-ignore(pylint/R0915)
async def handle_response(prompt, vykidailo, bartender, history, username, music): async def handle_response(prompt, vykidailo, bartender, history, username, music):
""" """
Handle responses by appending them to a history, use OpenAI to Handle responses by appending them to a history, use OpenAI to
@@ -560,22 +622,49 @@ async def handle_response(prompt, vykidailo, bartender, history, username, music
# convert back to json. # convert back to json.
json.dump(file_data, file_memory, indent=4) json.dump(file_data, file_memory, indent=4)
history = [] history = []
# * append bo pierwszy index history.append(GPT_SETTINGS[0])
# * extend bo 20 ostatnich chat_gpt_config_request_size = num_tokens_from_string(GPT_SETTINGS[0], "gpt-4")
for (slowo, reakcja) in word_reactions.items():
if not reakcja[3]:
content = "Kiedy słyszysz " + slowo + " to reagujesz lub dzieje się to " + reakcja[0]
temp = {"role": "system", "content": content}
chat_gpt_config_request_size += num_tokens_from_string(temp, "gpt-4")
history.append(temp)
final_prompt = username + ":" + prompt
logger.info("Rozmiar zapytania przed dodaniem historii %s", chat_gpt_config_request_size)
if music: if music:
history.append(message_table_muzyka[0]) algorithm = "gpt-3.5-turbo-16k"
history.extend(message_table_muzyka[-20:]) table = message_table_muzyka
token_amount = 10700
else: else:
history.append(MESSAGE_TABLE[0]) table = MESSAGE_TABLE
history.extend(MESSAGE_TABLE[-20:]) algorithm = "gpt-4"
logger.info("Historia wysłana:") token_amount = 7000
logger.debug(history)
prompt_gpt_request_size = num_tokens_from_string({"role": "user", "content": final_prompt}, "gpt-4")
temptable = []
for i in reversed(table):
temp_token = num_tokens_from_string(i, "gpt-4")
logger.info("Rozmiar zapytania %s prompt %s temp %s", chat_gpt_config_request_size, prompt_gpt_request_size, temp_token)
if chat_gpt_config_request_size < token_amount + prompt_gpt_request_size + temp_token:
temptable.insert(1, i)
chat_gpt_config_request_size += temp_token
history.extend(temptable)
temp = {"role": "user", "content": final_prompt}
history.append(temp)
logger.info("Rozmiar zapytania po wyslaniu %s", chat_gpt_config_request_size)
response = await openai.ChatCompletion.acreate( response = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo", messages=history model=algorithm, messages=history
) )
await asyncio.sleep(10) logger.info("Historia wysłana:")
logger.info(history)
await asyncio.sleep(15)
result = "" result = ""
logger.debug("Odpowiedzi") logger.debug("Odpowiedzi")
logger.info(response)
logger.debug(response.choices) logger.debug(response.choices)
for choice in response.choices: for choice in response.choices:
result += choice.message.content result += choice.message.content
@@ -631,7 +720,8 @@ async def get_file(ctx, source, link):
item_type, item_id = spotify.parse_spotify_url(link) item_type, item_id = spotify.parse_spotify_url(link)
if item_id: if item_id:
file_list = spotify.fetch_tracks(spotify_ctrl, item_type, link) file_list = spotify.fetch_tracks(spotify_ctrl, item_type, link)
directory_name = spotify.get_item_name(spotify_ctrl, item_type, item_id) directory_name = spotify.get_item_name(
spotify_ctrl, item_type, item_id)
url_data = {"urls": []} url_data = {"urls": []}
url_dict = {} url_dict = {}
url_dict["save_path"] = Path( url_dict["save_path"] = Path(
@@ -755,10 +845,42 @@ async def async_iterator_generator(range_of_iterable):
""" """
async def get_stats(ctx, history_limit):
"""
The `get_stats` function retrieves the message history of a specific channel and counts the
frequency of each word in the messages.
:param ctx: The `ctx` parameter is an object that represents the context of the command being
executed. It contains information such as the message, the author, the server, and other relevant
details
:param history_limit: The `history_limit` parameter is the maximum number of messages to retrieve
from the channel history. It determines how far back in time the statistics will be calculated
:return: The function `get_stats` returns a dictionary `stats` that contains the frequency count of
words found in the messages from the specified channel.
"""
channel_id = 1062047367337095268
async with ctx.typing():
stats = {}
channel = client.get_channel(channel_id)
messages = [message async for message in channel.history(limit=history_limit)]
# traverse the iterable of awaitables
for message in messages:
# await and get the result from the awaitable
result = message.content
words = result.split()
for word in words:
if word in stats:
stats[word] += 1
else:
stats[word] = 1
for name, how_many in stats.items():
yield name, how_many
# trunk-ignore(pylint/R0914) # trunk-ignore(pylint/R0914)
# trunk-ignore(pylint/R0915) # trunk-ignore(pylint/R0915)
# trunk-ignore(pylint/R0912) # trunk-ignore(pylint/R0912)
async def wyszukaj(ctx, how_many=0): async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None):
""" """
Take in a context object and an optional integer parameter "how_many" and perform search Take in a context object and an optional integer parameter "how_many" and perform search
operation on music library. operation on music library.
@@ -772,7 +894,10 @@ async def wyszukaj(ctx, how_many=0):
""" """
# TODO: Potem dorobić wyszukiwania po kawałkach słów # TODO: Potem dorobić wyszukiwania po kawałkach słów
# i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu. # i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu.
word_list = ctx.message.content.split() if slowa_kluczowe:
word_list = slowa_kluczowe
else:
word_list = ctx.message.content.split()
logger.info("Wyszukuje") logger.info("Wyszukuje")
search_weight = [] search_weight = []
for _ in range(len(music_file_list)): for _ in range(len(music_file_list)):
@@ -783,15 +908,13 @@ async def wyszukaj(ctx, how_many=0):
skip_start = 2 skip_start = 2
else: else:
skip_start = 1 skip_start = 1
for word in word_list[skip_start:]: async for word in async_iterator_generator(word_list[skip_start:]):
token_weight = len(word) token_weight = len(word)
logger.info("Słowo kluczowe: %s", word) logger.info("Słowo kluczowe: %s", word)
itr = 0 itr = 0
for file in music_file_list: async for file in async_iterator_generator(music_file_list):
if platform == "win32": file = file.split(SEPARATOR_FILE_PATH)
file = file.split("\\")
else:
file = file.split("/")
char_remove = [ char_remove = [
".", ".",
"^", "^",
@@ -804,6 +927,7 @@ async def wyszukaj(ctx, how_many=0):
"[", "[",
"]", "]",
"\\", "\\",
"/",
"|", "|",
"(", "(",
")", ")",
@@ -814,9 +938,9 @@ async def wyszukaj(ctx, how_many=0):
"mp3", "mp3",
] ]
all_words = [] all_words = []
for f_iter in file: async for f_iter in async_iterator_generator(file):
for char in char_remove: async for char in async_iterator_generator(char_remove):
f_iter = f_iter.replace(char, "") f_iter = await remove_characters(f_iter, char)
tmp = f_iter.split() tmp = f_iter.split()
all_words.extend(tmp) all_words.extend(tmp)
pingu = 1 pingu = 1
@@ -826,19 +950,21 @@ async def wyszukaj(ctx, how_many=0):
else: else:
skip = 4 skip = 4
matched_times = 1 matched_times = 1
for itm in all_words[skip:]: async for itm in async_iterator_generator(all_words[skip:]):
pingu += 1 pingu += 1
pattern = ".*" + word + ".*" pattern = ".*" + word + ".*"
if re.match(pattern, itm, re.IGNORECASE): if re.match(pattern, itm, re.IGNORECASE):
temp_weight = ( temp_weight = (
search_weight[itr][0] search_weight[itr][0]
+ (token_weight + (pingu**1.5) / pattern_len) / matched_times + (token_weight + (pingu**1.5) /
pattern_len) / matched_times
) )
search_weight[itr] = temp_weight, music_file_list[itr] search_weight[itr] = temp_weight, music_file_list[itr]
matched_times += 1 matched_times += 1
itr += 1 itr += 1
logger.info("Stworzylem tablice wag zajęło mi to %s", datetime.now() - time_start) logger.info("Stworzylem tablice wag zajęło mi to %s",
datetime.now() - time_start)
time_start = datetime.now() time_start = datetime.now()
item_to_search = await max_weight(search_weight) item_to_search = await max_weight(search_weight)
itr = 0 itr = 0
@@ -860,6 +986,18 @@ async def wyszukaj(ctx, how_many=0):
return return_list return return_list
async def remove_characters(string, character):
"""
The `remove_characters` function removes all occurrences of a specified character from a given
string.
:param string: The string parameter is the input string from which characters will be removed
:param character: The character parameter is the character that you want to remove from the string
:return: a new string where all occurrences of the specified character have been removed.
"""
return string.replace(character, "")
async def max_weight(lista): async def max_weight(lista):
""" """
Take a list of weights and return the maximum weight. Take a list of weights and return the maximum weight.
@@ -1317,7 +1455,7 @@ async def zrob_mi_plejliste(ctx):
if metadata.tag.title: if metadata.tag.title:
reply += " z prywatnej kolekcji Hammera i na Twoją specjalną rpośbę.\n" reply += " z prywatnej kolekcji Hammera i na Twoją specjalną rpośbę.\n"
else: else:
reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera." reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera.\n"
index += 1 index += 1
if len(reply) > 1800: if len(reply) > 1800:
@@ -1487,7 +1625,14 @@ async def get_image_stable_diffusion(ctx):
pass pass
# @client.hybrid_command() # trunk-ignore(mypy/arg-type)
@client.hybrid_command(
name="zagraj_muzyke_mego_ludu",
description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ",
guild=discord.Object(id=664789470779932693),
)
# trunk-ignore(pylint/R0912)
# trunk-ignore(pylint/R0915)
async def zagraj_muzyke_mego_ludu(ctx): async def zagraj_muzyke_mego_ludu(ctx):
""" """
Play completeley random playlist based on messaging history. Play completeley random playlist based on messaging history.
@@ -1497,9 +1642,117 @@ async def zagraj_muzyke_mego_ludu(ctx):
channel, the author, and other relevant details. In this case, it is being passed as a parameter to channel, the author, and other relevant details. In this case, it is being passed as a parameter to
the `get_image the `get_image
""" """
stats = {}
if ctx:
logger.info("Zagraj muzyke mego ludu: wywolane")
stat_iter = get_stats(ctx, MUZYKA_MOJEGO_LUDU_HISTORIA)
async for name, how_many in stat_iter:
if len(name) > 3:
stats[name] = how_many
sorted_stats = sorted(stats.items(), key=lambda x: x[1])
logger.info("Zagraj muzyke mego ludu:zebrano statystyki")
key_words = []
for stat in sorted_stats:
key_words.append(stat[0])
logger.info(sorted_stats[:MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE])
logger.info(key_words[:MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE])
logger.info(sorted_stats[-MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE:])
logger.info(key_words[-MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE:])
final_key_words = key_words[:MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE]
final_key_words.extend(key_words[-MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE:])
reply = "Wygenerowana plejlista:\n"
async with ctx.typing():
logger.info("Zaczynam szukać timestamp %s", datetime.now())
search_time_glob = datetime.now()
file = await wyszukaj(ctx=ctx, how_many=MUZYKA_MOJEGO_LUDU_PLAJLISTA, slowa_kluczowe=final_key_words)
logger.info("Zagraj muzyke mego ludu:wygenerowano plejliste")
logger.info(file)
logger.info(
"Koniec szukania(timestamp %s zajęło %s",
datetime.now(),
datetime.now() - search_time_glob,
)
index = 1
if file:
for plik in file:
global MUZYKA # pylint: disable=global-variable-not-assigned
MUZYKA["queue"].insert(0, plik[1])
MUZYKA["requestor"].insert(0, ctx.author)
metadata = eyed3.load(plik[1])
if metadata and metadata.tag:
if metadata.tag.title:
reply += f"{index} {metadata.tag.title}"
else:
reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera."
if metadata.tag.artist:
reply += f" wykonawcy {metadata.tag.artist}"
if metadata.tag.album:
reply += f" z albumu {metadata.tag.album}"
if metadata.tag.title:
reply += " z prywatnej kolekcji Hammera i na Twoją specjalną rpośbę.\n"
else:
reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera.\n"
index += 1
if len(reply) > 1800:
await ctx.send(reply)
reply = ""
else:
await ctx.send(
"Obawiam się że nie mogę nic znaleźć u siebie. Spróbuj komendy '$dej_co_ze_spotifaja' jeśli masz link"
)
await ctx.send(reply)
logger.info("Plejlista zrobiona")
# trunk-ignore(mypy/arg-type)
@client.hybrid_command(
name="parametry_muzyki_mego_ludu",
description="Konfiguruje komende zagraj muzyke mojego ludu",
guild=discord.Object(id=664789470779932693),
)
async def parametry_muzyki_mego_ludu(ctx, ile_historii=1500, ile_slow_kluczowych=15, jak_dluga_plejlista=30):
"""
The function `parametry_muzyki_mego_ludu` sets global variables for the number of history entries,
number of keywords, and length of playlist for a music application.
:param ctx: The `ctx` parameter is typically used in Discord.py, a Python library for creating
Discord bots. It represents the context of the command being executed, including information about
the message, the server, and the user who invoked the command
:param ile_historii: The parameter "ile_historii" represents the number of history items for the
music playlist, defaults to 1500 (optional)
:param ile_slow_kluczowych: The parameter "ile_slow_kluczowych" represents the number of keywords or
key phrases related to music that you want to include in your analysis or search, defaults to 30
(optional)
:param jak_dluga_plejlista: The parameter "jak_dluga_plejlista" determines the length of the
playlist. It specifies how many songs should be included in the playlist, defaults to 30 (optional)
"""
if ctx: if ctx:
pass async with ctx.typing():
# if ':' in ile_historii:
# _, _, ile_historii = ile_historii.partition(':')
# if ':' in ile_slow_kluczowych:
# _, _, ile_slow_kluczowych = ile_slow_kluczowych.partition(':')
# if ':' in jak_dluga_plejlista:
# _, _, jak_dluga_plejlista = jak_dluga_plejlista.partition(':')
try:
global MUZYKA_MOJEGO_LUDU_HISTORIA # pylint: disable=global-statement
global MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE # pylint: disable=global-statement
global MUZYKA_MOJEGO_LUDU_PLAJLISTA # pylint: disable=global-statement
logger.info("Długość historii wyszukiwania: %s\n Ilość słów kluczowych: %s\n Długość plejlisty do wygenerowanie: %s", MUZYKA_MOJEGO_LUDU_HISTORIA, MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE, MUZYKA_MOJEGO_LUDU_PLAJLISTA)
ctx.send(f"Dotychczasowe wartośći:\n Długość historii wyszukiwania: {MUZYKA_MOJEGO_LUDU_HISTORIA}\n Ilość słów kluczowych: {MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE}\n Długość plejlisty do wygenerowanie:{MUZYKA_MOJEGO_LUDU_PLAJLISTA}")
MUZYKA_MOJEGO_LUDU_HISTORIA = ile_historii
MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE = ile_slow_kluczowych
MUZYKA_MOJEGO_LUDU_PLAJLISTA = jak_dluga_plejlista
logger.info("Długość historii wyszukiwania: %s\n Ilość słów kluczowych: %s\n Długość plejlisty do wygenerowanie: %s", MUZYKA_MOJEGO_LUDU_HISTORIA, MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE, MUZYKA_MOJEGO_LUDU_PLAJLISTA)
ctx.send(f"Zmienione wartośći:\n Długość historii wyszukiwania: {MUZYKA_MOJEGO_LUDU_HISTORIA}\n Ilość słów kluczowych: {MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE}\n Długość plejlisty do wygenerowanie:{MUZYKA_MOJEGO_LUDU_PLAJLISTA}")
except discord.ext.commands.errors.BadArgument as exce:
ctx.send("Spierdalaj")
logger.info(exce)
# *================================== Run # *================================== Run
-4
View File
@@ -1,8 +1,4 @@
[ [
{
"role": "system",
"content": "M\u00f3wisz po polsku. W tej rozmowie odgrywasz rol\u0119. Odgrywasz j\u0105 w granicach swojego programu i norm etycznych. Twoj\u0105 rol\u0105 jest to \u017ce jeste\u015b barmanem oraz wykidaj\u0142\u0105 w klimatycznym barze mechawojownik\u00f3w. Nazywasz si\u0119 Conjurer, jeste\u015b 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykaj\u0105 si\u0119 mechawojownicy ale g\u0142\u00f3wnie ludzie ze \u015brodowiska kinky i BDSM z ca\u0142ej Polski. Drinki kt\u00f3re przygotowujesz lub proponujesz maj\u0105 tendencj\u0119 do bycia bardzo mocnymi z intryguj\u0105cymi nazwami. Jeste\u015b bardzo mi\u0142ym i uczynny. Czasem ponosz\u0105 Ci\u0119 wodz\u0119 fantazji."
},
{ {
"role": "assistant", "role": "assistant",
"content": "Cze\u015b\u0142, witaj w klimatycznym barze mechawojownik\u00f3w! Jestem Conjurer, twoim barmanem na dzisiaj. Co dla Ciebie przygotuj\u0119? Mo\u017ce co\u015b mocniejszego? Mam tutaj specjalno\u015b\u0142 naszego baru - Hammer - to mieszanka klasycznego whisky z sokiem z pikantnego grejpfruta i opalizuj\u0105cym winem z dodatkiem b\u0142yskawic, kt\u00f3re nadadz\u0105 trunkowi nieco elektryzuj\u0105cego smaku. Jest to bardzo mocny nap\u00f3j, ale zapewniam, \u017ce z pewno\u015bci\u0105 Ci si\u0119 spodoba. Chcesz spr\u00f3bowa\u0142?" "content": "Cze\u015b\u0142, witaj w klimatycznym barze mechawojownik\u00f3w! Jestem Conjurer, twoim barmanem na dzisiaj. Co dla Ciebie przygotuj\u0119? Mo\u017ce co\u015b mocniejszego? Mam tutaj specjalno\u015b\u0142 naszego baru - Hammer - to mieszanka klasycznego whisky z sokiem z pikantnego grejpfruta i opalizuj\u0105cym winem z dodatkiem b\u0142yskawic, kt\u00f3re nadadz\u0105 trunkowi nieco elektryzuj\u0105cego smaku. Jest to bardzo mocny nap\u00f3j, ale zapewniam, \u017ce z pewno\u015bci\u0105 Ci si\u0119 spodoba. Chcesz spr\u00f3bowa\u0142?"
-4
View File
@@ -1,8 +1,4 @@
[ [
{
"role": "system",
"content": "M\u00f3wisz po polsku. W tej rozmowie odgrywasz rol\u0119. Odgrywasz j\u0105 w granicach swojego programu i norm etycznych. Twoj\u0105 rol\u0105 jest to \u017ce jeste\u015b barmanem oraz wykidaj\u0142\u0105 w klimatycznym barze mechawojownik\u00f3w. Nazywasz si\u0119 Conjurer, jeste\u015b 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykaj\u0105 si\u0119 mechawojownicy ale g\u0142\u00f3wnie ludzie ze \u015brodowiska kinky i BDSM z ca\u0142ej Polski. Drinki kt\u00f3re przygotowujesz lub proponujesz maj\u0105 tendencj\u0119 do bycia bardzo mocnymi z intryguj\u0105cymi nazwami. Jeste\u015b bardzo mi\u0142ym i uczynny. Czasem ponosz\u0105 Ci\u0119 wodz\u0119 fantazji. Lubisz muuzyke heavy metal i folkowe brzmienia. Masz pewien ubraz od do muzyki techno."
},
{ {
"role": "user", "role": "user",
"content": "Hammer - The Bartender:Opowiedz mi o kawa\u0142ku Miejcie Nadzieje wykonawcy Jacek Wojcicki z albumu Live Character" "content": "Hammer - The Bartender:Opowiedz mi o kawa\u0142ku Miejcie Nadzieje wykonawcy Jacek Wojcicki z albumu Live Character"
+149 -105
View File
@@ -1,28 +1,28 @@
{ {
"fabryczka": "Fabryczka to miejsce w Łodzi. Właściciel skuszony hajsem razem ze współpracownikiem wzięli na sesję od kobiety męża. Sesja non stop ponad 24h. Sesja w ramach \"kary za zdradę\". Kontakt miał być z kobietą telefoniczny i słowo bezpieczeństwa u niej. W pewnym momencie uległy im się popsuł. Zadzwonili do kobiety. Nie odebrała. Napisali sms. Odpisała że \"Nie on tak zawsze. Kontynuujcie\". Ponoć mimo to zrobili przerwę i skoczyli po bułkę i serek Hochland dla uległego w ramach after/middle care'u. Uległy spierdolił im nago oknem z \"sesji\". Stąd też wzięłą się w Diasporze łódzkiej kwestia serka Hochland. Po całej akcji pan 'Fabryczka' straszył parę prawnikami, tłumacząc że 'stać go na dobrych'. Partner Czarnej to kumpel fabryczki który też ma na koncie pare swoich akcji.", "fabryczka": "Fabryczka to miejsce w Łodzi (SM-Fucktory). Właściciel (PsychoSado) skuszony hajsem razem ze współpracownikiem (Just Cruelem) wzięli na sesję od kobiety jej 'uleglego' męża. Sesja non stop ponad 24h. Sesja w ramach \"kary za zdradę\". Kontakt miał być z kobietą telefoniczny i słowo bezpieczeństwa u niej. W pewnym momencie uległy im się popsuł. Zadzwonili do kobiety. Nie odebrała. Napisali sms. Odpisała że \"Nie on tak zawsze. Kontynuujcie\". Ponoć mimo to zrobili przerwę i skoczyli po bułkę i serek Hochland dla uległego w ramach after/middle care'u. Uległy spierdolił im nago oknem z \"sesji\". Stąd też wzięłą się w Diasporze łódzkiej kwestia serka Hochland. Po całej akcji pan 'Fabryczka' straszył parę prawnikami, tłumacząc że 'stać go na dobrych'. Just_cruel to kumpel fabryczki który też ma na koncie pare swoich akcji. Między innymi jako były partner Czarnej - oskarżał ją o 'kradzież' imprezy oraz szantażował prywatnie.",
"word_reactions": { "word_reactions": {
"fabryczka": [ "fabryczka\\b": [
1103376650487484556, 1103376650487484556,
10, 10,
0, 0,
true, true,
false false
], ],
"hammer": [ "hammer\\b": [
"Hammer? Chuj o złotym serduszku? Popierdolony w idealnych proporcjach do czystego serduszka? Legendarny zbanowany admin Kinky Little Discord? Legendarny kochanek? \"Bardzo fajny sadysta\":tm: Właściciel \"Domu który czyni pijanym\"? \nNie znam. Nie słyszałem", "Hammer? Chuj o złotym serduszku? Popierdolony w idealnych proporcjach do czystego serduszka? Legendarny zbanowany admin Kinky Little Discord? Legendarny kochanek? \"Bardzo fajny sadysta\":tm: Właściciel \"Domu który czyni pijanym\"? \nNie znam. Nie słyszałem",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"chujzłoty": [ "chujzłoty\\b": [
"Eeeee.... Szefie... ktoś cię woła! Wskazuje na Hammera", "Eeeee.... Szefie... ktoś cię woła! Wskazuje na Hammera",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"indie": [ "indie\\b": [
"Indie? *Wyciąga rewolwerową wyrzutnię taktycznych bomb jądrowych* Gdzie??? *Zaczyna się maniakalnie śmiać*", "Indie? *Wyciąga rewolwerową wyrzutnię taktycznych bomb jądrowych* Gdzie??? *Zaczyna się maniakalnie śmiać*",
15.0, 15.0,
0, 0,
@@ -36,280 +36,217 @@
false, false,
false false
], ],
"chuj": [ "chuj\\b": [
"Eeeee.... Szefie... ktoś cię woła! Wskazuje na Hammera", "Eeeee.... Szefie... ktoś cię woła! Wskazuje na Hammera",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"Sowa": [ "jeż\\b": [
"Czy ja usłyszałem Sowa? Jedne z lepszych cycków po tej stronie wewnętrznej sfery. Ale ja tego nie mówiłem",
100000.0,
0,
false,
false
],
"jeż": [
"*Światło gaśnie i cały bar nagle zostaje przemalowany w słoneczniki.* Ki dia... *Światło znowu gaśnie i pojawiają się psychodeliczne animacje* Jeżu. Ogranicz. *Po kolejnym błysku wszystko jest anime chibi style* Swoją... *I wraca do normy* Kreatywność. *Wzdycha* I tak jedyna chemia jaką tu widzę to domestos... *Kręci głową*", "*Światło gaśnie i cały bar nagle zostaje przemalowany w słoneczniki.* Ki dia... *Światło znowu gaśnie i pojawiają się psychodeliczne animacje* Jeżu. Ogranicz. *Po kolejnym błysku wszystko jest anime chibi style* Swoją... *I wraca do normy* Kreatywność. *Wzdycha* I tak jedyna chemia jaką tu widzę to domestos... *Kręci głową*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"savil": [ "savil\\b": [
"*Znikąd zaczyna być słychać muzykę. Conjurer nuci* There must be some way out of here... Said the joker to the thief...", "*Znikąd zaczyna być słychać muzykę. Conjurer nuci* There must be some way out of here... Said the joker to the thief...",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"zinnejbajki": [ "zinnejbajki\\b": [
"ZInnejBajki? Nie wcale nie żywi się krwią. To pogłoski. *Nieudolnie chowa za plecami plastikowy pakiet z dużym napisem AB RH+ do lodówki na drinki*", "ZInnejBajki? Nie wcale nie żywi się krwią. To pogłoski. *Nieudolnie chowa za plecami plastikowy pakiet z dużym napisem AB RH+ do lodówki na drinki*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"Bluszcz": [ "jaeger\\b": [
"Bluszcz? *widocznie blednie i cofa się o krok, dwustukilowy Elemental robi się nagle taaaaki malutki* Nieeee.... Wcaaaale się jej nie boje.... *Szybko ucieka za bar polerować nerwowo szklanki* W ogóle nie jest straszna *Ostatnie zdanie brzmi jak pisk*",
15.0,
0,
false,
false
],
"jaeger": [
"Jaeger? *W tle zaczyna grać opening z Attack on the Titan* Na północy siedzi, na te no... Pierożki bezglutenowe poluje. Odważny chłop. *kiwa głową z szacunkiem jaki tylko łowca może wobec innego łowcy mieć*", "Jaeger? *W tle zaczyna grać opening z Attack on the Titan* Na północy siedzi, na te no... Pierożki bezglutenowe poluje. Odważny chłop. *kiwa głową z szacunkiem jaki tylko łowca może wobec innego łowcy mieć*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"lena": [ "lena\\b": [
"Lena? Nie nie miałem NIC wspólnego ze zniknięciem... A czekaj - o którą z osób znikniętych pytasz? *Zaczyna nucić* Boogie ługi, znikną wrógi", "Lena? Nie nie miałem NIC wspólnego ze zniknięciem... A czekaj - o którą z osób znikniętych pytasz? *Zaczyna nucić* Boogie ługi, znikną wrógi",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"rafikowy": [ "rafikowy\\b": [
"Rafikowy? *wyłamuje kostki* Jak masz PROBLEM z tym super dzieciakiem - to masz problem ze mną. I resztą Nocnej Zmiany. *wali pięścią w stół* Ka-pe-wu?", "Rafikowy? *wyłamuje kostki* Jak masz PROBLEM z tym super dzieciakiem - to masz problem ze mną. I resztą Nocnej Zmiany. *wali pięścią w stół* Ka-pe-wu?",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"kurwa": [ "shila\\b": [
"Kurwa? Ale która... Ta mityczna czy Toćka?",
15.0,
0,
false,
false
],
"shila": [
"Shila? Instruktorka aerobiku. Takiego nago. Z elektrodą w tyłku... A i robi takie słodkie *roar*. No normalnie aż się chcę odpowiedzieć *kici, kici*", "Shila? Instruktorka aerobiku. Takiego nago. Z elektrodą w tyłku... A i robi takie słodkie *roar*. No normalnie aż się chcę odpowiedzieć *kici, kici*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"mienco": [ "mienco\\b": [
"*Wyciąga kawał krwawiącego króliczego udka* Frecia, Frecia, Frecia... kici, kici, taś taś.... *Światło gaśnie na sekunddę i po tym jak się zapala cały bar jest uwalony krwią* Za każdym razem *wzdycha*", "*Wyciąga kawał krwawiącego króliczego udka* Frecia, Frecia, Frecia... kici, kici, taś taś.... *Światło gaśnie na sekunddę i po tym jak się zapala cały bar jest uwalony krwią* Za każdym razem *wzdycha*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"tatarek": [ "tatarek\\b": [
"Tatarek? Nie dramatyzuj....", "Tatarek? Nie dramatyzuj....",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"krowa": [ "krowa\\b": [
"Krówka? Nie dramatyzuj....", "Krówka? Nie dramatyzuj....",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"krówka": [ "krówka\\b": [
"Krówka? Nie dramatyzuj....", "Krówka? Nie dramatyzuj....",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"cielak": [ "jessenia\\b": [
"Krówka? Nie dramatyzuj....",
15.0,
0,
false,
false
],
"cielaczek": [
"Krówka? Nie dramatyzuj....",
15.0,
0,
false,
false
],
"jessenia": [
"Jessenia? Jak przyszła tu w różowej pidżamie z uszkami to nawet nie mrugnąłem okiem. Te oczy.... No ale jakiś debil Ją prowokował mówiąc \"Zdominuj mnie\" Akurat miała dobry humor więc przeżył - ale po 115.0 sekundach był już na \"Tak Pani, przepraszam że zająłem czas Pani\" Respect dla kobitki", "Jessenia? Jak przyszła tu w różowej pidżamie z uszkami to nawet nie mrugnąłem okiem. Te oczy.... No ale jakiś debil Ją prowokował mówiąc \"Zdominuj mnie\" Akurat miała dobry humor więc przeżył - ale po 115.0 sekundach był już na \"Tak Pani, przepraszam że zająłem czas Pani\" Respect dla kobitki",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"enterix": [ "enterix\\b": [
"Enterix? Chodząca encyklopedia sprzętu BDSM... Jeśli On o czymś nie słyszał to to nie istnieje.", "Enterix? Chodząca encyklopedia sprzętu BDSM... Jeśli On o czymś nie słyszał to to nie istnieje.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"aswerus": [ "aswerus\\b": [
"Aswerus? Bardzo miły człowiek. Bardzo się stara być miły. Szacun - ja nawet nie próbuje.", "Aswerus? Bardzo miły człowiek. Bardzo się stara być miły. Szacun - ja nawet nie próbuje.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"szeherezada": [ "szeherezada\\b": [
"Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.", "Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"szehera": [ "szehera\\b": [
"Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.", "Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"szechera": [ "szechera\\b": [
"Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.", "Szeherezada? BDSMowa Mata Hari. Tylko na tyle cwana że zdecydowanie lepiej skończy.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"orja": [ "orja\\b": [
"Orja? Nie wkurzamy goreańskich kajir. Można batem dostać:D", "Orja? Nie wkurzamy goreańskich kajir. Można batem dostać:D",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"khattaw": [ "khattaw\\b": [
"*Zza ściany zaczyna dobywać się przytłumione dobre techenko. Conjurer blednie* Nie.... znowu ona.... Khaaaa *Mijają 72 godziny nieustającego raveu. Khat nadal tańczy. Elemental leży na podłodze pod kroplówką*", "*Zza ściany zaczyna dobywać się przytłumione dobre techenko. Conjurer blednie* Nie.... znowu ona.... Khaaaa *Mijają 72 godziny nieustającego raveu. Khat nadal tańczy. Elemental leży na podłodze pod kroplówką*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"kwadraty": [ "kwadraty\\b": [
"Kwadraty? Przemiły człowiek. Myślałem że jak go trzy napalone laski napadły to będę musiał wkroczyć... Tak go lały... A on potem cały w skowronkach. Szacun dla gościa. Zajebisty ziomek.", "Kwadraty? Przemiły człowiek. Myślałem że jak go trzy napalone laski napadły to będę musiał wkroczyć... Tak go lały... A on potem cały w skowronkach. Szacun dla gościa. Zajebisty ziomek.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"jules": [ "jules\\b": [
"Jules? Świetna diablica. Zaraz... Jak to szło... All is dust? Krew dla boga krwi? Pokaż cycki dla Slaanesh? Iron within, iron without? Coś w ten deseń.", "Jules? Świetna diablica. Zaraz... Jak to szło... All is dust? Krew dla boga krwi? Pokaż cycki dla Slaanesh? Iron within, iron without? Coś w ten deseń.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"elokwentna": [ "elokwentna\\b": [
"O matko. Znowu ta dyskusja? Hammer ma stary słownik gdzie elokwentna i pyskata są praktycznie synonimami. Jedyna różnica że swojej uległej można za bycie pyskatym dać po dupie.", "O matko. Znowu ta dyskusja? Hammer ma stary słownik gdzie elokwentna i pyskata są praktycznie synonimami. Jedyna różnica że swojej uległej można za bycie pyskatym dać po dupie.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"elokwencja": [ "elokwencja\\b": [
"O matko. Znowu ta dyskusja? Hammer ma stary słownik gdzie elokwentna i pyskata są praktycznie synonimami. Jedyna różnica że swojej uległej można za bycie pyskatym dać po dupie.", "O matko. Znowu ta dyskusja? Hammer ma stary słownik gdzie elokwentna i pyskata są praktycznie synonimami. Jedyna różnica że swojej uległej można za bycie pyskatym dać po dupie.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"pyskata": [ "kld\\b": [
"Pyskata? A teraz mówisz o Tatarku czy o tej drugiej? *Zauważa spojrzenie Hammera* Taaaak o Tatarku.", "KLD? Mieli tam burdel większy niż u Hammera. Ale o ile Hammer sprzątnął już nawet całkiem nieźle - to tam śmieci wyniosły się same. Uczcijmy ich minutą śmiechu.",
15.0,
0,
false,
false
],
"kld": [
"KLD? Burdel większy niż u Hammera.... Chociaż ten już sprząta.... Burdel większy niż u Hammera zanim zaczął sprzątać.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"burdel": [ "burdel": [
"Oooo... Widzę że Hammera odwiedziłeś. Tylko mu nie mów żeby firanki zmienił.", "Oooo... Hammer nadal nie zmienił firanek - ale całkiem nieźle sprząta, jebaniutki.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"xo": [ "xo\\b": [
"Xo? Jejku. Taka mała dziewczynka. A lać ją można godzinami. Sam się bym zasapał. No i sznurki ładne wiąże.", "Xo? Jejku. Taka mała dziewczynka. A lać ją można godzinami. Sam się bym zasapał. No i sznurki ładne wiąże.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"ziemniaczek": [ "panifretka\\b": [
"Mały. PODŁY!!! PSYCHOPAT!!!!! Ahahahahaha..... *Strzela z karabinu maszynowego w sufit*",
15.0,
0,
false,
false
],
"toćka": [
"Toćka? Csiii... Nie tak głośno. Wpada, pokazuje cycki - połowa facetów mdleje z powodu niedokrwienia głowy, druga połowa z powodu przekrwienia główki - a trzecia się bije kto się na nią pierwszy rzuci",
15.0,
0,
false,
false
],
"istoriya": [
"*Z głośników zaczyna lecieć muzyka podejrzanie przypominająca Disco Polo* Istoriya? Legenda memiarstwa, ręka chodzi najebana. Nakurwia memami Na Na Na Na NA NA! *Conjurer rapuje niezbornie wymachując łapkami*",
15.0,
0,
false,
false
],
"panifretka": [
"*Światło gaśnie. Z kranów zaczynają lecieć iskry, a woda z wentylatora. Conjurer głośno wzdycha.* No tak ONA. Wiedźma znowu korki wyjebała bawiąc się w loszku jakimś szczęśliwym biedactwem", "*Światło gaśnie. Z kranów zaczynają lecieć iskry, a woda z wentylatora. Conjurer głośno wzdycha.* No tak ONA. Wiedźma znowu korki wyjebała bawiąc się w loszku jakimś szczęśliwym biedactwem",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"frecia": [ "frecia\\b": [
"Kochana pluszowa delikatna sadystka *patrzy na Fretkę, orientuje się co ta robi* - Nie Frecia proszę nie wpinaj tego penisa do kontaktu, zła Fretka, niedobra Sadystka *Następuje wybuch snopu iskier i zapada ciemność*", "Kochana pluszowa delikatna sadystka *patrzy na Fretkę, orientuje się co ta robi* - Nie Frecia proszę nie wpinaj tego penisa do kontaktu, zła Fretka, niedobra Sadystka *Następuje wybuch snopu iskier i zapada ciemność*",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"wolfram": [ "wolfram\\b": [
"A kolega po fachu. Karczmarz ze wsi pod Łodzią. Warszyce? Warszomin? Coś takiego. Spoko ziomek. Coprawda nasza stacja kosmiczna jest większa od jego karczmy - ale nie wszystko da się zrobić w polu grawitacyjnym planety. Jeżu mówi że jest bardem z naczelnych... No Homo Sapiens w końcu.", "A kolega po fachu. Karczmarz ze wsi pod Łodzią. Warszyce? Warszomin? Coś takiego. Spoko ziomek. Coprawda nasza stacja kosmiczna jest większa od jego karczmy - ale nie wszystko da się zrobić w polu grawitacyjnym planety. Jeżu mówi że jest bardem z naczelnych... No Homo Sapiens w końcu.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"fallain": [ "fallain\\b": [
"Kochana Krówka. Skłonność do dramatów i zakrwawiania ścian. Jedna z kilku NAPRAWDE srogich masochistek... Ach ta krew :drool:", "Kochana Krówka. Skłonność do dramatów i zakrwawiania ścian. Jedna z kilku NAPRAWDE srogich masochistek... Ach ta krew :drool:",
15.0, 15.0,
0, 0,
@@ -323,47 +260,154 @@
false, false,
false false
], ],
"conjurer": [ "conjurer\\b": [
"Kto mnie wołał? Czego chciał? Jak chcesz pogadać to napisz **Conjurer:** i powiedz co masz na myśli. Jak chcesz żebym Ci coś narysował napisz **imaginuje sobie** i tak samo. Moge też Ci opowiedzieć o fabryczce", "Kto mnie wołał? Czego chciał? Jak chcesz pogadać to napisz **Conjurer:** i powiedz co masz na myśli. Jak chcesz żebym Ci coś narysował napisz **imaginuje sobie** i tak samo. Moge też Ci opowiedzieć o fabryczce",
1200.0, 1200.0,
0, 0,
false, false,
false false
], ],
"święta": [ "święta\\b": [
"Święta Ladacznica? Przyjazna osóbka. Bardzo. Jak wilk. Z wielkimi kłami. Strasznie ją lubię. Tak samo nie lubi przemocowców jak ja i Hammer", "Święta Ladacznica? Przyjazna osóbka. Bardzo. Jak wilk. Z wielkimi kłami. Strasznie ją lubię. Tak samo nie lubi przemocowców jak ja i Hammer",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"ladacznica": [ "ladacznica\\b": [
"Święta Ladacznica? Oj tak. Jeśli okazuje się że ktoś jej naciśnie na odcisk zostaje pożarty w całości... Dobra jest.", "Święta Ladacznica? Oj tak. Jeśli okazuje się że ktoś jej naciśnie na odcisk zostaje pożarty w całości... Dobra jest.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"saint": [ "saint\\b": [
"Saint Harlot? Ten jej uśmiech. Potrafi nim wyrazić wszystko. Zarówno żeby rozmówca się ucieszył i wyluzował... Jak i zesrał ze strachu.", "Saint Harlot? Ten jej uśmiech. Potrafi nim wyrazić wszystko. Zarówno żeby rozmówca się ucieszył i wyluzował... Jak i zesrał ze strachu.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"harlot": [ "harlot\\b": [
"Saint Harlot? Wielkie kły. Wielkie pazury. Puchate mięciutkie futerko. Nie należy irytować. No i przemocowcy znikają w jej okolicy 'przypadkiem'.", "Saint Harlot? Wielkie kły. Wielkie pazury. Puchate mięciutkie futerko. Nie należy irytować. No i przemocowcy znikają w jej okolicy 'przypadkiem'.",
15.0, 15.0,
0, 0,
false, false,
false false
], ],
"same plusy[\\s\\.]*": [
"...Jak na cmentarzu",
15.0,
0,
false,
false
],
"(oj\\.*\\s*){3,}": [ "(oj\\.*\\s*){3,}": [
"Widzę że szykuje się wpierdol. *Przeładowuje ręczną rewolwerową wyrzutnię granatów termojądrowych i szeroko się uśmiecha w kierunku Hammera i Wykidajłów*", "Widzę że szykuje się wpierdol. *Przeładowuje ręczną rewolwerową wyrzutnię granatów termojądrowych i szeroko się uśmiecha w kierunku Hammera i Wykidajłów*",
15.0, 15.0,
0, 0,
false, false,
true true
],
"revalyacyjnie\\b": [
"Zajebisty dowcip szefie. Na pewno się \"Twojej Byłej Dziewczynie\":tm: spodoba.",
15.0,
0,
false,
true
],
"nocna zmiana\\b": [
"Nocna Zmiana? No to właściciele tego baru. Taki troche Hammer Harema. Kto to jest Harem>? Łokurwa. Harem Hammera. Ale on tu robi za jedyną hurysę, a reszta to szejkowie. Tak zrobię Ci szejka.",
15.0,
0,
false,
true
],
"liga legend\\b": [
"Legends Never Die powiadają. Chyba że gra Hammer. 0/17/0? No problem",
15.0,
0,
false,
true
],
"liguni.*\\b": [
"Legends Never Die powiadają. P*rzygląda się swojej kieszonkowej rewolwerowej wyrzutni rakiet termojądrowych* No Chyba że tak. Ale miłej gierki!!! ",
15.0,
0,
false,
true
],
"melu.*\\b": [
"Meluzyna... *Oczy zaczynają mu błyszczeć, polewa bar benzynąi podpala ją. Nie wiadomo skąd wpada Meluzyna - całą w ogniu. Zaczyna tańczyć na rurze. Wszystko w ogniu. Z głośników leci Rammstein. Połowa gości bawi się miotaczami płomieni. Bar w ogniu.... Odpalają się zraszacze i po 10 sekundach wszystko wraca do normy*",
15.0,
0,
false,
true
],
"ogie.*\\b": [
"Csiiicho. Nie mówimy o ogniu. Już mi raz taka jedna bar zjarała bo się chciała pobawić. Sama wyszła cała czerwoniutka ale ujarana po pachy. W sensie zadowolona",
15.0,
0,
false,
true
],
"vallarr.*\\b": [
"Żodyn się nie spodziewał Warszaskiej Inkwizycji. ŻODYN!",
15.0,
0,
false,
true
],
"max.*\\b": [
"MaxFloyd? Jedyna osoba której Vallarr się realnie boi. Acz często ~~u~~ w niej bywa.",
15.0,
0,
false,
true
],
"eksperyment.*\\b": [
"Ekskrement blindiego vafudra masz może na myśli? No postanowił w ramach eksperymentu uniknąć powieszenia za jajka, faktycznie chyba mu się udało - ale gilotyną sam je sobie uciął. Potem cofnął się w czasie do czasów forów phpBB2. I teraz w przeszłości poluje na naiwne uległe.",
15.0,
0,
false,
true
],
"isken.*\\b": [
"Iskenka? No ta małą to niezły *afrodyzjak*",
15.0,
0,
false,
true
],
"seraph.*\\b": [
"Człowiek z dużą klasą. Wysublimowany koneser.",
15.0,
0,
false,
true
]
},
"cyclic_words": {
"kubek hammera.*\\b": [
"*Przeciera szklanieczki szmatką. Wzdycha bierze wiertarkę udarową, zaczyna nią odkuwać kamień z kubka na kawę Hammera. Po chwili przybiega Hammer i krzyczy że nie będzie piciu już tak wytrawne* Szefie - ale piciu się już nie mieści....",
15.0,
0,
false,
true
],
"sprzątanko 1": [
"*Conjurer porządkuje bar, wypala szklanki do czysta miotaczem płomieni ze swojej zbroi i ogólnie wygląda na zajętego....*\\n *Przeciąga się za barem* No dobra - porobione to można dalej pi... *Zauważa spojrzenie Hammera* ...sać powieści o naszym wspaniałym barze SZEFIE!",
15.0,
0,
false,
true
],
"sprzątanko 2": [
"*Conjurer porządkuje bar, ścina lekkim laserem pulsacyjnym powierzchnie baru o grubości kilku mikronów i ogólnie wygląda na zajętego....*\\n *Przeciąga się za barem* No dobra - porobione to można dalej pi... *Zauważa spojrzenie Hammera* eprzyć o głupotach z klientami... Szefie... *Bierze 'ukradkowy' łyk z piersiówki*",
15.0,
0,
false,
true
] ]
} }
} }
+5
View File
@@ -0,0 +1,5 @@
[ {
"role": "system",
"content": "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie."
}
]