PythonistaGuild / TwitchIO

An Async Bot/API wrapper for Twitch made in Python.
https://twitchio.dev
MIT License
785 stars 163 forks source link

Tokenising multiple words to multiple arguments #450

Open chillymosh opened 3 months ago

chillymosh commented 3 months ago

Discussed in https://github.com/PythonistaGuild/TwitchIO/discussions/449

Originally posted by **DennisMinn** May 13, 2024 I want to pass multiple arguments enclosed in either ' or ", but on the first argument is properly formatted, while the second argument is cut off. Is there a way to modify how the arguments is parsed? ``` class Bot(commands.Bot): def __init__(self): super().__init__(token='', prefix='!', initial_channels = ['']) @commands.command(name='addQA') async def add_qa(self, context: commands.Context, question: str, answer: str): print(question, answer) ``` Input from `` chatroom ``` !addQA "this is a question" "this is the answer" ``` Current Output ``` this is a question "this ``` Desired Output ``` this is a question this is the answer ```
chillymosh commented 3 months ago

Potential fix that needs to be tested - ext.commands.stringparser.py


    def process_string(self, msg: str) -> Dict[int, str]:
        while self.count < len(msg):
            loc = msg[self.count]

            if loc == '"' and not self.ignore:
                self.ignore = True
                self.start = self.count + 1
            elif loc == '"' and self.ignore:
                self.words[self.index] = msg[self.start:self.count]
                self.index += 1
                self.ignore = False
                self.start = self.count + 1
            elif loc.isspace() and not self.ignore:
                if self.start != self.count:
                    self.words[self.index] = msg[self.start:self.count]
                    self.index += 1
                self.start = self.count + 1

            self.count += 1

        if self.start < len(msg) and not self.ignore:
            self.words[self.index] = msg[self.start:len(msg)].strip()

        return self.words