def finish(bot, event, *args): if ''.join(args) == '?': segments = UtilBot.text_to_segments("""\ *Finish* Usage: /finish <lyrics to finish> <optional: * symbol to show guessed song> Purpose: Finish a lyric! """) yield from bot.send_message_segments(event.conv, segments) else: showguess = False if args[-1] == '*': showguess = True args = args[0:-1] lyric = ' '.join(args) songs = Genius.search_songs(lyric) if len(songs) < 1: yield from bot.send_message(event.conv, "I couldn't find your lyrics.") if songs[0].artist.name == 'James Joyce': yield from bot.send_message(event.conv, "Sorry, that author is banned.") return lyrics = songs[0].raw_lyrics anchors = {} lyrics = lyrics.split('\n') currmin = (0, UtilBot.levenshtein_distance(lyrics[0], lyric)[0]) for x in range(1, len(lyrics) - 1): try: currlyric = lyrics[x] if not currlyric.isspace(): # Returns the distance and whether or not the lyric had to be chopped to compare result = UtilBot.levenshtein_distance(currlyric, lyric) else: continue distance = abs(result[0]) lyrics[x] = lyrics[x], result[1] if currmin[1] > distance: currmin = (x, distance) if currlyric.startswith('[') and currlyric not in anchors: next = UtilBot.find_next_non_blank(lyrics, x) anchors[currlyric] = lyrics[next] except Exception: pass next = UtilBot.find_next_non_blank(lyrics, currmin[0]) chopped = lyrics[currmin[0]][1] found_lyric = lyrics[currmin[0]][0] + " " + lyrics[next][0] if chopped else lyrics[next][0] if found_lyric.startswith('['): found_lyric = anchors[found_lyric] if showguess: segments = [hangups.ChatMessageSegment(found_lyric), hangups.ChatMessageSegment('\n', hangups.SegmentType.LINE_BREAK), hangups.ChatMessageSegment(songs[0].name)] yield from bot.send_message_segments(event.conv, segments) else: yield from bot.send_message(event.conv, found_lyric) return
def finish(bot, event, *args): if ''.join(args) == '?': segments = [hangups.ChatMessageSegment('Finish', is_bold=True), hangups.ChatMessageSegment('\n', hangups.SegmentType.LINE_BREAK), hangups.ChatMessageSegment( 'Usage: /finish <lyrics to finish> <optional: * symbol to show guessed song>'), hangups.ChatMessageSegment('\n', hangups.SegmentType.LINE_BREAK), hangups.ChatMessageSegment('Purpose: Finish a lyric!')] bot.send_message_segments(event.conv, segments) else: showguess = False if args[-1] == '*': showguess = True args = args[0:-1] lyric = ' '.join(args) songs = Genius.search_songs(lyric) if len(songs) < 1: bot.send_message(event.conv, "I couldn't find your lyrics.") lyrics = songs[0].raw_lyrics anchors = {} lyrics = lyrics.split('\n') currmin = (0, UtilBot.levenshtein_distance(lyrics[0], lyric)[0]) for x in range(1, len(lyrics) - 1): try: currlyric = lyrics[x] if not currlyric.isspace(): # Returns the distance and whether or not the lyric had to be chopped to compare result = UtilBot.levenshtein_distance(currlyric, lyric) else: continue distance = abs(result[0]) lyrics[x] = lyrics[x], result[1] if currmin[1] > distance: currmin = (x, distance) if currlyric.startswith('[') and currlyric not in anchors: next = UtilBot.find_next_non_blank(lyrics, x) anchors[currlyric] = lyrics[next] except Exception: pass next = UtilBot.find_next_non_blank(lyrics, currmin[0]) chopped = lyrics[currmin[0]][1] found_lyric = lyrics[currmin[0]][0] + " " + lyrics[next][0] if chopped else lyrics[next][0] if found_lyric.startswith('['): found_lyric = anchors[found_lyric] if showguess: segments = [hangups.ChatMessageSegment(found_lyric), hangups.ChatMessageSegment('\n', hangups.SegmentType.LINE_BREAK), hangups.ChatMessageSegment(songs[0].name)] bot.send_message_segments(event.conv, segments) else: bot.send_message(event.conv, found_lyric) return