Experimental Discord bot written in Python
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

rbutils.py 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from datetime import timedelta
  2. import re
  3. def parse_timedelta(s: str) -> timedelta:
  4. """
  5. Parses a timespan. Format examples:
  6. "30m"
  7. "10s"
  8. "90d"
  9. "1h30m"
  10. "73d18h22m52s"
  11. """
  12. p = re.compile('^(?:[0-9]+[dhms])+$')
  13. if p.match(s) is None:
  14. raise ValueError("Illegal timespan value '{s}'.")
  15. p = re.compile('([0-9]+)([dhms])')
  16. days = 0
  17. hours = 0
  18. minutes = 0
  19. seconds = 0
  20. for m in p.finditer(s):
  21. scalar = int(m.group(1))
  22. unit = m.group(2)
  23. if unit == 'd':
  24. days = scalar
  25. elif unit == 'h':
  26. hours = scalar
  27. elif unit == 'm':
  28. minutes = scalar
  29. elif unit == 's':
  30. seconds = scalar
  31. return timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)
  32. def describe_timedelta(td: timedelta, max_components: int = 2) -> str:
  33. values = [
  34. td.days,
  35. td.seconds // 3600,
  36. (td.seconds // 60) % 60,
  37. td.seconds % 60,
  38. ]
  39. units = [
  40. 'day' if values[0] == 1 else 'days',
  41. 'hour' if values[1] == 1 else 'hours',
  42. 'minute' if values[2] == 1 else 'minutes',
  43. 'second' if values[3] == 1 else 'seconds',
  44. ]
  45. while len(values) > 1 and values[0] == 0:
  46. values.pop(0)
  47. units.pop(0)
  48. if len(values) > max_components:
  49. values = values[0:max_components]
  50. units = units[0:max_components]
  51. while len(values) > 1 and values[-1] == 0:
  52. values.pop(-1)
  53. units.pop(-1)
  54. tokens = []
  55. for i in range(len(values)):
  56. tokens.append(f'{values[i]} {units[i]}')
  57. return ' '.join(tokens)