127 lines
3.5 KiB
Python
Executable File
127 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
fortune - Random wisdom and fortune
|
|
|
|
Combines wisdom collection with classic fortune vibes.
|
|
"""
|
|
|
|
import json
|
|
import random
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
WORKSPACE = Path("/home/wdjones/.openclaw/workspace")
|
|
WISDOM_FILE = WORKSPACE / "data" / "wisdom.json"
|
|
|
|
# Built-in fortunes if wisdom is empty
|
|
FORTUNES = [
|
|
"The best time to start was yesterday. The second best time is now.",
|
|
"Simple is better than complex.",
|
|
"Done is better than perfect.",
|
|
"You are not your code.",
|
|
"First, solve the problem. Then, write the code.",
|
|
"Code is read more often than it is written.",
|
|
"The only way to go fast is to go well.",
|
|
"Make it work, make it right, make it fast.",
|
|
"Weeks of coding can save you hours of planning.",
|
|
"There are only two hard things in CS: cache invalidation and naming things.",
|
|
"It works on my machine!",
|
|
"The quieter you become, the more you can hear.",
|
|
"What you do today is important because you're exchanging a day of your life for it.",
|
|
"The obstacle is the way.",
|
|
"We suffer more in imagination than in reality.",
|
|
"Focus on what you can control.",
|
|
"The impediment to action advances action. What stands in the way becomes the way.",
|
|
"You have power over your mind, not outside events.",
|
|
"Think of yourself as dead. Now take what's left and live it properly.",
|
|
"If it is not right, do not do it. If it is not true, do not say it.",
|
|
]
|
|
|
|
def load_wisdom() -> list:
|
|
"""Load wisdom entries."""
|
|
if WISDOM_FILE.exists():
|
|
try:
|
|
with open(WISDOM_FILE) as f:
|
|
data = json.load(f)
|
|
return [w['text'] for w in data]
|
|
except:
|
|
pass
|
|
return []
|
|
|
|
def fortune():
|
|
"""Get a random fortune."""
|
|
# Combine wisdom and built-in fortunes
|
|
wisdom = load_wisdom()
|
|
all_fortunes = FORTUNES + wisdom
|
|
|
|
selected = random.choice(all_fortunes)
|
|
|
|
width = min(60, max(len(selected), 40))
|
|
|
|
print()
|
|
print("╭" + "─" * (width + 2) + "╮")
|
|
|
|
# Word wrap
|
|
words = selected.split()
|
|
lines = []
|
|
current = ""
|
|
for word in words:
|
|
if len(current) + len(word) + 1 <= width:
|
|
current = current + " " + word if current else word
|
|
else:
|
|
lines.append(current)
|
|
current = word
|
|
if current:
|
|
lines.append(current)
|
|
|
|
for line in lines:
|
|
print(f"│ {line:<{width}} │")
|
|
|
|
print("╰" + "─" * (width + 2) + "╯")
|
|
print()
|
|
|
|
def daily_fortune():
|
|
"""Get today's fortune (consistent for the day)."""
|
|
wisdom = load_wisdom()
|
|
all_fortunes = FORTUNES + wisdom
|
|
|
|
# Seed with today's date
|
|
day_seed = int(datetime.now().strftime("%Y%m%d"))
|
|
random.seed(day_seed)
|
|
selected = random.choice(all_fortunes)
|
|
random.seed()
|
|
|
|
print("\n🌅 Today's Fortune:")
|
|
|
|
width = min(60, max(len(selected), 40))
|
|
print("─" * (width + 4))
|
|
|
|
words = selected.split()
|
|
lines = []
|
|
current = ""
|
|
for word in words:
|
|
if len(current) + len(word) + 1 <= width:
|
|
current = current + " " + word if current else word
|
|
else:
|
|
lines.append(current)
|
|
current = word
|
|
if current:
|
|
lines.append(current)
|
|
|
|
for line in lines:
|
|
print(f" {line}")
|
|
|
|
print("─" * (width + 4))
|
|
print()
|
|
|
|
def main():
|
|
import sys
|
|
|
|
if len(sys.argv) > 1 and sys.argv[1] == 'daily':
|
|
daily_fortune()
|
|
else:
|
|
fortune()
|
|
|
|
if __name__ == "__main__":
|
|
main()
|