123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- """General function module"""
- import random
- from datetime import datetime, timedelta
- # libraries and data
- import matplotlib.pyplot as plt
- import matplotlib.dates as mdates
- import pandas as pd
- from pandas.plotting import register_matplotlib_converters
- from telegram import ParseMode
- from app import LOGGER, SCHEDULER, TELEGRAM_BOT, RESOURCE_NAMES, RESOURCE_IDS, RESOURCE_MAX, \
- jobs, api, database
- register_matplotlib_converters()
- def check_resources(state_id, capital_id, resource_id, do_refill, alt):
- """Check resources and refill if necessary"""
- regions = api.download_resources(state_id, resource_id)
- LOGGER.info('state %6s: check resource %s', state_id, RESOURCE_IDS[resource_id])
- print_resources(regions, resource_id)
- refill_percentage = 25
- database.save_resources(state_id, regions, resource_id)
- if do_refill and need_refill(regions, refill_percentage):
- max_seconds = max_refill_seconds(regions, refill_percentage, 900)
- random_seconds = random.randint(0, max_seconds)
- random_time_delta = timedelta(seconds=random_seconds)
- scheduled_date = datetime.now() + random_time_delta
- job_id = 'refill_{}_{}'.format(capital_id, resource_id)
- LOGGER.info(
- 'state %s: refil resource %s at %s (%s minutes)', state_id, RESOURCE_IDS[resource_id],
- scheduled_date, round(random_time_delta.seconds / 60)
- )
- job = SCHEDULER.get_job(job_id)
- if not job:
- SCHEDULER.add_job(
- jobs.refill_resource,
- 'date',
- args=[state_id, capital_id, resource_id, alt],
- id=job_id,
- run_date=scheduled_date
- )
- def print_resources(regions, resource_id):
- """print resources"""
- if regions:
- print('region expl max D left c % t %')
- for region in regions.values():
- region['explored_percentage'] = 100 / region['maximum'] * region['explored']
- region['total_left'] = region['explored'] + region['limit_left']
- region['total_percentage'] = 100 / RESOURCE_MAX[resource_id] * region['total_left']
- print('{:25}: {:7.2f}{:4}{:4}{:5}{:7.2f}{:7.2f}'.format(
- region['region_name'],
- region['explored'],
- region['maximum'],
- region['deep_exploration'],
- region['limit_left'],
- region['explored_percentage'],
- region['total_percentage'],
- ))
- else:
- LOGGER.error('no region to print data')
- def need_refill(regions, limit):
- """Check if refill is needed"""
- for region in regions.values():
- percentage = 100 / region['maximum'] * region['explored']
- if percentage < limit and region['limit_left']:
- return True
- return False
- def max_refill_seconds(regions, limit, max_time):
- """Give random seconds for next refill"""
- lowest_percentage = limit
- for region in regions.values():
- percentage = 100 / region['maximum'] * region['explored']
- if percentage < lowest_percentage:
- lowest_percentage = percentage
- return int(max_time / limit * lowest_percentage)
- def send_telegram_update(state_id, group_id, resource_name):
- """Send resource update to telegram"""
- date = datetime.now()
- # date = datetime.today().replace(hour=18, minute=5) - timedelta(1)
- resource_id = RESOURCE_NAMES[resource_name]
- message = database.get_work_percentage(state_id, resource_id, date, 1, 1)
- if message:
- print(message)
- TELEGRAM_BOT.sendMessage(
- chat_id=group_id,
- text='```\n{}```'.format(message),
- parse_mode=ParseMode.MARKDOWN
- )
- else:
- LOGGER.error('no data for Telegram message')
- def graph():
- """make graph"""
- date = datetime.now() # - timedelta(1)
- region_4001 = database.get_resources(4001, date, 0)
- region_4002 = database.get_resources(4002, date, 0)
- #region_4003 = database.get_resources(4003, date, 0)
- #region_4004 = database.get_resources(4004, date, 0)
- #region_4008 = database.get_resources(4008, date, 0)
- # resource_tmp = np.random.randn(2499)+range(2500, 1, -1)
- # Make a data frame
- data_frame = pd.DataFrame({
- # 'x': range(1, 2500),
- # '4001': resource_tmp,
- 'x': list(region_4001.keys()),
- 'Northern Netherlands': list(region_4001.values()),
- 'Eastern Netherlands': list(region_4002.values()),
- #'Western Netherlands': list(region_4003.values()),
- #'Southern Netherlands': list(region_4004.values()),
- #'Amsterdam': list(region_4008.values()),
- })
- major_fmt = mdates.DateFormatter('%m-%d %H:%M')
- fig, ax = plt.subplots()
- ax.xaxis.set_major_formatter(major_fmt)
- fig.autofmt_xdate()
- end_date_time = date.replace(hour=20, minute=0, second=0, microsecond=0)
- start_date_time = end_date_time - timedelta(hours=24)
- ax.set_xlim([start_date_time, end_date_time])
- ax.set_ylim([0, 2500])
- # style
- plt.style.use('seaborn-darkgrid')
- # create a color palette
- palette = plt.get_cmap('Set1')
- # multiple line plot
- num = 0
- for column in data_frame.drop('x', axis=1):
- num += 1
- plt.plot(
- data_frame['x'],
- data_frame[column],
- marker='',
- color=palette(num),
- linewidth=1,
- alpha=0.9,
- label=column
- )
- # Add legend
- plt.legend(loc=3, ncol=1)
- # plt.setp(plt.xticks()[1], rotation=30, ha='right')
- # Add titles
- plt.title(
- 'Resource limit left | {}'.format(date.strftime('%Y-%m-%d')),
- loc='left',
- fontsize=12,
- fontweight=1
- )
- plt.xlabel("Time")
- plt.ylabel("Resources")
- plt.savefig('foo.png')
|