def cache_dibs(): shared_var['dibs'] = [] spreadsheet = google_sheet_get(shared_var['sheet']) worksheet = spreadsheet.worksheet('Dibs') values = worksheet.get_all_values() for value in values[1:]: name = value[0].encode('utf-8', 'ignore').decode('utf-8').strip() owner = value[1].encode('utf-8', 'ignore').decode('utf-8').strip() shared_var['dibs'].append({'name': name, 'owner': owner})
def cache_triggers(bot = None): spreadsheet = google_sheet_get(shared_var['trigger_sheet']) #classes worksheet = spreadsheet.worksheet('Count & Frontpage') values = worksheet.col_values(2) shared_var['classes'] = values[6:18] #triggers worksheet = spreadsheet.worksheet('Triggers') values = worksheet.col_values(1) shared_var['trigger_list'] = [] for i, v in enumerate(values): if not v: shared_var['trigger_list'].append({ 'prefix': '', 'text': 'Blank.', 'blank': True }) elif v != "100 Triggers at Maximum, please.": shared_var['trigger_list'].append({ 'prefix': '['+str(i+1)+']: ', 'text': v.encode('utf-8', 'ignore').decode('utf-8'), 'blank': False }) #used worksheet = spreadsheet.worksheet('Used') values = worksheet.col_values(2) shared_var['used_list'] = [] for i, v in enumerate(values[1:]): if not v: shared_var['used_list'].append({ 'prefix': '', 'text': 'Blank.', 'blank': True }) else: shared_var['used_list'].append({ 'prefix': '{'+str(i+2)+'}: ', 'text': v.encode('utf-8', 'ignore').decode('utf-8'), 'blank': False })
def classification(bot, trigger): """Increments the specified classification by the provided number.""" if trigger.sender.lower() != '#weaverdice': return say(bot,'Please perform increments in #Weaverdice.') if trigger.group(2): if trigger.group(1).lower()=="thinker" and trigger.group(2).lower()=="run": return say(bot,'"Thinker. Don\'t worry about the number. Just run."') try: increment = float(trigger.group(2)) except ValueError: return say(bot,"Invalid increment.") except AttributeError: return say(bot,"Invalid input.") if (increment==0): return say(bot,"Nope, not wasting my time incrementing by 0.") else: return say(bot,"Specify a number to increment "+trigger.group(1).lower()+" by. If you're trying to generate an npc, the command is '$npc "+trigger.group(1).lower()+"'") type = trigger.group(1).lower() delay=get_delay_timer(type) if delay>0 and increment*-1!=shared_var['increment::'+type]: return say(bot,"ZzZz...["+str(delay)+"s]") set_delay_timer(type,15) shared_var['increment::'+type]=increment #classes spreadsheet = google_sheet_get(shared_var['trigger_sheet']) worksheet = spreadsheet.worksheet('Count & Frontpage') values = worksheet.col_values(2) shared_var['classes'] = values[6:18] cell = ['mover','shaker','brute','breaker','master','tinker','blaster','thinker','striker','changer','trump','stranger'].index(type) try: shared_var['classes'][cell] = ('%f' % (float(shared_var['classes'][cell])+increment)).rstrip('0').rstrip('.') except: return say(bot,"Invalid count for '"+type.title()+"'.") worksheet.update_cell(7+cell, 2, shared_var['classes'][cell]) return say(bot,type.title()+" count modified by "+str(increment)+". Current value: "+shared_var['classes'][cell])
def undibs(bot, trigger): """Reverse a claim on a cape name.""" if trigger.group(2): name = trigger.group(2) say(bot, 'Removing dibs. This might take a moment...') # Update the dibs cache cache_dibs() # Check for a cape with the correct details for id, cape in enumerate(shared_var['dibs']): if cape['name'].upper() == name.upper() and cape['owner'].upper( ) == trigger.nick.upper(): # Remove cape spreadsheet = google_sheet_get(shared_var['sheet']) worksheet = spreadsheet.worksheet('Dibs') worksheet.update_cell(id + 2, 1, '') worksheet.update_cell(id + 2, 2, '') return say(bot, 'Dibs removed.') return say(bot, "You don't have dibs on that name.") else: return say(bot, 'Please specify a cape.')
def cache_luck(): spreadsheet = google_sheet_get(shared_var['sheet']) worksheet = spreadsheet.worksheet('LUCK') values = worksheet.get_all_values() shared_var['luck_list'] = { "Life Perk": [], "Power Perk": [], "Life Flaw": [], "Power Flaw": [] } keys = ["Life Perk", "Power Perk", "Life Flaw", "Power Flaw"] for j in range(2, 6): key = keys[j - 2] for i in range(1, 79): if values[i][j].encode('utf-8', 'ignore').decode('utf-8').strip(): text = values[i][j].encode('utf-8', 'ignore').decode('utf-8') keyword = text.split('.', 1)[0].lower().strip() shared_var['luck_list'][key].append({ 'text': '[' + key + ' ' + str(i + 1) + ']: ' + text, 'keyword': keyword, 'blank': False }) else: shared_var['luck_list'][key].append({ 'text': '[' + key + ' ' + str(i + 1) + ']: Blank', 'keyword': '', 'blank': True })
def unclaim(bot, trigger): """Reverses a claim on a trigger, moving it back to the Weaver Dice trigger spreadsheet.""" if trigger.sender.lower() != '#weaverdice': return say(bot,'Please perform unclaims in #Weaverdice.') #Validate command if not trigger.group(2): return say(bot,"Specify a used trigger from 2+.") trigger_index = int(trigger.group(2)) if (trigger_index<2): return say(bot,"Specify a used trigger from 2+.") delay=get_delay_timer('claim') if delay>0: return say(bot,"ZzZz...["+str(delay)+"s]") set_delay_timer('claim',15) #Initialize spreadsheet spreadsheet = google_sheet_get(shared_var['trigger_sheet']) worksheet2 = spreadsheet.worksheet('Used') h = worksheet2.row_count #Sort through used trigger list and fetch string/author. Grab the whole thing so the cache can be updated. used_triggers = [["","","","",""] for y in range(h)] cell_list = worksheet2.range('A1:E'+str(h)) for cell in cell_list: used_triggers[cell.row-1][cell.col-1] = cell.value trigger_string = used_triggers[trigger_index-1][1] if not trigger_string: return say(bot,"Used trigger '"+str(trigger_index)+"' is blank.") if used_triggers[trigger_index-1][2]: trigger_author = used_triggers[trigger_index-1][2] else: trigger_author = "?" trigger_string = trigger_string.encode('utf-8', 'ignore').decode('utf-8') trigger_author = trigger_author.encode('utf-8', 'ignore').decode('utf-8') say(bot,'Unclaiming trigger. This might take a moment...') #Fetch trigger list and find an empty slot to insert this trigger in. Update cache while we're at it. worksheet = spreadsheet.worksheet('Triggers') worksheet_height = worksheet.row_count triggers = worksheet.col_values(1) triggers += [None] * (worksheet_height - len(triggers)) update_trigger_cache(triggers) # Find the empty slot slot = None for i, dic in enumerate(shared_var['trigger_list']): if dic['blank']: slot = i + 1 break if slot is None: return say(bot,"...The trigger list is full.") #Update trigger list + cache worksheet.update_cell(slot, 1, trigger_string) worksheet.update_cell(slot, 2, trigger_author) shared_var['trigger_list'][slot-1] = { 'prefix': '['+str(slot)+']: ', 'text': trigger_string, 'blank': False } #Remove used trigger from trigger list used_triggers.pop(trigger_index-1) used_triggers.append([""]*5) h = len(used_triggers) for cell in cell_list: cell.value = used_triggers[cell.row-1][cell.col-1] worksheet2.update_cells(cell_list) #Update trigger cache used_triggers.pop() update_used_cache([row[1] for row in used_triggers[1:]]) return say(bot,'...Used Trigger {'+str(trigger_index)+'} moved to Trigger slot ['+str(slot)+'].')
def claim(bot, trigger): """Moves a trigger to the used section of the Weaver Dice trigger spreadsheet. The square brackets around Player_Name should be included.""" if trigger.sender.lower() != '#weaverdice': return say(bot,'Please perform claims in #Weaverdice.') #Validate command if not trigger.group(2): return say(bot,"Specify a trigger from 1-100.") data = shared_var['re_claim'].match(trigger.group(2)) if data.group(1): if is_integer(data.group(1)): trigger_index = int(data.group(1)) else: return say(bot,"Invalid trigger index.") else: return say(bot,"Specify a trigger from 1-100.") game = data.group(2).strip() if data.group(2) else '?' claimer = data.group(3).strip()[1:-1] if data.group(3) else trigger.nick description = data.group(4).strip() if data.group(4) else '' delay=get_delay_timer('claim') if delay>0: return say(bot,"ZzZz...["+str(delay)+"s]") set_delay_timer('claim',15) #Initialize spreadsheet spreadsheet = google_sheet_get(shared_var['trigger_sheet']) trigger_worksheet = spreadsheet.worksheet('Triggers') trigger_worksheet_height = trigger_worksheet.row_count used_worksheet = spreadsheet.worksheet('Used') used_worksheet_height = used_worksheet.row_count say(bot,'Claiming trigger. This might take a moment...') #Sort through trigger list and fetch the trigger string/author. Might as well grab the whole thing so the trigger cache can be updated. triggers = [["",""] for y in range(trigger_worksheet_height)] cell_list = trigger_worksheet.range('A1:B'+str(trigger_worksheet_height)) for cell in cell_list: triggers[cell.row-1][cell.col-1] = cell.value trigger_string = triggers[trigger_index-1][0] if not trigger_string: return say(bot,"...Trigger '"+str(trigger_index)+"' is blank.") trigger_string=trigger_string.encode('utf-8', 'ignore').decode('utf-8') trigger_author = triggers[trigger_index-1][1] if not trigger_author: trigger_author="?" else: trigger_author=trigger_author.encode('utf-8', 'ignore').decode('utf-8') #Sort through used trigger list and find blank spot. Grab the whole thing so the cache can be updated. used_triggers = used_worksheet.col_values(2) used_triggers += [None] * (used_worksheet_height - len(used_triggers)) update_used_cache(used_triggers[1:]) #Find blank spot to append used trigger. If none is available, append a row. try: slot = used_triggers[1:].index(None)+2 used_worksheet.update_cell(slot, 1, game) used_worksheet.update_cell(slot, 2, trigger_string) used_worksheet.update_cell(slot, 3, trigger_author) used_worksheet.update_cell(slot, 4, claimer) used_worksheet.update_cell(slot, 5, description) shared_var['used_list'][slot-2] = { 'prefix': '{'+str(slot)+'}: ', 'text': trigger_string.encode('utf-8', 'ignore').decode('utf-8'), 'blank': False } except ValueError: used_worksheet.append_row([game,trigger_string,trigger_author,claimer,description]) shared_var['used_list'].append({ 'prefix': '{'+str(used_worksheet_height+1)+'}: ', 'text': trigger_string.encode('utf-8', 'ignore').decode('utf-8'), 'blank': False }) slot = used_worksheet_height+1 #Update trigger list triggers.pop(trigger_index-1) triggers.append([""]*2) for cell in cell_list: cell.value = triggers[cell.row-1][cell.col-1] if not cell.value: cell.value="" trigger_worksheet.update_cells(cell_list) #Update trigger cache update_trigger_cache([row[0] for row in triggers]) #Fin return say(bot,'...Trigger ['+str(trigger_index)+'] moved to Used Trigger slot {'+str(slot)+'}.')
def cache_capes(): spreadsheet = google_sheet_get(shared_var['sheet']) shared_var['capes'] = [] #Canon capes worksheet = spreadsheet.worksheet('Canon') values = worksheet.get_all_values() for value in values[1:]: name = value[0].encode('utf-8', 'ignore').decode('utf-8').strip() alias = value[1].encode('utf-8', 'ignore').decode('utf-8').strip() if not name: name = alias alias = '' if name: cape = { 'name': name, 'alias': [alias], 'power': value[2].encode('utf-8', 'ignore').decode('utf-8').strip(), 'affiliation': value[3].encode('utf-8', 'ignore').decode('utf-8').strip(), 'alignment': '', 'classification': value[4].encode('utf-8', 'ignore').decode('utf-8').strip(), 'character type': '', 'campaign': 'Worm', 'owner': 'Wildbow', 'status': '', 'notes': '' } cape['s_name'] = [ cape['name'].lower(), remove_accents(cape['name']).lower() ] cape['s_alias'] = [x.lower() for x in cape['alias']] + [ remove_accents(x).lower() for x in cape['alias'] ] shared_var['capes'].append(cape) #Non-Canon capes worksheet = spreadsheet.worksheet('Non-Canon') values = worksheet.get_all_values() for value in values[1:]: name = value[0].encode('utf-8', 'ignore').decode('utf-8').strip() alias = value[1].encode('utf-8', 'ignore').decode('utf-8').strip() if not name: name = alias alias = '' if name: cape = { 'name': name, 'alias': [alias], 'power': value[2].encode('utf-8', 'ignore').decode('utf-8').strip(), 'affiliation': value[3].encode('utf-8', 'ignore').decode('utf-8').strip(), 'alignment': value[4].encode('utf-8', 'ignore').decode('utf-8').strip(), 'classification': value[5].encode('utf-8', 'ignore').decode('utf-8').strip(), 'character type': value[6].encode('utf-8', 'ignore').decode('utf-8').strip(), 'campaign': value[7].encode('utf-8', 'ignore').decode('utf-8').strip(), 'owner': value[8].encode('utf-8', 'ignore').decode('utf-8').strip(), 'status': value[9].encode('utf-8', 'ignore').decode('utf-8').strip(), 'notes': value[10].encode('utf-8', 'ignore').decode('utf-8').strip() } for match in shared_var['re_aka'].findall(cape['notes']): cape['alias'].append(match[1]) cape['s_name'] = [ cape['name'].lower(), remove_accents(cape['name']).lower() ] cape['s_alias'] = [x.lower() for x in cape['alias']] + [ remove_accents(x).lower() for x in cape['alias'] ] shared_var['capes'].append(cape)
def dibs(bot, trigger): """Claims a cape name. To see all of the cape names you've claimed, use '$dibs'""" if trigger.group(2): name = trigger.group(2).strip() # Make sure the name is not already a cape for id, cape in enumerate(shared_var['capes']): # PERFECT MATCH if any(name.lower() == alias for alias in cape['s_name']): return say( bot, 'This name is already in use. [Cape #' + str(id) + ']') if any(name.lower() == alias for alias in cape['s_alias'][1:]): return say( bot, 'This name is already in use. [Cape #' + str(id) + ']') if name.lower() == cape['s_alias'][0]: return say( bot, 'This name is already in use. [Cape #' + str(id) + ']') # Update the dibs cache say(bot, 'Calling dibs. This might take a moment...') cache_dibs() # Make sure the name is not already claimed cape = next((item for item in shared_var['dibs'] if item['name'].upper() == name.upper()), None) if cape: if cape['owner'].upper() == trigger.nick.upper(): return say(bot, 'You already called dibs on that name.') else: return say( bot, cape['owner'] + ' already called dibs on that name.') # Add it to the spreadsheet owner = trigger.nick spreadsheet = google_sheet_get(shared_var['sheet']) worksheet = spreadsheet.worksheet('Dibs') # Try to find a blank row if len(shared_var['dibs']) + 1 < worksheet.row_count: index = len(shared_var['dibs']) slot = index shared_var['dibs'].append({'name': '', 'owner': ''}) else: slot = None for index, cape in enumerate(shared_var['dibs']): if cape['name'] == '': slot = index break # Update worksheet and cache if slot is not None: worksheet.update_cell(slot + 2, 1, name) worksheet.update_cell(slot + 2, 2, owner) shared_var['dibs'][index]['name'] = name shared_var['dibs'][index]['owner'] = owner else: worksheet.append_row([name, owner]) # Add it to the cache shared_var['dibs'].append({'name': name, 'owner': owner}) return say(bot, 'Done!') else: # Show all capes with dibs capes = [ cape['name'] for cape in shared_var['dibs'] if cape['owner'].upper() == trigger.nick.upper() ] if len(capes) == 0: return say(bot, 'Your have no capes.') else: return say(bot, 'Your capes are: ' + ', '.join(capes))
def cache_cards(bot): bot.memory['card_help'] = {} shared_var['cards'] = {} shared_var['cards_by_keyword'] = {} shared_var['cards_by_group'] = {} shared_var['cards_by_name'] = {} shared_var['card_commands'] = [] shared_var['card_sub_commands'] = [] spreadsheet = google_sheet_get(shared_var['sheet']) worksheets = spreadsheet.worksheets() id = 0 for worksheet in worksheets: values = worksheet.get_all_values() key_group = worksheet.title.lower() key_group = '' if key_group == 'main' else key_group + ' ' for row in values: key_deck = row[0].lower() if key_group == '' and key_deck != 'commands': shared_var['card_sub_commands'].append(key_deck) for col in row[1:]: if col.strip(): help = '' tmp_card = { 'text': col, 'cards': [], 'names': [], 'inline_cards': [], 'odds': 1 } #Inline Cards match = shared_var['re_inline_cards'].search( tmp_card['text']) number = 1 while match and number < 50: tmp_card['inline_cards'].append( [x.strip() for x in match.group(1).split('|')]) tmp_card['text'] = tmp_card['text'][:match.start( 1)] + str(number) + tmp_card['text'][match.end(1):] match = shared_var['re_inline_cards'].search( tmp_card['text']) number = number + 1 #Sub Cards match = shared_var['re_cards'].search(tmp_card['text']) number = 0 while match and number < 50: sub_card_data = match.group(1).split('|') sub_card_data += [''] * (3 - len(sub_card_data)) subcard = {'keyword': [], 'preface': [], 'tags': []} if sub_card_data[0].strip(): subcard['keyword'] = [ x.strip() for x in sub_card_data[0].split(',') ] if sub_card_data[1].strip(): subcard['preface'] = [ x.strip() for x in sub_card_data[1].split(',') ] if sub_card_data[2].strip(): subcard['tags'] = [ x.strip() for x in sub_card_data[2].split(',') ] tmp_card['cards'].append(subcard) tmp_card['text'] = tmp_card['text'][:match.start( )] + tmp_card['text'][match.end():] match = shared_var['re_cards'].search(tmp_card['text']) number = number + 1 #Help match = shared_var['re_card_help'].search(tmp_card['text']) if match: help = match.group(1).strip() tmp_card['text'] = tmp_card['text'][:match.start( )] + tmp_card['text'][match.end():] #Names match = shared_var['re_card_names'].search( tmp_card['text']) number = 0 while match and number < 50: tmp_card['names'].append( match.group(1).strip().lower()) tmp_card['text'] = tmp_card['text'][:match.start( )] + tmp_card['text'][match.end():] match = shared_var['re_card_names'].search( tmp_card['text']) number = number + 1 #Odds match = shared_var['re_card_odds'].search(tmp_card['text']) number = 0 while match and number < 50: if is_integer(match.group(1).strip().lower()): tmp_card['odds'] = int( match.group(1).strip().lower()) tmp_card['text'] = tmp_card['text'][:match.start( )] + tmp_card['text'][match.end():] match = shared_var['re_card_odds'].search( tmp_card['text']) number = number + 1 tmp_card['text'] = tmp_card['text'].strip() tmp_card['id'] = id id = id + 1 #Group + Keyword if key_group + key_deck in shared_var['cards']: shared_var['cards'][key_group + key_deck].append(tmp_card) else: shared_var['cards'][key_group + key_deck] = [tmp_card] #Keyword if key_deck in shared_var['cards_by_keyword']: shared_var['cards_by_keyword'][key_deck].append( tmp_card) else: shared_var['cards_by_keyword'][key_deck] = [tmp_card] #Group if key_group.strip() in shared_var['cards_by_group']: shared_var['cards_by_group'][key_group.strip()].append( tmp_card) else: shared_var['cards_by_group'][key_group.strip()] = [ tmp_card ] #Name for name in tmp_card['names']: if key_group + key_deck + ' ' + name in shared_var[ 'cards_by_name']: shared_var['cards_by_name'][key_group + key_deck + ' ' + name].append(tmp_card) else: shared_var['cards_by_name'][key_group + key_deck + ' ' + name] = [tmp_card] #Commands if key_group + key_deck == 'commands': shared_var['card_commands'] = shared_var[ 'card_commands'] + tmp_card['names'] if help: for name in tmp_card['names']: bot.memory['card_help'][name] = help bot.memory['card_commands'] = shared_var['card_commands']