From 5d1402d5c55574f7b13d24e53029317d94b0509b Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Fri, 28 Jun 2019 09:36:36 -0400 Subject: [PATCH] test start of file reading --- MANIFEST.in | 1 + sopel_modules/SpiceBot/Commands.py | 18 +- sopel_modules/SpiceBot/DictComs.py | 66 ++-- sopel_modules/SpiceBot/Read.py | 44 ++- sopel_modules/SpiceBot_Text/compliments | 20 ++ sopel_modules/SpiceBot_Text/dannysam | 4 + sopel_modules/SpiceBot_Text/devexcuse | 145 +++++++++ sopel_modules/SpiceBot_Text/ferengi_rules | 285 ++++++++++++++++++ sopel_modules/SpiceBot_Text/internet_rules | 47 +++ sopel_modules/SpiceBot_Text/jukebox_christmas | 3 + sopel_modules/SpiceBot_Text/jukebox_friday | 6 + sopel_modules/SpiceBot_Text/jukebox_party | 26 ++ sopel_modules/SpiceBot_Text/momsspaghetti | 66 ++++ sopel_modules/SpiceBot_Text/proverbs | 97 ++++++ 14 files changed, 794 insertions(+), 34 deletions(-) create mode 100644 sopel_modules/SpiceBot_Text/compliments create mode 100644 sopel_modules/SpiceBot_Text/dannysam create mode 100644 sopel_modules/SpiceBot_Text/devexcuse create mode 100644 sopel_modules/SpiceBot_Text/ferengi_rules create mode 100644 sopel_modules/SpiceBot_Text/internet_rules create mode 100644 sopel_modules/SpiceBot_Text/jukebox_christmas create mode 100644 sopel_modules/SpiceBot_Text/jukebox_friday create mode 100644 sopel_modules/SpiceBot_Text/jukebox_party create mode 100644 sopel_modules/SpiceBot_Text/momsspaghetti create mode 100644 sopel_modules/SpiceBot_Text/proverbs diff --git a/MANIFEST.in b/MANIFEST.in index ac4d111..5499f2f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,3 +7,4 @@ recursive-include tests * recursive-exclude * __pycache__ recursive-exclude * *.py[co] recursive-include sopel_modules/SpiceBot_Configs/* * +recursive-include sopel_modules/SpiceBot_Text/* diff --git a/sopel_modules/SpiceBot/Commands.py b/sopel_modules/SpiceBot/Commands.py index 8b70afb..15ee7f3 100644 --- a/sopel_modules/SpiceBot/Commands.py +++ b/sopel_modules/SpiceBot/Commands.py @@ -104,7 +104,7 @@ class BotCommands(): return self.dict['disabled'][disabletype]["users"] elif botchannels.check_channel_bot(target, True): if not len(list(self.dict['disabled'][disabletype]["channels"])): - self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {} + self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_' + disabletype + 'disabled') or {} return self.dict['disabled'][disabletype]["channels"] else: raise Exception(str(target.lower()) + " appears to not be a valid user/channel") @@ -128,14 +128,14 @@ class BotCommands(): } if botdb.check_nick_id(target): if not len(list(self.dict['disabled'][disabletype]["users"])): - self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_disabled') or {} + self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_' + disabletype + 'disabled') or {} self.dict['disabled'][disabletype]["users"][command] = {"reason": reason, "timestamp": timestamp, "disabledby": bywhom} - botdb.set_nick_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["users"]) + botdb.set_nick_value(target, 'commands_' + disabletype + 'disabled', self.dict['disabled'][disabletype]["users"]) elif botchannels.check_channel_bot(target, True): if not len(list(self.dict['disabled'][disabletype]["channels"])): - self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {} + self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_' + disabletype + 'disabled') or {} self.dict['disabled'][disabletype]["channels"][command] = {"reason": reason, "timestamp": timestamp, "disabledby": bywhom} - botdb.set_channel_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["channels"]) + botdb.set_channel_value(target, 'commands_' + disabletype + 'disabled', self.dict['disabled'][disabletype]["channels"]) else: raise Exception(str(target.lower()) + " appears to not be a valid user/channel") @@ -147,16 +147,16 @@ class BotCommands(): } if botdb.check_nick_id(target): if not len(list(self.dict['disabled'][disabletype]["users"])): - self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_disabled') or {} + self.dict['disabled'][disabletype]["users"] = botdb.get_nick_value(target, 'commands_' + disabletype + 'disabled') or {} if command in list(self.dict['disabled'][disabletype]["users"].keys()): del self.dict['disabled'][disabletype]["users"][command] - botdb.set_nick_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["users"]) + botdb.set_nick_value(target, 'commands_' + disabletype + 'disabled', self.dict['disabled'][disabletype]["users"]) elif botchannels.check_channel_bot(target, True): if not len(list(self.dict['disabled'][disabletype]["channels"])): - self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_disabled') or {} + self.dict['disabled'][disabletype]["channels"] = botdb.get_channel_value(target, 'commands_' + disabletype + 'disabled') or {} if command in list(self.dict['disabled'][disabletype]["channels"].keys()): del self.dict['disabled'][disabletype]["channels"][command] - botdb.set_channel_value(target, 'commands_disabled', self.dict['disabled'][disabletype]["channels"]) + botdb.set_channel_value(target, 'commands_' + disabletype + 'disabled', self.dict['disabled'][disabletype]["channels"]) else: raise Exception(str(target.lower()) + " appears to not be a valid user/channel") diff --git a/sopel_modules/SpiceBot/DictComs.py b/sopel_modules/SpiceBot/DictComs.py index cf776cc..0035208 100644 --- a/sopel_modules/SpiceBot/DictComs.py +++ b/sopel_modules/SpiceBot/DictComs.py @@ -11,10 +11,8 @@ from sopel.config.types import StaticSection, ListAttribute from .Config import config as botconfig from .Read import read as botread from .Commands import commands as botcommands +from .Database import db as botdb -# import requests -from fake_useragent import UserAgent -# import urllib import os import copy @@ -27,7 +25,6 @@ class BotDictCommands(): def __init__(self): self.setup_dictcoms() - self.header = {'User-Agent': str(UserAgent().chrome)} self.valid_com_types = ['simple'] self.valid_com_types_old = [ 'simple', 'fillintheblank', 'targetplusreason', @@ -129,9 +126,6 @@ class BotDictCommands(): else: dict_from_file[mustbe]["type"] = "simple" - return dict_from_file - - """ # each usecase needs to know if it can be updated. Default is false if "updates_enabled" not in list(dict_from_file[mustbe].keys()): dict_from_file[mustbe]["updates_enabled"] = False @@ -180,9 +174,9 @@ class BotDictCommands(): if not isinstance(dict_from_file[mustbe]["response_fail"], list): dict_from_file[mustbe]["response_fail"] = [dict_from_file[mustbe]["response_fail"]] - # if dict_from_file[mustbe]["updates_enabled"]: - # adjust_nick_array(bot, str(bot.nick), 'long', 'sayings', maincom + "_" + str(mustbe), dict_from_file[mustbe]["responses"], 'startup') - # dict_from_file[mustbe]["responses"] = get_nick_value(bot, str(bot.nick), 'long', 'sayings', maincom + "_" + str(mustbe)) or [] + if dict_from_file[mustbe]["updates_enabled"]: + self.adjust_nick_array(str(botconfig.nick), 'sayings', maincom + "_" + str(mustbe), dict_from_file[mustbe]["responses"], 'startup') + dict_from_file[mustbe]["responses"] = botdb.get_plugin_value("dictcom", maincom + "_" + str(mustbe)) or [] # each usecase needs a response if "responses" not in list(dict_from_file[mustbe].keys()): @@ -190,20 +184,17 @@ class BotDictCommands(): # verify responses are in list form if not isinstance(dict_from_file[mustbe]["responses"], list): - # TODO read text files - # if dict_from_file[mustbe]["responses"] in bot.memory["botdict"]["tempvals"]['txt_files'].keys(): - # dict_from_file[mustbe]["responses"] = bot.memory["botdict"]["tempvals"]['txt_files'][dict_from_file[mustbe]["responses"]] - if str(dict_from_file[mustbe]["responses"]).startswith(tuple(["https://", "http://"])): - try: - page = requests.get(dict_from_file[mustbe]["responses"], headers=self.header) - except Exception as e: - page = e - page = None - if page and not str(page.status_code).startswith(tuple(["4", "5"])): - htmlfile = urllib.request.urlopen(dict_from_file[mustbe]["responses"]) - lines = htmlfile.read().splitlines() - dict_from_file[mustbe]["responses"] = lines + # text files + if dict_from_file[mustbe]["responses"] in list(botread.dict["text"].keys()): + dict_from_file[mustbe]["responses"] = botread.dict["text"][dict_from_file[mustbe]["responses"]]["lines"] + + if str(dict_from_file[mustbe]["responses"]).startswith(tuple(["https://", "http://"])): + botread.webpage_to_list(dict_from_file[mustbe]["responses"]) + # TODO assign dict value, but don't load until needed + # TODO use botdb to store an offline version + if dict_from_file[mustbe]["responses"] in list(botread.dict["webpage"].keys()): + dict_from_file[mustbe]["responses"] = botread.dict["webpage"][dict_from_file[mustbe]["responses"]]["lines"] else: dict_from_file[mustbe]["responses"] = [dict_from_file[mustbe]["responses"]] @@ -273,7 +264,34 @@ class BotDictCommands(): dict_from_file[mustbe]["privs"] = [] return dict_from_file - """ + + def adjust_nick_array(nick, sortingkey, usekey, values, direction): + + if not isinstance(values, list): + values = [values] + + oldvalues = botdb.get_nick_value(nick, usekey, sortingkey) or [] + + # startup entries + if direction == 'startup': + if oldvalues == []: + direction == 'add' + else: + return + + # adjust + for value in values: + if direction == 'add': + if value not in oldvalues: + oldvalues.append(value) + elif direction == 'startup': + if value not in oldvalues: + oldvalues.append(value) + elif direction in ['del', 'remove']: + if value in oldvalues: + oldvalues.remove(value) + + botdb.set_nick_value(nick, usekey, oldvalues, sortingkey) def setup_dictcoms(self): botconfig.define_section("SpiceBot_DictComs", SpiceBot_DictComs_MainSection, validate=False) diff --git a/sopel_modules/SpiceBot/Read.py b/sopel_modules/SpiceBot/Read.py index 2cc3ff1..0b3e33e 100644 --- a/sopel_modules/SpiceBot/Read.py +++ b/sopel_modules/SpiceBot/Read.py @@ -6,6 +6,9 @@ import sopel_modules import os import codecs +import requests +import urllib +from fake_useragent import UserAgent from .Logs import logs from .Config import config as botconfig @@ -14,7 +17,46 @@ from .Config import config as botconfig class BotRead(): def __init__(self): - self.dict = dict() + self.header = {'User-Agent': str(UserAgent().chrome)} + self.dict = { + "text": {}, + "webpage": {}, + } + self.load_txt_files() + + def load_txt_files(self): + dir_to_scan = [] + for plugin_dir in set(sopel_modules.__path__): + textdir = os.path.join(plugin_dir, "SpiceBot_Text") + if os.path.exists(textdir) and os.path.isdir(textdir): + if len(os.listdir(textdir)) > 0: + dir_to_scan.append(textdir) + # iterate over files within + for directory in dir_to_scan: + for txtfile in os.listdir(directory): + text_file_list = [] + text_file = open(os.path.join(directory, txtfile), 'r') + lines = text_file.readlines() + for line in lines: + text_file_list.append(line) + text_file.close() + self.dict["text"][txtfile] = { + "lines": text_file_list + } + + def webpage_to_list(self, url): + try: + page = requests.get(url, headers=self.header) + except Exception as e: + page = e + page = None + + if page and not str(page.status_code).startswith(tuple(["4", "5"])): + htmlfile = urllib.request.urlopen(url) + lines = htmlfile.read().splitlines() + self.dict["webpage"][url] = { + "lines": lines + } def get_config_dirs(self, config_dir_name): dir_to_scan = [] diff --git a/sopel_modules/SpiceBot_Text/compliments b/sopel_modules/SpiceBot_Text/compliments new file mode 100644 index 0000000..34e0248 --- /dev/null +++ b/sopel_modules/SpiceBot_Text/compliments @@ -0,0 +1,20 @@ +You make people feel good about themselves. +You're such a good listener. +You're really going to make a difference in the world someday. +I'm so glad I met you. +I never get tired of being around you. +You make people feel important. +You're so understanding. +I feel like I can tell you anything. +You're a strong person. +You're so good at being creative. +You can lead people without being bossy. +Your happiness is contagious. +Our conversations always make me feel better. +I can always count on you to be there for me. +It's amazing how far out of your way you go to help people. +You're a selfless person. +You are always so much fun to be around. +You can make people laugh on their worst days. +You're so good at making people feel welcome. +I couldn't imagine my life without you. diff --git a/sopel_modules/SpiceBot_Text/dannysam b/sopel_modules/SpiceBot_Text/dannysam new file mode 100644 index 0000000..e3c122b --- /dev/null +++ b/sopel_modules/SpiceBot_Text/dannysam @@ -0,0 +1,4 @@ +ham +cheese +steak +meatloaf diff --git a/sopel_modules/SpiceBot_Text/devexcuse b/sopel_modules/SpiceBot_Text/devexcuse new file mode 100644 index 0000000..5e20afe --- /dev/null +++ b/sopel_modules/SpiceBot_Text/devexcuse @@ -0,0 +1,145 @@ +It was working in my head +Even though it doesn't work, how does it feel? +Oh, you said you DIDN'T want that to happen? +THIS can't be the source of THAT +I thought he knew the context of what I was talking about +I can have a look but there's a lot of if statements in that code! +It works, but it's not been tested +The accounting department must have cancelled that subscription +The marketing department made us put that there +I couldn't find any examples of how that can be done anywhere else in the project +Oh, that was only supposed to be a placeholder +That's not a bug it's a configuration issue +It must be because of a leap second +I'm not getting any error codes +It's just some unlucky coincidence +I haven't been able to reproduce that +I forgot to commit the code that fixes that +It would have taken twice as long to build it properly +What did I tell you about using parts of the system you don't understand? +I didn't create that part of the program +I must have been stress testing our production server +Our hardware is too slow to cope with demand +I thought I finished that +The original specification contained conflicting requirements +That isn't covered by my job description +There was too little data to bother with the extra functionality at the time +Maybe somebody forgot to pay our hosting company +That wouldn't be economically feasible +I didn't anticipate that I would make any errors +Well, at least it displays a very pretty error +It's never done that before +I thought I fixed that +You're doing it wrong +It's not a code problem - our users need more training +Our code quality is no worse than anyone else in the industry +Well done, you found my easter egg! +It's a third party application issue +I can't test everything +I'm not familiar with it so I didn't fix it in case I made it worse +There were too many developers working on that same thing +I can't make that a priority right now +That feature would be outside of the scope +I haven't had any experience with that before +I have never seen that before in my life +Why do you want to do it that way? +It's never shown unexpected behaviour like this before +That important email must have been marked as spam +There's currently a problem with our hosting company +It would take too long to rewrite the code from scratch +I'm surprised that was working at all +The specifications were ambiguous +I have too many other high priority things to do right now +I thought you signed off on that? +You must have the wrong version +How is that possible? +Did you check for a virus on your system? +The existing design makes it difficult to do the right thing +I had to do the project backwards as people demanded results out of order +The request must have dropped some packets +That was literally a one in a million error +I'll have to fix that at a later date +We spent three months debugging it because we only had one month to build it +That behaviour is in the original specification +It worked yesterday +The user must not know how to use it +Don't worry, that value is only wrong half of the time +It's a known bug with the server software +Well at least we know not to try that again +The program has never collected that information +In the interest of efficiency I only check my email for that on a Friday +The third party API is not responding +My time was split in a way that meant I couldn't do either project properly +That worked perfectly when I developed it +The third party documentation is wrong +This is a previously known bug you told me not to work on yet +Nobody asked me how long it would actually take +That code was written by the last guy +I heard there was a solar flare today +You must be missing some of the dependencies +I haven't touched that code in weeks +It's a known bug with the programming language +Our internet connection must not be working +The WYSIWYG must have produced an invalid output +It must be a firewall issue +Well, that's a first +I did a quick fix last time but it broke when we rebooted +It must be because of a leap year +The problem seems to be with our legacy software +The third party documentation doesn't exist +It can't be broken, it passes all unit tests +I told you yesterday it would be done by the end of today +The client wanted it changed at the last minute +We didn't have enough time to peer review the final changes +The project manager said no one would want that feature +I usually get a notification when that happens +You can't use that version on your system +I was just fixing that +It's always been like that +It's a remote vendor issue +I'm surprised it works as well as it does +This code was not supposed to go in to production yet +I haven't had the chance to run that code yet +Your browser must be caching the old content +Everything looks fine my end +It's a browser compatibility issue +It works for me +I broke that deliberately to do some testing +That feature was slated for phase two +Actually, that's a feature +Oh, that was just a temporary fix +That code seemed so simple I didn't think it needed testing +You must have done something wrong +There must be something strange in your data +The unit test doesn't cover that eventuality +The client must have been hacked +It's a character encoding issue +The project manager told me to do it that way +It must be a hardware problem +That process requires human oversight that nobody was providing +I was told to stop working on that when something important came up +I couldn't find any examples of how that can be done anywhere online +I couldn't find any library that can even do that +Management insisted we wouldn't need to waste our time writing unit tests +I must not have understood what you were asking for +It probably won't happen again +It's an unexpected emergent behaviour of several last minute abstractions +Somebody must have changed my code +The code is compiling +That's already fixed it just hasn't taken effect yet +We outsourced that months ago +That wasn't in the original specification +That's the fault of the graphic designer +That's interesting, how did you manage to make it do that? +That error means it was successful +I'm not sure as I've never had a look at how that works before +I'm still working on that as we speak +Where were you when the program blew up? +Our redundant systems must have failed as well +The download must have been corrupted +No one told me so I was forced to assume which way to do that +The person responsible doesn't work here anymore +I didn't receive a ticket for it +What did you type in wrong to get it to crash? +We should have updated our software years ago +Nobody has ever complained about it diff --git a/sopel_modules/SpiceBot_Text/ferengi_rules b/sopel_modules/SpiceBot_Text/ferengi_rules new file mode 100644 index 0000000..804729c --- /dev/null +++ b/sopel_modules/SpiceBot_Text/ferengi_rules @@ -0,0 +1,285 @@ +1 "Once you have their money, you never give it back." "The Nagus" (DS9 episode) +2 "The best deal is the one that makes the most profit." The 34th Rule (DS9 novel) +3 "Never spend more for an acquisition than you have to." "The Maquis, Part II" (DS9 episode) +4 "A woman wearing clothes is like a man in the kitchen." The Ferengi Rules of Acquisition (DS9 novel) +5 "Always exaggerate your estimates." Cold Fusion (SCE novel) +6 "Never let family stand in the way of opportunity." "The Nagus" (DS9 episode) +7 "Always keep your ears open." "In the Hands of the Prophets" (DS9 episode) +8 "Small print leads to large risk." The Ferengi Rules of Acquisition (DS9 novel) +9 "Instinct, plus opportunity, equals profit." "The Storyteller" (DS9 episode) +10 "Greed is eternal." "Prophet Motive" (VOY episode) +11 "Even if its free, you can always buy it cheaper." The Ferengi Rules of Acquisition (DS9 novel) +12 "Anything worth selling is worth selling twice." The Ferengi Rules of Acquisition (DS9 novel) +13 "Anything worth doing is worth doing for money." Legends of the Ferengi (DS9 novel) +14 There is no cannonized rule tied to this number +15 "Dead men close no deals." Demons of Air and Darkness (DS9 novel) +16 "A deal is a deal (is a deal)...until a better one comes along." The Ferengi Rules of Acquisition (DS9 novel) +17 "A contract is a contract is a contract... but only between Ferengi." "Body Parts" (DS9 episode) +18 "A Ferengi without profit is no Ferengi at all." "Heart of Stone" (DS9 episode) +19 "Satisfaction is not guaranteed." Legends of the Ferengi (DS9 novel) +20 "He who dives under the table today lives to profit tomorrow." Ferenginar: Satisfaction is Not Guaranteed (DS9 novella) +21 "Never place friendship before profit." "Rules of Acquisition" (DS9 episode) +22 "Wise men can hear profit in the wind." "Rules of Acquisition" (DS9 episode) +23 "Nothing is more important than your health...except for your money." "Acquisition" (ENT episode) +24 There is no cannonized rule tied to this number +25 "You can't make a deal if you're dead." "The Siege of Ar-558" (DS9 episode) +26 There is no cannonized rule tied to this number +27 "There's nothing more dangerous than an honest businessman." Legends of the Ferengi (DS9 novel) +28 There is no cannonized rule tied to this number +29 "What's in it for me?" Highest Score (DS9 novel) +30 "A wise man knows that confidentiality equals profit." The Badlands, Part IV (DS9 novel) +31 "Never make fun of a Ferengi's mother." "The Siege" (DS9 episode) +32 "Insult something he cares about." "Elite Force II" +33 "It never hurts to suck up to the boss." "Rules of Acquisition" (DS9 episode) +34 "War is good for business." "Destiny" (DS9 episode); The 34th Rule (DS9 novel) +35 "Peace is good for business." "Destiny" (DS9 episode); The 34th Rule (DS9 novel) +36 There is no cannonized rule tied to this number +37 "The early investor reaps the most interest." ST novella: Reservoir Ferengi +38 There is no cannonized rule tied to this number +39 There is no cannonized rule tied to this number +40 "She can touch your lobes but never your latinum." The Ferengi Rules of Acquisition (DS9 novel) +41 "Profit is its own reward." The Ferengi Rules of Acquisition (DS9 novel) +42 There is no cannonized rule tied to this number +43 "Feed your greed, but not enough to choke it." The Buried Age (TNG novel) +44 "Never confuse wisdom with luck." The Ferengi Rules of Acquisition (DS9 novel) +45 "Expand or die.*" "Acquisition" (ENT episode) +46 There is no cannonized rule tied to this number +47 "Never trust a man wearing a better suit than your own." "Rivals" (DS9 episode) +48 "The bigger the smile, the sharper the knife." "Rules of Acquisition" (DS9 episode) +49 There is no cannonized rule tied to this number +50 There is no cannonized rule tied to this number +51 There is no cannonized rule tied to this number +52 "Never ask when you can take." The Ferengi Rules of Acquisition (DS9 novel) +53 "Never trust anybody taller than you." Mission Gamma: Twilight (DS9 novel) +54 "Rate divided by time equals profit." (Also known as "The Velocity of Wealth.") Raise the Dawn (Typhon Pact novel) +55 "Take joy from profit, and profit from joy." Worlds of Deep Space Nine: Bajor: Fragments and Omens (DS9 novel) +56 There is no cannonized rule tied to this number +57 "Good customers are almost as rare as latinum...treasure them." "Armageddon Game" (DS9 episode) +58 "There is no substitute for success." The Ferengi Rules of Acquisition (DS9 novel) +59 "Free advice is seldom cheap." "Rules of Acquisition" (DS9 episode) +60 "Keep your lies consistent." The Ferengi Rules of Acquisition (DS9 novel) +61 There is no cannonized rule tied to this number +62 "The riskier the road, the greater the profit." "Rules of Acquisition" (DS9 episode) +63 "Work is the best therapy-at least for your employees." "Over a Torrent Sea" (TTN novel) +64 There is no cannonized rule tied to this number +65 "Win or lose, there's always Hupyrian beetle snuff." The Ferengi Rules of Acquisition (DS9 novel) +66 There is no cannonized rule tied to this number +67 There is no cannonized rule tied to this number +68 There is no cannonized rule tied to this number +69 "Ferengi are not responsible for the stupidity of other races." Balance of Power (TNG novel) +70 There is no cannonized rule tied to this number +71 There is no cannonized rule tied to this number +72 There is no cannonized rule tied to this number +73 There is no cannonized rule tied to this number +74 "Knowledge equals profit." "Inside Man" (VOY episode) +75 "Home is where the heart is, but the stars are made of latinum." "Civil Defense" (DS9 episode) +76 "Every once in a while, declare peace. It confuses the Hell out of your enemies." "The Homecoming" (DS9 episode) +77 "If you break it, you bought it." Star Trek Online +78 There is no cannonized rule tied to this number +79 "Beware of the Vulcan greed for knowledge." The Ferengi Rules of Acquisition (DS9 novel) +80 There is no cannonized rule tied to this number +81 There is no cannonized rule tied to this number +82 "The flimsier the product, the higher the price." The Ferengi Rules of Acquisition (DS9 novel) +83 There is no cannonized rule tied to this number +84 There is no cannonized rule tied to this number +85 "Never let the competition know what you're thinking." The Ferengi Rules of Acquisition (DS9 novel) +86 There is no cannonized rule tied to this number +87 "Learn the customer's weaknesses, so that you can better take advantage of him." Highest Score (DS9 novel) +88 "It ain't over 'til its over." Ferenginar: Satisfaction is Not Guaranteed (DS9 novella) +89 "Ask not what you can do for your profits, but what your profits can do for you." The Ferengi Rules of Acquisition (DS9 novel) +90 There is no cannonized rule tied to this number +91 There is no cannonized rule tied to this number +92 "There are many paths to profit." Highest Score (DS9 novel) +93 There is no cannonized rule tied to this number +94 "Females and finances don't mix." "Ferengi Love Songs" (DS9 episode) +95 "Expand or die.*" "False Profits" (VOY episode) +96 There is no cannonized rule tied to this number +97 "Enough...is never enough." The Ferengi Rules of Acquisition (DS9 novel) +98 "Every man has his price." "In the Pale Moonlight" (DS9 episode) +99 "Trust is the biggest liability of all." The Ferengi Rules of Acquisition (DS9 novel) +100 There is no cannonized rule tied to this number +101 There is no cannonized rule tied to this number +102 "Nature decays, but latinum lasts forever." "The Jem'Hadar" (DS9 episode) +103 "Sleep can interfere with..." "Rules of Acquisition" (DS9 episode) +104 "Faith moves mountains...of inventory." The Ferengi Rules of Acquisition (DS9 novel) +105 There is no cannonized rule tied to this number +106 "There is no honor in poverty." The Ferengi Rules of Acquisition (DS9 novel) +107 There is no cannonized rule tied to this number +108 There is no cannonized rule tied to this number +109 "Dignity and an empty sack is worth the sack." "Rivals" (DS9 episode) +110 "Exploitation begins at home." Star Trek Online +111 "Treat people in your debt like family... exploit them." "Past Tense, Part I" (DS9 episode) +112 "Never have sex with the boss' sister." "Playing God" (DS9 episode) +113 "Always have sex with the boss." The Ferengi Rules of Acquisition (DS9 novel) +114 There is no cannonized rule tied to this number +115 There is no cannonized rule tied to this number +116 There is no cannonized rule tied to this number +117 There is no cannonized rule tied to this number +118 There is no cannonized rule tied to this number +119 There is no cannonized rule tied to this number +120 There is no cannonized rule tied to this number +121 "Everything is for sale - even friendship." The Ferengi Rules of Acquisition (DS9 novel) +122 There is no cannonized rule tied to this number +123 "Even a blind man can recognize the glow of Latinum." The Ferengi Rules of Acquisition (DS9 novel) +124 There is no cannonized rule tied to this number +125 "You can't make a deal if you're dead." "The Siege of AR-558" (DS9 episode) +126 There is no cannonized rule tied to this number +127 There is no cannonized rule tied to this number +128 There is no cannonized rule tied to this number +129 There is no cannonized rule tied to this number +130 There is no cannonized rule tied to this number +131 There is no cannonized rule tied to this number +132 There is no cannonized rule tied to this number +134 There is no cannonized rule tied to this number +135 There is no cannonized rule tied to this number +136 There is no cannonized rule tied to this number +137 There is no cannonized rule tied to this number +138 There is no cannonized rule tied to this number +139 There is no cannonized rule tied to this number +139 "Wives serve; brother inherit." "Necessary Evil" (DS9 episode) +140 There is no cannonized rule tied to this number +141 "Only fools pay retail." The Ferengi Rules of Acquisition (DS9 novel) +142 There is no cannonized rule tied to this number +143 There is no cannonized rule tied to this number +144 "There's nothing wrong with charity... as long as it winds up in your pocket." Legends of the Ferengi (DS9 novel) +145 There is no cannonized rule tied to this number +146 There is no cannonized rule tied to this number +147 "People love the bartender." Fearful Symmetry (DS9 novel) +148 There is no cannonized rule tied to this number +149 There is no cannonized rule tied to this number +150 There is no cannonized rule tied to this number +151 There is no cannonized rule tied to this number +152 There is no cannonized rule tied to this number +153 "Sell the sizzle, not the steak." "Deep Space Mine" (DS9 comic) +154 There is no cannonized rule tied to this number +156 There is no cannonized rule tied to this number +157 There is no cannonized rule tied to this number +158 There is no cannonized rule tied to this number +159 There is no cannonized rule tied to this number +160 There is no cannonized rule tied to this number +170 There is no cannonized rule tied to this number +171 There is no cannonized rule tied to this number +162 "Even in the worst of times, someone turns a profit." The Ferengi Rules of Acquisition (DS9 novel) +163 There is no cannonized rule tied to this number +164 There is no cannonized rule tied to this number +165 There is no cannonized rule tied to this number +166 There is no cannonized rule tied to this number +167 There is no cannonized rule tied to this number +168 "Whisper your way to success." "Treachery, Faith, and the Great River" (DS9 episode) +169 There is no cannonized rule tied to this number +170 There is no cannonized rule tied to this number +171 There is no cannonized rule tied to this number +172 There is no cannonized rule tied to this number +173 There is no cannonized rule tied to this number +174 There is no cannonized rule tied to this number +175 There is no cannonized rule tied to this number +176 There is no cannonized rule tied to this number +177 "Know your enemies... but do business with them always." The Ferengi Rules of Acquisition (DS9 novel) +178 There is no cannonized rule tied to this number +179 There is no cannonized rule tied to this number +180 There is no cannonized rule tied to this number +181 "Not even dishonesty can tarnish the shine of profit." The Ferengi Rules of Acquisition (DS9 novel) +182 There is no cannonized rule tied to this number +183 "When life hands you ungaberries, make detergent." Hollow Men (DS9 novel) +184 "A Ferengi waits to bid until his opponents have exhausted themselves." Balance of Power (TNG novel) +185 There is no cannonized rule tied to this number +186 There is no cannonized rule tied to this number +187 There is no cannonized rule tied to this number +188 "Not even dishonesty can tarnish the shine of profit." Star Trek Online +189 "Let others keep their reputation. You keep their money." The Ferengi Rules of Acquisition (DS9 novel) +190 "Hear all, trust nothing." DS9 episode: "Call to Arms" +191 There is no cannonized rule tied to this number +192 "Never cheat a Klingon... unless you're sure you can get away with it." The Ferengi Rules of Acquisition (DS9 novel) +193 "Trouble comes in threes." Star Trek Online +194 "It's always good business to know about new customers before they walk in your door." "Whispers" (DS9 episode) +195 There is no cannonized rule tied to this number +196 There is no cannonized rule tied to this number +197 There is no cannonized rule tied to this number +198 There is no cannonized rule tied to this number +199 "Location, location, location." The Soul Key (DS9 novel) +200 "A Ferengi chooses no side but his own" (DS9 novel: Ferenginar: Satisfaction is Not Guaranteed) +201 There is no cannonized rule tied to this number +202 "The justification for profit is profit." The Ferengi Rules of Acquisition (DS9 reference book) +203 "New customers are like razor-toothed gree worms. They can be succulent, but sometimes they bite back." DS9 episode: "Little Green Men" +204 There is no cannonized rule tied to this number +205 There is no cannonized rule tied to this number +206 There is no cannonized rule tied to this number +207 There is no cannonized rule tied to this number +208 "Sometimes, the only thing more dangerous than a question is an answer." DS9 episode: "Ferengi Love Songs" +209 There is no cannonized rule tied to this number +210 There is no cannonized rule tied to this number +211 "Employees are the rungs on the ladder of success, don't hesitate to step on them." DS9 episode: "Bar Association" +212 "A good lie is easier to believe than the truth." Star Trek Online +213 There is no cannonized rule tied to this number +214 "Never begin a business transaction on an empty stomach." DS9 episode: "The Maquis, Part I" +215 There is no cannonized rule tied to this number +216 "Never gamble with a telepath." DS9 novel: The Laertian Gamble +217 "You can't free a fish from water." DS9 episode: "Past Tense, Part I" +218 "Always know what you're buying." The Ferengi Rules of Acquisition (DS9 reference book) OR 218 "Sometimes what you get free cost entirely too much." Baby on Board (DS9 Malibu Comics) +219 "Possession is eleven-tenths of the law!" TNG novel: Balance of Power +220 There is no cannonized rule tied to this number +221 There is no cannonized rule tied to this number +222 There is no cannonized rule tied to this number +223 "Beware the man who doesn't take time for Oo-mox." The Ferengi Rules of Acquisition (DS9 reference book) +224 There is no cannonized rule tied to this number +225 There is no cannonized rule tied to this number +226 There is no cannonized rule tied to this number +227 "If that's what's written, then that's what's written." Star Trek Online +228 There is no cannonized rule tied to this number +229 "Latinum lasts longer than lust." DS9 episode: "Ferengi Love Songs" +230 There is no cannonized rule tied to this number +231 There is no cannonized rule tied to this number +232 There is no cannonized rule tied to this number +233 There is no cannonized rule tied to this number +234 There is no cannonized rule tied to this number +235 "Duck; death is tall." Mission Gamma: Twilight (DS9 novel) +236 "You can't buy fate." The Ferengi Rules of Acquisition (DS9 reference book) +237 There is no cannonized rule tied to this number +238 There is no cannonized rule tied to this number +239 "Never be afraid to mislabel a product." DS9 episode: "Body Parts" +240 "Time, like latinum, is a highly limited commodity." Star Trek Online +241 There is no cannonized rule tied to this number +242 "More is good...all is better." The Ferengi Rules of Acquisition (DS9 reference book) +243 There is no cannonized rule tied to this number +244 There is no cannonized rule tied to this number +245 There is no cannonized rule tied to this number +246 There is no cannonized rule tied to this number +247 There is no cannonized rule tied to this number +248 There is no cannonized rule tied to this number +249 There is no cannonized rule tied to this number +250 There is no cannonized rule tied to this number +251 There is no cannonized rule tied to this number +252 There is no cannonized rule tied to this number +253 There is no cannonized rule tied to this number +254 There is no cannonized rule tied to this number +255 "A wife is [a] luxury... a smart accountant a neccessity." The Ferengi Rules of Acquisition (DS9 reference book) +256 There is no cannonized rule tied to this number +257 "When the messenger comes to appropriate your profits, kill the messenger." False Profits (Voyager) +258 There is no cannonized rule tied to this number +259 There is no cannonized rule tied to this number +260 There is no cannonized rule tied to this number +261 "A wealthy man can afford everything except a conscience." The Ferengi Rules of Acquisition (DS9 reference book) +262 There is no cannonized rule tied to this number +263 "Never let doubt interfere with your lust for Latinum." DS9 episode: "Bar Association" +264 There is no cannonized rule tied to this number +265 There is no cannonized rule tied to this number +266 "When in doubt, lie." The Ferengi Rules of Acquisition (DS9 reference book) +267 There is no cannonized rule tied to this number +268 There is no cannonized rule tied to this number +269 There is no cannonized rule tied to this number +270 There is no cannonized rule tied to this number +271 There is no cannonized rule tied to this number +272 "Always inspect the merchandise before making a deal." Star Trek Online +273 There is no cannonized rule tied to this number +274 There is no cannonized rule tied to this number +275 There is no cannonized rule tied to this number +276 There is no cannonized rule tied to this number +277 There is no cannonized rule tied to this number +278 There is no cannonized rule tied to this number +279 There is no cannonized rule tied to this number +280 "If it ain't broke, don't fix it." DS9 novel: Ferenginar: Satisfaction is Not Guaranteed) +281 There is no cannonized rule tied to this number +282 There is no cannonized rule tied to this number +283 There is no cannonized rule tied to this number +284 "Deep down, everyone's a Ferengi." The Ferengi Rules of Acquisition (DS9 reference book) +285 "No good deed ever goes unpunished." DS9 episode: "The Collaborator" diff --git a/sopel_modules/SpiceBot_Text/internet_rules b/sopel_modules/SpiceBot_Text/internet_rules new file mode 100644 index 0000000..c31bef1 --- /dev/null +++ b/sopel_modules/SpiceBot_Text/internet_rules @@ -0,0 +1,47 @@ +1 "Do not talk about /b/" +2 "Do NOT talk about /b/" +3 "We are Anonymous" +4 "Anonymous is legion" +5 "Anonymous never forgives" +6 "Anonymous can be a horrible, senseless, uncaring monster" +7 "Anonymous is still able to deliver" +8 "There are no real rules about posting" +9 "There are no real rules about moderation either - enjoy your ban" +10 "If you enjoy any rival sites - DON'T" +11 "All your carefully picked arguments can easily be ignored" +12 "Anything you say can and will be used against you" +13 "Anything you say can be turned into something else - fixed" +14 "Do not argue with trolls - it means that they win" +15 "The harder you try the harder you will fail" +16 "If you fail in epic proportions, it may just become a winning failure" +17 "Every win fails eventually" +18 "Everything that can be labeled can be hated" +19 "The more you hate it the stronger it gets" +20 "Nothing is to be taken seriously +21 "Original content is original only for a few seconds before getting old" +22 "Copypasta is made to ruin every last bit of originality" +23 "Copypasta is made to ruin every last bit of originality" +24 "Every repost it always a repost of a repost" +25 "Relation to the original topic decreases with every single post" +26 "Any topic can easily be turned into something totally unrelated" +27 "Always question a person's sexual prefrences without any real reason" +28 "Always question a person's gender - just incase it's really a man" +29 "In the internet all girls are men and all kids are undercover FBI agents" +30 "There are no girls on the internet" +31 "TITS or GTFO - the choice is yours" +32 "You must have pictures to prove your statements" +33 "Lurk more - it's never enough" +34 "There is porn of it, no exceptions" +35 "If no porn is found at the moment, it will be made" +36 "There will always be even more fucked up shit than what you just saw" +37 "You can not divide by zero (just because the calculator says so)" +38 "No real limits of any kind apply here - not even the sky" +39 "CAPSLOCK IS CRUISE CONTROL FOR COOL" +40 "EVEN WITH CRUISE CONTROL YOU STILL HAVE TO STEER" +41 "Desu isn't funny. Seriously guys. It's worse than Chuck Norris jokes." +42 "Nothing is Sacred." +43 "The more beautiful and pure a thing is - the more satisfying it is to corrupt it" +44 "Even one positive comment about Japanese things can make you a weaboo" +45 "When one sees a lion, one must get into the car." +46 "There is always furry porn of it." +47 "The pool is always closed." diff --git a/sopel_modules/SpiceBot_Text/jukebox_christmas b/sopel_modules/SpiceBot_Text/jukebox_christmas new file mode 100644 index 0000000..6421dc0 --- /dev/null +++ b/sopel_modules/SpiceBot_Text/jukebox_christmas @@ -0,0 +1,3 @@ +Stroke on My Cock - Matt Rogers - https://www.youtube.com/watch?v=hcEN5C-OMDo +I Saw Mommy Fucking Santa Claus - Matt Rogers - https://www.youtube.com/watch?v=yurGJOnEte4 +Hey Santa Claus - Kevin Bloody Wilson - https://www.youtube.com/watch?v=af7LwnA913g diff --git a/sopel_modules/SpiceBot_Text/jukebox_friday b/sopel_modules/SpiceBot_Text/jukebox_friday new file mode 100644 index 0000000..7214073 --- /dev/null +++ b/sopel_modules/SpiceBot_Text/jukebox_friday @@ -0,0 +1,6 @@ +Friday - Rebecca Black +Last Friday Night TGIF - Katy Perry +Friday I'm in Love - The Cure +Hello Friday - Flo Rida +Party Rock Anthem - LMFAO https://youtu.be/KQ6zr6kCPj8 +Shots - LMFAO diff --git a/sopel_modules/SpiceBot_Text/jukebox_party b/sopel_modules/SpiceBot_Text/jukebox_party new file mode 100644 index 0000000..306b781 --- /dev/null +++ b/sopel_modules/SpiceBot_Text/jukebox_party @@ -0,0 +1,26 @@ +Party all the Time - Eddie Murphy +Party Hard - Andrew W K +Party all the Time - Eddie Murphy +Party Rock Anthem - LMFAO +Party all the Time - Eddie Murphy +Party Rock Anthem - LMFAO +Party all the Time - Eddie Murphy +Party all the Time - Eddie Murphy +Party Rock Anthem - LMFAO +Sorry For Party Rocking - LMFAO +Don't Stop the Party - PitBull +Party In The USA - Miley Cyrus +Party all the Time - Eddie Murphy +You gotta Fight For Your Right to Party - Beastie Boys +Party all the Time - Eddie Murphy +You gotta Fight For Your Right to Party - Beastie Boys +Party all the Time - Eddie Murphy +You gotta Fight For Your Right to Party - Beastie Boys +Party all the Time - Eddie Murphy +Get The Party Started - P!nk +Party Monster - The Weeknd +Party Up - DMX +Party Train - The Gap Band +Don't Stop the Party - The Black Eyes Peas +Party - Beyonce +You gotta Fight For Your Right to Party - Beastie Boys diff --git a/sopel_modules/SpiceBot_Text/momsspaghetti b/sopel_modules/SpiceBot_Text/momsspaghetti new file mode 100644 index 0000000..965039a --- /dev/null +++ b/sopel_modules/SpiceBot_Text/momsspaghetti @@ -0,0 +1,66 @@ +Look, If you had One shot, Or one opportunity, To seize everything you ever wanted, In one moment, Would you capture Or just let it slip? +His palms are sweaty, knees weak, arms are heavy +There's vomit on his sweater already, mom's spaghetti +He's nervous, but on the surface he looks calm and ready +To drop bombs, but he keeps on forgettin' +What he wrote down, the whole crowd goes so loud +He opens his mouth, but the words won't come out +He's chokin', how, everybody's jokin' now +The clocks run out, times up, over, blaow! +Snap back to reality, oh there goes gravity +Oh, there goes Rabbit, he choked +He's so mad, but he won't give up that easy? No +He won't have it, he knows his whole back city's ropes +It don't matter, he's dope, he knows that, but he's broke +He's so stacked that he knows, when he goes back to his mobile home, that's when its +Back to the lab again yo, this whole rhapsody +He better go capture this moment and hope it don't pass him +You better lose yourself in the music, the moment +You own it, you better never let it go +You only get one shot, do not miss your chance to blow +This opportunity comes once in a lifetime you better +The souls escaping, through this hole that its gaping +This world is mine for the taking +Make me king, as we move toward a, new world order +A normal life is borin', but super stardom's close to post mortem +It only grows harder, only grows hotter +He blows us all over these hoes is all on him +Coast to coast shows, he's known as the globetrotter +Lonely roads, God only knows, he's grown farther from home, he's no father +He goes home and barely knows his own daughter +But hold your nose 'cause here goes the cold water +His hoes don't want him no mo, he's cold product +They moved on to the next schmo who flows, he nose dove and sold nada +So the soap opera is told and unfolds, I suppose it's old partna, but the beat goes on +Da da dumb da dumb da da +You better lose yourself in the music, the moment +You own it, you better never let it go +You only get one shot, do not miss your chance to blow +This opportunity comes once in a lifetime you better +No more games, I'm a change what you call rage +Tear this motherfuckin' roof off like two dogs caged +I was playin' in the beginnin', the mood all changed +I been chewed up and spit out and booed off stage +But I kept rhymin' and stepwritin' the next cipher +Best believe somebody's payin' the pied piper +All the pain inside amplified by the +Fact that I can't get by with my nine to +Five and I can't provide the right type of +Life for my family 'cause man, these God damn food stamps don't buy diapers +And its no movie, there's no Mekhi Phifer +This is my life and these times are so hard +And it's getting even harder tryin' to feed and water my seed, plus +See dishonor caught up between bein' a father and a prima-donna +Baby mama drama screamin' on and too much +For me to want to say in one spot, another jam or not +Has gotten me to the point, I'm like a snail I've got +To formulate a plot fore I end up in jail or shot +Success is my only motherfuckin' option, failures not +Mom, I love you, but this trail has got to go, I cannot grow old in Salem's lot +So here I go is my shot +Feet fail me not 'cause maybe the only opportunity that I got +You better lose yourself in the music, the moment +You own it, you better never let it go +You only get one shot, do not miss your chance to blow +This opportunity comes once in a lifetime you better +You can do anything you set your mind to, man diff --git a/sopel_modules/SpiceBot_Text/proverbs b/sopel_modules/SpiceBot_Text/proverbs new file mode 100644 index 0000000..ebf982b --- /dev/null +++ b/sopel_modules/SpiceBot_Text/proverbs @@ -0,0 +1,97 @@ +Dance like nobody is watching, code like everybody is. +A deployed MVP is worth two prototyped. +When you reach wizened engineer-level, there are at least a hundred wizened engineers above you. +A/B Test twice, deploy changes once. +Don't commit on master when drunk. +Sleep on a force push. +A git pull a day, keeps the doctor away. +Sometimes you have to cut legacy support to allow the new product to bloom. +More hours worked, more commits made. Mostly reverts and bug-causing features. +Even a wizened engineer will drop production DB. +Scope creep makes a mountain. +A hundred programmers won't make a two-year project in a week. +Facebook wasn't built in a day. +"Just ship" is no substitute for design. +Today's fashion is tomorrow's legacy. +Learning obscure and strange languages, yields better understanding and broader horizons. +The better job you do, the easier others discount the level of difficulty. +Testing is easier than debugging. +Finish a product in a day, and people will expect a new product every day. Teach people about proper development cycles, and your company will flourish. +Customers are the best testers. +Absence is beauty, in error logs. +Eternal sunshine of the stateless mind. +Laziness is your best friend. Never do twice what you can automate once. +Good test coverage + automated workflows = quiet cell phones and better sleep. +The best code is no code at all. +The best request is the one you don't make. +If a system works perfectly, no one will care what is inside it. Once it breaks, systems design and architecture decides your fate. +Leave architecture for applications that require long-term support. +Architecture and design are preparations for problems and changes, not a key to runtime. +Without a prototype, don't build a final product. +Without boilerplate, there's no speedy development. +Code frustration is a bad advisor for a refactor. +The more technology you learn, the more you realize how little you know. +An early BETA launch will teach you more than a delayed promise. +All applications are pretty when your screen is off. +Do not pick a framework for its demo page, instead pick it for its code. +You cannot set a web standard alone. +A poor programmer blames the language. +The code's writin' but ain't nobody programming. +MaƱana often has the most tickets. +Never optimize before measuring +Think about your dance moves when drunk, next time you try to code with some beers on your count. +What happens in Git stays in Git +Simpler code has less bugs. +Lock up your dependency versions and other valuables. +Quantity of attempts often yields quality at the end. Commitment to refactoring legacy code yields better quality yet. +Accept that some days you're the QA and some days you're the one fixing bugs. +Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude +Debugging becomes significantly easier if you first admit that you are the problem. +Figure out your data structures, and the code will follow. +One thing should never do more than one thing. +Success from a final version is a lie, there is only iteration. Through iteration, we gain better products. Through better products, we gain traction. Through traction, we gain success. Through success, misguided tech specs are broken. The development cycle shall free us. +An open source developer does not act for personal fame. +Public code review forces one to better oneself. It forces better practices, smarter solutions, growth as a developer... or being broken. +Testing covers not testing. +The most attractive pull requests are the ones wearing a lot of red. +Coding styleguides without peer code reviews are like running a country on voluntary taxes +Deploying an unmonitored app is like going on a roadtrip without a gas gauge. +Learn a programming language, become a new developer. +Some old code never refactors, and breaks at the slightest change. +A developer will spot a peer from far away +A developer that codes until burnout, lives without a mind. +A marketer is not a QA, a developer does not advertise. +A soft spoken developer will see his warnings of technical debt unheeded, and will suffer the blame. +A well spoken developer can be hired hastily but at the last minute fail an easy test. +One can self-learn the art of code but do not assume other crafts suffer of such low bar of entry. +Find ease in your code: Code difficult to read and understand is code destined to be in troubled legacy. +Collaborating on open source projects can bring about friendship and community just as it can create factions and flame wars. +Refactor or rewrite, there is no patching unmaintainable legacy code +If you stop learning now and take the easy path, you will find yourself stuck in legacy software forever. +A beautiful product which is pleasing to non-paying users is good only for frightening investors when it runs out of funding. +A foreach loop avoided is a CPU cycle earned. +You cannot prevent managers from asking too much of you, but you can prevent them from getting used to it. +Your code might be perfect but you aren't +Any sufficiently complex app architecture is indistinguishable from spaghetti code. +Writing requirements based code and walking on water are both relatively easy to do when frozen. +It takes twice as much intelligence to debug than to program, therefore you peer review because you can never truly be smart enough to debug your own code. +Hofstadter's Law will tell you to always add more time than you think you need to a project because it will take longer, even when you take into account Hofstadter's Law. +Long lasting code is written only when you pretend that it will be peer reviewed or maintained by a violent psycopath who knows where you live. +Small bug becomes a huge problem. +Commiting is the only command I know, Commiting on you. +No one who codes before dawn 360 days a year fails to make his startup profitable +There is no test without first a failure +A line of testing is worth more than a module of code +Don't put all your logic in one method basket +As you code so shall you also deploy +Diff before you Push +When the only tool you have is Rails, everything looks like Ruby +Careful that Ignoring a PR doesn't get construed as Approval +An interview at the right price is worth two at Google +With commit and deploy access comes great responsibility +When aruging with a foolish and conceded programmer, first make sure that the other person isn't doing the exact same thing +Don't enter an architecture argument without knowing design patterns first +Anger and stubborness make bad allies in code review +Not all those that prototype and test ideas are lost. +Each new commit holds new chances, new beginnings +Commit or do not commit, there is no try