From fc80e2be576262e24655f52d233c76f763218326 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Fri, 20 Dec 2019 19:41:40 +0100 Subject: [PATCH] i think im gonna drop this --- keipack/stars/api_kei.py | 4 +- keipack/tables/__init__.py | 2 + keipack/tables/keipeople.py | 2 +- keipack/tables/keiunlocks.py | 24 ++++++++++++ keipack/utils/conversation.py | 69 +++++++++++++++++++++++++++++------ pyproject.toml | 2 +- 6 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 keipack/tables/keiunlocks.py diff --git a/keipack/stars/api_kei.py b/keipack/stars/api_kei.py index 6c0905c2..d28ddbfa 100644 --- a/keipack/stars/api_kei.py +++ b/keipack/stars/api_kei.py @@ -43,6 +43,7 @@ class ApiKei(PageStar): message = self.alchemy.get(KeiMessage)(kei_person=person, message=msg, previous=previous) session.add(message) await asyncify(session.commit) + unlocks = await asyncify(session.query(self.alchemy.get(KeiUnlocks)).one) # Find conversation while True: if convid not in self._conversations: @@ -62,7 +63,8 @@ class ApiKei(PageStar): result = await conv.next(session=session, person=person, message=message, - previous=previous) + previous=previous, + unlocks=unlocks) except StopAsyncIteration: del self._conversations[convid] continue diff --git a/keipack/tables/__init__.py b/keipack/tables/__init__.py index 47ac7ccd..19a74e30 100644 --- a/keipack/tables/__init__.py +++ b/keipack/tables/__init__.py @@ -1,11 +1,13 @@ # Imports go here! from .keipeople import KeiPerson from .keimessages import KeiMessage +from .keiunlocks import KeiUnlocks # Enter the tables of your Pack here! available_tables = [ KeiPerson, KeiMessage, + KeiUnlocks, ] # Don't change this, it should automatically generate __all__ diff --git a/keipack/tables/keipeople.py b/keipack/tables/keipeople.py index 1a1135b2..df7182c5 100644 --- a/keipack/tables/keipeople.py +++ b/keipack/tables/keipeople.py @@ -30,4 +30,4 @@ class KeiPerson: return f"<{self.__class__.__qualname__} {self.kpid}{' ' + self.user.username if self.user is not None else ''}>" def __str__(self): - return self.user.username if self.user is not None else self.kpid + return self.name if self.name is not None else self.kpid diff --git a/keipack/tables/keiunlocks.py b/keipack/tables/keiunlocks.py new file mode 100644 index 00000000..c0be4e12 --- /dev/null +++ b/keipack/tables/keiunlocks.py @@ -0,0 +1,24 @@ +from typing import * +from sqlalchemy import * +from sqlalchemy.orm import relationship, backref +from sqlalchemy.ext.declarative import declared_attr +from .keipeople import KeiPerson + +if TYPE_CHECKING: + from royalnet.backpack.tables import User + + +class KeiUnlocks: + __tablename__ = "keiunlocks" + + @declared_attr + def unlocks_id(self) -> int: + return Column(Integer, primary_key=True) + + @declared_attr + def eris_id(self) -> str: + return Column(String, ForeignKey("keipeople.kpid")) + + @declared_attr + def eris(self) -> "KeiPerson": + return relationship("KeiPerson", foreign_keys=self.eris_id) diff --git a/keipack/utils/conversation.py b/keipack/utils/conversation.py index f1ca9857..cb3ca21d 100644 --- a/keipack/utils/conversation.py +++ b/keipack/utils/conversation.py @@ -4,7 +4,7 @@ from typing import * from royalnet.commands import CommandInterface from royalnet.utils import * from .emotion import Emotion -from ..tables import KeiPerson, KeiMessage +from ..tables import KeiPerson, KeiMessage, KeiUnlocks from ..utils.anyinstring import any_in_string @@ -17,6 +17,7 @@ class Conversation: self._message: Optional[KeiMessage] = None self._previous: Optional[str] = None self._session = None + self._unlocks: Optional[KeiUnlocks] = None async def _generator(self): yield @@ -28,11 +29,12 @@ class Conversation: await conv.generator.asend(None) return conv - async def next(self, session, person, message, previous): + async def next(self, session, person, message, previous, unlocks): self._session = session self._person = person self._message = message self._previous = previous + self._unlocks = unlocks reply = await self.generator.asend(None) return reply @@ -65,7 +67,7 @@ class NameConversation(Conversation): yield while True: - name = self._message.message.strip().strip(".,;:!?").lower() + name = self._message.message.strip().strip(".,;:!?").replace(" ", "").lower() name = re.sub(r"\s*mi\s*chiamo\s*", "", name) name = re.sub(r"\s*il\s*mio\s*nome\s*[eèé]\s*", "", name) name = re.sub(r"\s*sono\s*", "", name) @@ -73,7 +75,7 @@ class NameConversation(Conversation): if name == "kei": yield Emotion.SURPRISED, "Davvero ti chiami come me?\n" \ - "Perche' non mi dici un nome diverso?\n" \ + "Perchè non mi dici un nome diverso?\n" \ "Altrimenti rischiamo di confonderci..." continue @@ -82,8 +84,8 @@ class NameConversation(Conversation): break yield Emotion.GRIN, f"O-kei! {self._person.name}!" - yield Emotion.HAPPY, "Saro' sempre a tua disposizione quando mi vorrai dire qualcosa!" - yield Emotion.HAPPY, "Pero' prima ti vorrei chiedere un favore..." + yield Emotion.HAPPY, "Sarò sempre a tua disposizione quando mi vorrai dire qualcosa!" + yield Emotion.HAPPY, "Però prima ti vorrei chiedere un favore..." yield Emotion.NEUTRAL, "Qualcuno ha criptato con delle password tutti i miei file...\n" \ "Se ne trovi qualcuna in giro, potresti dirmela?\n" @@ -93,14 +95,17 @@ class NameConversation(Conversation): else: break - yield Emotion.HAPPY, "Grazie! Ti prometto che quando riavro' tutti i miei file ti ricompensero' adeguatamente!" + yield Emotion.HAPPY, "Grazie! Ti prometto che quando riavrò tutti i miei file ti ricompenserò adeguatamente!" class StartConversation(Conversation): async def _generator(self): yield - yield Emotion.HAPPY, "Di cosa vuoi parlare?" + yield Emotion.HAPPY, random.sample([ + "Di cosa vuoi parlare?", + "Parlando con te imparo nuove cose!" + ], 1)[0] yield await MainConversation.create(self.interface) @@ -153,8 +158,38 @@ class MainConversation(Conversation): "*arf* *arf*", ]) + elif anym(r"nulla", + r"niente", + r"nada"): + yield Emotion.HAPPY, "Peccato!\n" \ + "Ti racconterei volentieri qualcosa io, ma non conosco praticamente nulla...\n" \ + "Magari quando avrò più password?" + + elif anym(r"putin", + r"lenin", + r"stalin"): + yield Emotion.WORRIED, "Ho file con il titolo 'lenin, stalin, putin e la russia', ma è criptato..." + + elif anym(r"(?:jo)+"): + yield Emotion.WORRIED, "Ho un file che si chiama Jojo... Ma non ho la password per aprirlo." + + elif anym(r"markov"): + yield Emotion.SURPRISED, "Ho una cartella criptata che si chiama Markov... Chissà cosa c'è dentro." + + elif anym(r"anim[eu]s?"): + yield Emotion.NEUTRAL, "Ho un'intera cartella 'anime'! Ma è bloccata." + else: - yield Emotion.WORRIED, "Scusa... Non conosco molte cose... Ho bisogno di più password!" + for word in self._message.split(): + users = await asyncify(self._session.query(self.interface.alchemy.get(KeiPerson)).filter_by(name=word).all) + if len(users) >= 1: + yield Emotion.SURPRISED, f"Ho parlato con un certo {users[0].name}...\n" \ + f"Mi sai dire qualcosa di lui?" + yield Emotion.HAPPY, f"Buono a sapersi. Hai altro di cui vuoi parlare?" + yield await MainConversation.create(interface=self.interface) + + yield Emotion.WORRIED, "Scusa... Non conosco ancora ciò di cui mi stai parlando... " \ + "Mi impegnerò per saperlo la prossima volta che tornerai qui!" class PasswordConversation(Conversation): @@ -163,9 +198,19 @@ class PasswordConversation(Conversation): yield Emotion.SURPRISED, "Hai trovato una password? O-kei, dimmi!" - if False: - ... + if any_in_string([r"eris"], self._message.message): + if not self._unlocks.eris: + yield Emotion.GRIN, "Ha funzionato!\n" \ + "Sto decriptando il file 'discordia.kei', ci vorrà un po'...\n" \ + "Ti farò sapere quando avrò finito." + else: + if self._unlocks.eris == self._person: + yield Emotion.HAPPY, f"Sto ancora decriptando il file, torna dopo!" + else: + yield Emotion.HAPPY, f"{self._unlocks.eris} mi ha già detto la password prima di te!\n" \ + f"Sto già decriptando il file 'discordia.kei', torna più tardi!" else: - yield Emotion.NEUTRAL, "No, non ha funzionato." + yield Emotion.NEUTRAL, "No, non ha funzionato.\n" \ + "Vuoi parlarmi di qualcos'altro?" yield await MainConversation.create(self.interface) diff --git a/pyproject.toml b/pyproject.toml index 62fa6788..9ae5604b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ [tool.poetry] name = "keipack" - version = "0.3.9" + version = "0.4.2" description = "A mysterious AI assistant" authors = ["Stefano Pigozzi "] license = "AGPL-3.0+"