mirror of https://github.com/stijndcl/didier
Make react provide useful error messages
parent
13ce50f4fa
commit
c882179b0d
|
@ -1,13 +1,167 @@
|
||||||
def check(content, earlier=[]):
|
def check(content, earlier=[]):
|
||||||
|
# No arguments passed
|
||||||
if len(content) < 1:
|
if len(content) < 1:
|
||||||
return False, ["Controleer je argumenten."]
|
return False, ["Controleer je argumenten."]
|
||||||
if any(not (x.isalpha() or x.isdigit() or x in ["#", "*", "!", "?"]) for x in content):
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
if content[-1].isdigit() and len(content[-1]) > 10:
|
|
||||||
content[0] = "".join(x for x in content[:-1])
|
|
||||||
else:
|
|
||||||
content[0] = "".join(x for x in content)
|
|
||||||
|
|
||||||
|
# This command should work case insensitive
|
||||||
|
for i, word in enumerate(content):
|
||||||
|
content[i] = word.lower()
|
||||||
|
|
||||||
|
invalid_characters = []
|
||||||
|
|
||||||
|
# Check valid characters
|
||||||
|
for word in content:
|
||||||
|
for letter in word:
|
||||||
|
if letter not in allowedCharacters():
|
||||||
|
invalid_characters.append(letter)
|
||||||
|
|
||||||
|
# Get uniques
|
||||||
|
invalid_characters = list(set(invalid_characters))
|
||||||
|
|
||||||
|
# Invalid char was passed
|
||||||
|
if len(invalid_characters) == 1:
|
||||||
|
return False, ["**{}** is geen geldige letter.".format(invalid_characters[0])]
|
||||||
|
|
||||||
|
# Multiple invalid chars were passed
|
||||||
|
if len(invalid_characters) > 1:
|
||||||
|
return False, ["**{}** en **{}** zijn geen geldige letters.".format(
|
||||||
|
", ".join(invalid_characters[:-1]), invalid_characters[-1]
|
||||||
|
)]
|
||||||
|
|
||||||
|
# Check if ID was passed or not, remove from list of words if so
|
||||||
|
# Also join everything into one word
|
||||||
|
if content[-1].isdigit() and len(content[-1]) > 10:
|
||||||
|
content[0] = "".join(content[:-1])
|
||||||
|
else:
|
||||||
|
content[0] = "".join(content)
|
||||||
|
|
||||||
|
# In case a space was passed using "a b", strip it out as well
|
||||||
|
content[0] = content[0].replace(" ", "")
|
||||||
|
|
||||||
|
doubles = getDoubles()
|
||||||
|
|
||||||
|
nums = getNumbers()
|
||||||
|
|
||||||
|
specials = getSpecialCharacters()
|
||||||
|
|
||||||
|
unidic = getUnicodeDict()
|
||||||
|
|
||||||
|
# Check for reactions that were already added earlier
|
||||||
|
for x in earlier:
|
||||||
|
# Check if reaction is a random reaction or a letter/number
|
||||||
|
if x in unidic.values():
|
||||||
|
word = ""
|
||||||
|
# Find the key used, remove it from the list of remaining available letters
|
||||||
|
for key in unidic:
|
||||||
|
if unidic[key] == x:
|
||||||
|
word = key
|
||||||
|
break
|
||||||
|
|
||||||
|
del unidic[word]
|
||||||
|
|
||||||
|
# Same thing for doubles
|
||||||
|
for k in list(doubles.keys()):
|
||||||
|
if word in doubles[k]:
|
||||||
|
doubles[k].remove(word)
|
||||||
|
if len(doubles[k]) == 0:
|
||||||
|
del doubles[k]
|
||||||
|
break
|
||||||
|
|
||||||
|
# Same thing for numbers
|
||||||
|
for k in list(nums.keys()):
|
||||||
|
if nums[k] == word:
|
||||||
|
del nums[k]
|
||||||
|
|
||||||
|
# Same thing for special characters
|
||||||
|
for k in list(specials.keys()):
|
||||||
|
if word in specials[k]:
|
||||||
|
specials[k].remove(word)
|
||||||
|
if len(specials[k]) == 0:
|
||||||
|
del specials[k]
|
||||||
|
|
||||||
|
# Check if earlier letters made this reaction impossible
|
||||||
|
for letter in content[0]:
|
||||||
|
c = content[0].count(letter)
|
||||||
|
|
||||||
|
# If a letter was added twice, but there is only one, that's an issue
|
||||||
|
if c != 1 and letter not in doubles:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
elif c > 1 and letter in doubles and len(doubles[letter]) < c:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
|
||||||
|
# Array of emoji's
|
||||||
|
arr = []
|
||||||
|
|
||||||
|
# Start checking every character
|
||||||
|
for letter in content[0]:
|
||||||
|
# Letters
|
||||||
|
if letter.isalpha():
|
||||||
|
# Check if this letter has not been added yet
|
||||||
|
if "regional_indicator_{}".format(letter) in unidic and unidic["regional_indicator_{}".format(letter)] not in arr:
|
||||||
|
arr.append(unidic["regional_indicator_{}".format(letter)])
|
||||||
|
|
||||||
|
# Remove this letter as an option from the list of doubles
|
||||||
|
if letter in doubles:
|
||||||
|
doubles[letter] = doubles[letter][1:]
|
||||||
|
|
||||||
|
# Letter has been added before, but there's a double for it
|
||||||
|
elif letter in doubles:
|
||||||
|
if len(doubles[letter]) == 0:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
|
||||||
|
# Remove the number-equivalent from nums if it is used as a substitute here
|
||||||
|
arr.append(unidic[doubles[letter][0]])
|
||||||
|
if doubles[letter][0] in nums.values():
|
||||||
|
for k in nums:
|
||||||
|
if nums[k] == doubles[letter][0]:
|
||||||
|
del nums[k]
|
||||||
|
break
|
||||||
|
|
||||||
|
# Remove this character from the list of available doubles
|
||||||
|
doubles[letter] = doubles[letter][1:]
|
||||||
|
|
||||||
|
# Remove from the dictionary of doubles if the last double was used
|
||||||
|
if len(doubles[letter]) == 0:
|
||||||
|
del doubles[letter]
|
||||||
|
else:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
# Special characteres
|
||||||
|
elif letter in specials:
|
||||||
|
# No more options
|
||||||
|
if len(specials[letter]) == 0:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
|
||||||
|
# Add it to the array & remove from the list of options
|
||||||
|
arr.append(unidic[specials[letter][0]])
|
||||||
|
specials[letter].pop(0)
|
||||||
|
|
||||||
|
if len(specials[letter]) == 0:
|
||||||
|
del specials[letter]
|
||||||
|
# Number
|
||||||
|
else:
|
||||||
|
# Number was used before as a double for a letter
|
||||||
|
if letter not in nums:
|
||||||
|
return False, ["Er zijn niet genoeg **{}**'s om dit woord te reacten.".format(letter)]
|
||||||
|
|
||||||
|
arr.append(unidic[nums[letter]])
|
||||||
|
|
||||||
|
# Add this emoji to the array, remove it as a double everywhere
|
||||||
|
for x in doubles:
|
||||||
|
# Remove this number as a substitute if it is used anywhere
|
||||||
|
if nums[letter] == doubles[x][-1]:
|
||||||
|
doubles[x] = doubles[x][:-1]
|
||||||
|
if len(doubles[x]) == 0:
|
||||||
|
del doubles[x]
|
||||||
|
break
|
||||||
|
return True, arr
|
||||||
|
|
||||||
|
|
||||||
|
def allowedCharacters():
|
||||||
|
return ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
|
||||||
|
'v', 'w', 'x', 'y', 'z', "!", "?", "#", "*", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
|
||||||
|
|
||||||
|
|
||||||
|
def getDoubles():
|
||||||
doubles = {
|
doubles = {
|
||||||
"a": ["regional_indicator_a", "a", "four"],
|
"a": ["regional_indicator_a", "a", "four"],
|
||||||
"b": ["regional_indicator_b", "b"],
|
"b": ["regional_indicator_b", "b"],
|
||||||
|
@ -22,6 +176,10 @@ def check(content, earlier=[]):
|
||||||
"?": ["question", "grey_question"]
|
"?": ["question", "grey_question"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return doubles
|
||||||
|
|
||||||
|
|
||||||
|
def getNumbers():
|
||||||
nums = {
|
nums = {
|
||||||
"0": "zero",
|
"0": "zero",
|
||||||
"1": "one",
|
"1": "one",
|
||||||
|
@ -35,6 +193,10 @@ def check(content, earlier=[]):
|
||||||
"9": "nine"
|
"9": "nine"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nums
|
||||||
|
|
||||||
|
|
||||||
|
def getSpecialCharacters():
|
||||||
specials = {
|
specials = {
|
||||||
"?": ["question", "grey_question"],
|
"?": ["question", "grey_question"],
|
||||||
"!": ["exclamation", "grey_exclamation"],
|
"!": ["exclamation", "grey_exclamation"],
|
||||||
|
@ -42,6 +204,10 @@ def check(content, earlier=[]):
|
||||||
"#": ["hash"]
|
"#": ["hash"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return specials
|
||||||
|
|
||||||
|
|
||||||
|
def getUnicodeDict():
|
||||||
unidic = {
|
unidic = {
|
||||||
"regional_indicator_a": "🇦",
|
"regional_indicator_a": "🇦",
|
||||||
"regional_indicator_b": "🇧",
|
"regional_indicator_b": "🇧",
|
||||||
|
@ -93,74 +259,4 @@ def check(content, earlier=[]):
|
||||||
"asterisk": "*️⃣"
|
"asterisk": "*️⃣"
|
||||||
}
|
}
|
||||||
|
|
||||||
for x in earlier:
|
return unidic
|
||||||
if x in unidic.values():
|
|
||||||
word = ""
|
|
||||||
for key in unidic:
|
|
||||||
if unidic[key] == x:
|
|
||||||
word = key
|
|
||||||
break
|
|
||||||
del unidic[word]
|
|
||||||
for k in list(doubles.keys()):
|
|
||||||
if word in doubles[k]:
|
|
||||||
doubles[k].remove(word)
|
|
||||||
if len(doubles[k]) == 0:
|
|
||||||
del doubles[k]
|
|
||||||
break
|
|
||||||
for k in list(nums.keys()):
|
|
||||||
if nums[k] == word:
|
|
||||||
del nums[k]
|
|
||||||
for k in list(specials.keys()):
|
|
||||||
if word in specials[k]:
|
|
||||||
specials[k].remove(word)
|
|
||||||
if len(specials[k]) == 0:
|
|
||||||
del specials[k]
|
|
||||||
|
|
||||||
for letter in content[0]:
|
|
||||||
c = content[0].count(letter)
|
|
||||||
if c != 1 and letter not in doubles:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
elif c > 1 and letter in doubles and len(doubles[letter]) < c:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
|
|
||||||
arr = []
|
|
||||||
for letter in content[0]:
|
|
||||||
if letter.isalpha():
|
|
||||||
if "regional_indicator_{}".format(letter) in unidic and unidic["regional_indicator_{}".format(letter)] not in arr:
|
|
||||||
arr.append(unidic["regional_indicator_{}".format(letter)])
|
|
||||||
if letter in doubles:
|
|
||||||
doubles[letter] = doubles[letter][1:]
|
|
||||||
elif letter in doubles:
|
|
||||||
if len(doubles[letter]) == 0:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
# Remove the number-equivalent from nums if it is used as a substitute here
|
|
||||||
arr.append(unidic[doubles[letter][0]])
|
|
||||||
if doubles[letter][0] in nums.values():
|
|
||||||
for k in nums:
|
|
||||||
if nums[k] == doubles[letter][0]:
|
|
||||||
del nums[k]
|
|
||||||
break
|
|
||||||
doubles[letter] = doubles[letter][1:]
|
|
||||||
if len(doubles[letter]) == 0:
|
|
||||||
del doubles[letter]
|
|
||||||
else:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
elif letter in specials:
|
|
||||||
if len(specials[letter]) == 0:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
arr.append(unidic[specials[letter][0]])
|
|
||||||
specials[letter].pop(0)
|
|
||||||
if len(specials[letter]) == 0:
|
|
||||||
del specials[letter]
|
|
||||||
else:
|
|
||||||
if letter not in nums:
|
|
||||||
return False, ["Dit is geen geldig woord."]
|
|
||||||
arr.append(unidic[nums[letter]])
|
|
||||||
for x in doubles:
|
|
||||||
# Remove this number as a substitute if it is used anywhere
|
|
||||||
if nums[letter] == doubles[x][-1]:
|
|
||||||
doubles[x] = doubles[x][:-1]
|
|
||||||
if len(doubles[x]) == 0:
|
|
||||||
del doubles[x]
|
|
||||||
break
|
|
||||||
return True, arr
|
|
Loading…
Reference in New Issue