Skip to content

Instantly share code, notes, and snippets.

@LoLei
Created December 21, 2020 10:52
Show Gist options
  • Select an option

  • Save LoLei/bc57e45a2f9eb3b85b0f5195dfbcb985 to your computer and use it in GitHub Desktop.

Select an option

Save LoLei/bc57e45a2f9eb3b85b0f5195dfbcb985 to your computer and use it in GitHub Desktop.
class WordCloudCommand(Command):
helptext_ = "<user> [title] generate a word cloud for a user"
# Receiver = Invoker
def __init__(self, receiver):
self.receiver_ = receiver
def execute(self, args):
trigger_nick = args[0]
incoming_message = args[1]
name_query = Command.check_arg(incoming_message)
if not name_query:
name_query = trigger_nick
use_title = False
try:
if incoming_message.split(' ')[2].strip() == "title":
use_title = True
except IndexError:
pass
user_q = Query()
user_q_res = self.receiver_.user_db_.search(
user_q.name.matches(name_query, flags=re.IGNORECASE))
if not user_q_res:
self.receiver_.sendmsg(
"I haven't encountered this user yet.",
self.receiver_.channel_)
return True
name = user_q_res[0]['name']
msg = "({}) Cloud generation for nick {} started...".format(
trigger_nick, name)
self.receiver_.sendmsg(msg, self.receiver_.channel_)
# Get all user messages as a string
msgs = list(user_q_res[0]['messages'])
user_text = ' '.join(msgs)
# Add bot commands to list of stop words
stopwords = util.STOPWORDS
stopwords.update(self.receiver_.commands_.keys())
stopwords.update([name, name.lower()])
# Get tux outline image
mask = np.array(Image.open("images/tux.png"))
# Generate wordcloud
wc = WordCloud(stopwords=stopwords,
background_color="white",
mask=mask,
# mode="RGBA",
max_words=5000,
# max_font_size=40
)
wc.generate(user_text.lower())
# Create colormap from image
image_colors = ImageColorGenerator(mask)
plt.figure(figsize=[20, 20])
plt.imshow(wc.recolor(color_func=image_colors),
interpolation="bilinear")
plt.axis("off")
if use_title:
title = "Wordcloud for " + name
plt.title(title, fontsize=36)
# Save on disk for later upload
file_and_path = os.path.join('clouds', name + '.png')
plt.savefig(file_and_path, format="png")
# Upload wordcloud
res = imageuploader.upload(file_and_path)
os.remove(file_and_path)
msg = "Cloud generated for " + name + ": "
msg += res['link']
self.receiver_.sendmsg(msg, self.receiver_.channel_)
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment