pkscreener 0.46.20250214.717__tar.gz → 0.46.20250218.719__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/PKG-INFO +9 -9
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/README.md +5 -5
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/README.txt +5 -5
- pkscreener-0.46.20250218.719/pkscreener/classes/__init__.py +1 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/pkscreenerbot.py +142 -6
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/requirements.txt +2 -2
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/PKG-INFO +9 -9
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/requires.txt +2 -2
- pkscreener-0.46.20250214.717/pkscreener/classes/__init__.py +0 -1
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/LICENSE +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/Disclaimer.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/LICENSE-Others.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/LICENSE.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/LogoWM.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/__init__.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ArtTexts.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/AssetsManager.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Backtest.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Barometer.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/BaseScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/CandlePatterns.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Changelog.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ConfigManager.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ConsoleMenuUtility.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ConsoleUtility.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Fetcher.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/GlobalStore.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ImageUtility.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MarketMonitor.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MarketStatus.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MenuOptions.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Messenger.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/OtaUpdater.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKAnalytics.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKDataService.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKDemoHandler.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKPremiumHandler.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKScanRunner.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKScheduler.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKSpreadsheets.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKTask.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKUserRegistration.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Pktalib.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Portfolio.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PortfolioXRay.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/StockScreener.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/StockSentiment.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Utility.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/WorkflowManager.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/keys.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/courbd.ttf +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/globals.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/pkscreener.ini +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/pkscreenercli.py +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/SOURCES.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/dependency_links.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/entry_points.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/not-zip-safe +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/top_level.txt +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/setup.cfg +0 -0
- {pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/setup.py +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: pkscreener
|
3
|
-
Version: 0.46.
|
3
|
+
Version: 0.46.20250218.719
|
4
4
|
Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
|
5
5
|
Home-page: https://github.com/pkjmesra/pkscreener
|
6
|
-
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.
|
6
|
+
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250218.719.zip
|
7
7
|
Author: pkjmesra
|
8
8
|
Author-email: pkjmesra@gmail.com
|
9
9
|
License: OSI Approved (MIT)
|
@@ -33,8 +33,8 @@ Requires-Dist: pandas
|
|
33
33
|
Requires-Dist: pandas_ta
|
34
34
|
Requires-Dist: pefile<2024.8.26,>=2023.2.7
|
35
35
|
Requires-Dist: Pillow
|
36
|
-
Requires-Dist: PKDevTools>=0.13.20250126.
|
37
|
-
Requires-Dist: PKNSETools>=0.1.20250122.
|
36
|
+
Requires-Dist: PKDevTools>=0.13.20250126.235
|
37
|
+
Requires-Dist: PKNSETools>=0.1.20250122.138
|
38
38
|
Requires-Dist: Pyarrow
|
39
39
|
Requires-Dist: pyppeteer
|
40
40
|
Requires-Dist: pytz
|
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
392
392
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
393
393
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
394
394
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
395
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
395
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
|
396
396
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
397
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
397
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
|
398
398
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
399
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
399
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
|
400
400
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
401
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
401
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
|
402
402
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
403
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
403
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
|
404
404
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
405
405
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
406
406
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
328
328
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
329
329
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
330
330
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
331
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
331
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
|
332
332
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
333
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
333
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
|
334
334
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
335
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
335
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
|
336
336
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
337
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
337
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
|
338
338
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
339
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
339
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
|
340
340
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
341
341
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
342
342
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
328
328
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
329
329
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
330
330
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
331
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
331
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
|
332
332
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
333
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
333
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
|
334
334
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
335
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
335
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
|
336
336
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
337
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
337
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
|
338
338
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
339
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
339
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
|
340
340
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
341
341
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
342
342
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -0,0 +1 @@
|
|
1
|
+
VERSION='0.46.20250218.719'
|
@@ -547,6 +547,64 @@ def PScanners(update: Update, context: CallbackContext) -> str:
|
|
547
547
|
registerUser(user)
|
548
548
|
return START_ROUTES
|
549
549
|
|
550
|
+
def addNewButtonsToReplyMarkup(reply_markup, buttonKeyTextDict={}):
|
551
|
+
# Get the existing inline keyboard
|
552
|
+
keyboard = reply_markup.inline_keyboard if reply_markup else []
|
553
|
+
inlineMenus = [] # Temporary list to hold a row of buttons
|
554
|
+
for key, value in buttonKeyTextDict.items():
|
555
|
+
inlineMenus.append(InlineKeyboardButton(f"{value}", callback_data=f"{key}"))
|
556
|
+
# Add row of 2 buttons when full
|
557
|
+
if len(inlineMenus) == 2:
|
558
|
+
keyboard.append(inlineMenus)
|
559
|
+
inlineMenus = [] # Reset row
|
560
|
+
# Append any remaining buttons (if not forming a full row)
|
561
|
+
if inlineMenus:
|
562
|
+
keyboard.append(inlineMenus)
|
563
|
+
return InlineKeyboardMarkup(keyboard)
|
564
|
+
|
565
|
+
def cancelAlertSubscription(update:Update,context:CallbackContext):
|
566
|
+
global bot_available
|
567
|
+
updatedResults= ""
|
568
|
+
updateCarrier = None
|
569
|
+
if update is None:
|
570
|
+
return
|
571
|
+
else:
|
572
|
+
if update.callback_query is not None:
|
573
|
+
updateCarrier = update.callback_query
|
574
|
+
if update.message is not None:
|
575
|
+
updateCarrier = update.message
|
576
|
+
if updateCarrier is None:
|
577
|
+
return
|
578
|
+
# Get user that sent /start and log his name
|
579
|
+
user = updateCarrier.from_user
|
580
|
+
scanId = updateCarrier.data.upper().replace("CAN_", "")
|
581
|
+
logger.info("User %s started the conversation.", user.first_name)
|
582
|
+
if not bot_available:
|
583
|
+
# Sometimes, either the payment does not go through or
|
584
|
+
# it takes time to process the last month's payment if
|
585
|
+
# done in the past 24 hours while the last date was today.
|
586
|
+
# If that happens, we won't be able to run bots or scanners
|
587
|
+
# without incurring heavy charges. Let's run in the
|
588
|
+
# unavailable mode instead until this gets fixed.
|
589
|
+
updatedResults = APOLOGY_TEXT
|
590
|
+
reply_markup=default_markup(user=user)
|
591
|
+
try:
|
592
|
+
dbManager = DBManager()
|
593
|
+
result = dbManager.removeScannerJob(user.id,scanId)
|
594
|
+
if result:
|
595
|
+
updatedResults = f"<b>{scanId}</b> has been successfully removed from your alert subscription(s). If you re-subscribe, the associated charges will be deducted from your alerts remaining balance. For any feedback, please reach out to @ItsOnlyPK. You can use the <b>Subscriptions</b> button below to check/view your existing subscriptions. We thank you for your support and trust! Keep exploring!"
|
596
|
+
else:
|
597
|
+
updatedResults = f"We encountered some <b>error</b> while trying to remove <b>{scanId}</b> from your alert subscription(s). Please try again or reach out to @ItsOnlyPK with feedback. If you re-subscribe, the associated charges will be deducted from your alerts remaining balance. You can use the <b>Subscriptions</b> button below to check/view your existing subscriptions. We thank you for your support and trust! Keep exploring!"
|
598
|
+
if hasattr(updateCarrier, "reply_text"):
|
599
|
+
updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=reply_markup,parse_mode="HTML")
|
600
|
+
elif hasattr(updateCarrier, "edit_message_text"):
|
601
|
+
editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=reply_markup)
|
602
|
+
shareUpdateWithChannel(update=update, context=context, optionChoices=f"/CAN_{scanId}_{user.id}\n{updatedResults}")
|
603
|
+
except Exception as e: # pragma: no cover
|
604
|
+
logger.error(e)
|
605
|
+
pass
|
606
|
+
return START_ROUTES
|
607
|
+
|
550
608
|
def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False):
|
551
609
|
global bot_available
|
552
610
|
updateCarrier = None
|
@@ -572,6 +630,7 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
|
|
572
630
|
# unavailable mode instead until this gets fixed.
|
573
631
|
updatedResults = APOLOGY_TEXT
|
574
632
|
|
633
|
+
reply_markup=default_markup(user=user)
|
575
634
|
if bot_available:
|
576
635
|
try:
|
577
636
|
otpValue = 0
|
@@ -581,7 +640,8 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
|
|
581
640
|
scannerJobsSubscribed = ""
|
582
641
|
if alertUser is not None and len(alertUser.scannerJobs) > 0:
|
583
642
|
scannerJobsSubscribed = ", ".join(alertUser.scannerJobs)
|
584
|
-
scannerJobsSubscribed
|
643
|
+
if len(scannerJobsSubscribed) > 0:
|
644
|
+
scannerJobsSubscribed = f"Subscribed to [{scannerJobsSubscribed}]"
|
585
645
|
except Exception as e: # pragma: no cover
|
586
646
|
logger.error(e)
|
587
647
|
pass
|
@@ -609,10 +669,19 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
|
|
609
669
|
updatedResults = f"Please use the following to login to PKScreener:\n{userText}\n<b>OTP</b> : <code>{otpValue}</code>\n\nCurrent subscription : <b>{subscriptionModelName}</b>.\nCurrent alerts balance: <b>₹ {alertUser.balance if alertUser is not None else 0}</b> {scannerJobsSubscribed}. {subscriptionModelNames}"
|
610
670
|
else:
|
611
671
|
updatedResults = f"Current subscription: <b>{subscriptionModelName}</b>.\nCurrent alerts balance: <b>₹ {alertUser.balance if alertUser is not None else 0}</b> {scannerJobsSubscribed}. {subscriptionModelNames}"
|
672
|
+
|
673
|
+
#Add new buttons with alert subscription options to cancel
|
674
|
+
if alertUser is not None and len(alertUser.scannerJobs) > 0:
|
675
|
+
buttonDict = {}
|
676
|
+
for scannerJob in alertUser.scannerJobs:
|
677
|
+
if len(scannerJob) > 0:
|
678
|
+
buttonDict[f"CAN_{scannerJob}"] = f"Stop {scannerJob} 🔔"
|
679
|
+
reply_markup = addNewButtonsToReplyMarkup(reply_markup,buttonDict)
|
680
|
+
|
612
681
|
if hasattr(updateCarrier, "reply_text"):
|
613
|
-
updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=
|
682
|
+
updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=reply_markup,parse_mode="HTML")
|
614
683
|
elif hasattr(updateCarrier, "edit_message_text"):
|
615
|
-
editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=
|
684
|
+
editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=reply_markup)
|
616
685
|
shareUpdateWithChannel(update=update, context=context, optionChoices=f"/otp\n{updatedResults}")
|
617
686
|
return START_ROUTES
|
618
687
|
|
@@ -1202,6 +1271,48 @@ def Level2(update: Update, context: CallbackContext) -> str:
|
|
1202
1271
|
registerUser(user)
|
1203
1272
|
return START_ROUTES
|
1204
1273
|
|
1274
|
+
def handleHousekeeping(update: Update, context: CallbackContext) -> str:
|
1275
|
+
updateCarrier = None
|
1276
|
+
menuText = "Not implemented yet..."
|
1277
|
+
shouldSendUpdate = False
|
1278
|
+
if update is None:
|
1279
|
+
return
|
1280
|
+
else:
|
1281
|
+
if update.callback_query is not None:
|
1282
|
+
updateCarrier = update.callback_query
|
1283
|
+
if update.message is not None:
|
1284
|
+
updateCarrier = update.message
|
1285
|
+
if updateCarrier is None:
|
1286
|
+
return
|
1287
|
+
# Get user that sent /start and log his name
|
1288
|
+
user = updateCarrier.from_user
|
1289
|
+
query = update.callback_query
|
1290
|
+
query.answer()
|
1291
|
+
preSelection = (query.data.upper().replace("C", ""))
|
1292
|
+
selection = preSelection.split("_")[1]
|
1293
|
+
if query is None:
|
1294
|
+
start(update, context)
|
1295
|
+
return START_ROUTES
|
1296
|
+
reply_markup = default_markup(user)
|
1297
|
+
dbMgr = DBManager()
|
1298
|
+
if selection == "GAU":
|
1299
|
+
userIds = dbMgr.getUsers(fieldName="userId")
|
1300
|
+
if userIds is not None:
|
1301
|
+
menuText = f"Number of all registered users in the DB: {len(userIds)}"
|
1302
|
+
elif selection == "GAS":
|
1303
|
+
scanners = dbMgr.scannerJobsWithActiveUsers()
|
1304
|
+
if scanners is not None:
|
1305
|
+
if len(scanners) > 0:
|
1306
|
+
menuText = f"Number of all scans running today in the DB: {len(scanners)}"
|
1307
|
+
for scanner in scanners:
|
1308
|
+
scanID = scanner.scannerId
|
1309
|
+
subUsers = ", ".join(scanner.userIds)
|
1310
|
+
menuText = f"{menuText}\nScanner: {scanID} : Users: {subUsers}"
|
1311
|
+
else:
|
1312
|
+
menuText = "No users are subscribed for alerts today!"
|
1313
|
+
editMessageText(query=query,editedText=menuText,reply_markup=reply_markup)
|
1314
|
+
return START_ROUTES
|
1315
|
+
|
1205
1316
|
def default_markup(user=None,monitorIndex=0):
|
1206
1317
|
mns = m0.renderForMenu(selectedMenu=None,
|
1207
1318
|
skip=TOP_LEVEL_SCANNER_SKIP_MENUS[:len(TOP_LEVEL_SCANNER_SKIP_MENUS)-1],
|
@@ -1210,14 +1321,22 @@ def default_markup(user=None,monitorIndex=0):
|
|
1210
1321
|
)
|
1211
1322
|
if (PKDateUtilities.isTradingTime() and not PKDateUtilities.isTodayHoliday()[0]) or ("PKDevTools_Default_Log_Level" in os.environ.keys()) or sys.argv[0].endswith(".py"):
|
1212
1323
|
mns.append(menu().create(f"MI_{monitorIndex}", "👩💻 🚀 Intraday Monitor", 2))
|
1324
|
+
hskMenus = []
|
1213
1325
|
if user is not None and user.username == OWNER_USER:
|
1214
|
-
|
1215
|
-
|
1326
|
+
hskMenus.append(menu().create(f"DV_0", ("✅ Enable Logging" if not configManager.logsEnabled else "🚫 Disable Logging"), 2))
|
1327
|
+
hskMenus.append(menu().create(f"DV_1", "🔄 Restart Bot", 2))
|
1328
|
+
hskMenus.append(menu().create(f"HSK_GAU", "Get Active Users", 2))
|
1329
|
+
hskMenus.append(menu().create(f"HSK_GAP", "Get Paying Users", 2))
|
1330
|
+
hskMenus.append(menu().create(f"HSK_GAS", "Get Alerting Users", 2))
|
1331
|
+
hskMenus.append(menu().create(f"HSK_EUS", "Enable User Subs", 2))
|
1332
|
+
hskMenus.append(menu().create(f"HSK_DUS", "Disable User Subs", 2))
|
1333
|
+
hskMenus.append(menu().create(f"HSK_UUB", "Update User Balance", 2))
|
1334
|
+
|
1216
1335
|
keyboard = []
|
1217
1336
|
inlineMenus = []
|
1218
1337
|
lastRowMenus = []
|
1219
1338
|
rowIndex = 0
|
1220
|
-
iconDict = {"X":"🕵️♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 "}
|
1339
|
+
iconDict = {"X":"🕵️♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 ", "HS":"🕵️♂️ "}
|
1221
1340
|
for mnu in mns:
|
1222
1341
|
if mnu.menuKey[0:2] in TOP_LEVEL_SCANNER_MENUS:
|
1223
1342
|
rowIndex +=1
|
@@ -1245,6 +1364,21 @@ def default_markup(user=None,monitorIndex=0):
|
|
1245
1364
|
if len(inlineMenus) > 0:
|
1246
1365
|
keyboard.append(inlineMenus)
|
1247
1366
|
keyboard.append(lastRowMenus)
|
1367
|
+
rowIndex = 0
|
1368
|
+
inlineMenus = []
|
1369
|
+
for hskMenu in hskMenus:
|
1370
|
+
rowIndex +=1
|
1371
|
+
inlineMenus.append(
|
1372
|
+
InlineKeyboardButton(
|
1373
|
+
iconDict.get(str(hskMenu.menuKey[0:2])) + hskMenu.menuText.split("(")[0],
|
1374
|
+
callback_data="C" + str(hskMenu.menuKey),
|
1375
|
+
)
|
1376
|
+
)
|
1377
|
+
if rowIndex % 2 == 0:
|
1378
|
+
keyboard.append(inlineMenus)
|
1379
|
+
inlineMenus = []
|
1380
|
+
if len(inlineMenus) > 0:
|
1381
|
+
keyboard.append(inlineMenus)
|
1248
1382
|
reply_markup = InlineKeyboardMarkup(keyboard)
|
1249
1383
|
return reply_markup
|
1250
1384
|
|
@@ -2114,6 +2248,8 @@ def runpkscreenerbot(availability=True) -> None:
|
|
2114
2248
|
CallbackQueryHandler(Level2, pattern="^" + str("CP_")),
|
2115
2249
|
CallbackQueryHandler(subscribeToScannerAlerts, pattern="^" + str("SUB_")),
|
2116
2250
|
CallbackQueryHandler(viewSubscriptionOptions, pattern="^" + str("VS_")),
|
2251
|
+
CallbackQueryHandler(cancelAlertSubscription, pattern="^" + str("CAN_")),
|
2252
|
+
CallbackQueryHandler(handleHousekeeping, pattern="^" + str("CHSK_")),
|
2117
2253
|
# CallbackQueryHandler(Level2, pattern="^" + str("CG_")),
|
2118
2254
|
CallbackQueryHandler(end, pattern="^" + str("CZ") + "$"),
|
2119
2255
|
CallbackQueryHandler(start, pattern="^"),
|
@@ -19,8 +19,8 @@ pandas_ta #>=0.3.14b0
|
|
19
19
|
# and https://github.com/pyinstaller/pyinstaller/issues/7269
|
20
20
|
pefile>=2023.2.7,<2024.8.26
|
21
21
|
Pillow #>=9.5.0,<=9.5.0 # Keep at this version because getsize_multiline is deprecated/removed in higher versions
|
22
|
-
PKDevTools>=0.13.20250126.
|
23
|
-
PKNSETools>=0.1.20250122.
|
22
|
+
PKDevTools>=0.13.20250126.235
|
23
|
+
PKNSETools>=0.1.20250122.138
|
24
24
|
Pyarrow #>=17.0.0
|
25
25
|
pyppeteer #>=2.0.0
|
26
26
|
pytz #>=2024.2
|
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: pkscreener
|
3
|
-
Version: 0.46.
|
3
|
+
Version: 0.46.20250218.719
|
4
4
|
Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
|
5
5
|
Home-page: https://github.com/pkjmesra/pkscreener
|
6
|
-
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.
|
6
|
+
Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250218.719.zip
|
7
7
|
Author: pkjmesra
|
8
8
|
Author-email: pkjmesra@gmail.com
|
9
9
|
License: OSI Approved (MIT)
|
@@ -33,8 +33,8 @@ Requires-Dist: pandas
|
|
33
33
|
Requires-Dist: pandas_ta
|
34
34
|
Requires-Dist: pefile<2024.8.26,>=2023.2.7
|
35
35
|
Requires-Dist: Pillow
|
36
|
-
Requires-Dist: PKDevTools>=0.13.20250126.
|
37
|
-
Requires-Dist: PKNSETools>=0.1.20250122.
|
36
|
+
Requires-Dist: PKDevTools>=0.13.20250126.235
|
37
|
+
Requires-Dist: PKNSETools>=0.1.20250122.138
|
38
38
|
Requires-Dist: Pyarrow
|
39
39
|
Requires-Dist: pyppeteer
|
40
40
|
Requires-Dist: pytz
|
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
|
|
392
392
|
[MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
|
393
393
|
[MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
|
394
394
|
[Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
|
395
|
-
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
395
|
+
[Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
|
396
396
|
[Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
|
397
|
-
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
397
|
+
[Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
|
398
398
|
[Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
|
399
|
-
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
399
|
+
[Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
|
400
400
|
[Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
|
401
|
-
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
401
|
+
[Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
|
402
402
|
[Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
|
403
|
-
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.
|
403
|
+
[Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
|
404
404
|
[GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
|
405
405
|
[GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
|
406
406
|
[pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
|
@@ -1 +0,0 @@
|
|
1
|
-
VERSION='0.46.20250214.717'
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ArtTexts.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/AssetsManager.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Backtest.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Barometer.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/CandlePatterns.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Changelog.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ConfigManager.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ConsoleUtility.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/GlobalStore.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/ImageUtility.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MarketMonitor.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MarketStatus.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/MenuOptions.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Messenger.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/OtaUpdater.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKAnalytics.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKDataService.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKDemoHandler.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKPremiumHandler.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKScanRunner.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKScheduler.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PKSpreadsheets.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/Portfolio.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/PortfolioXRay.py
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/StockScreener.py
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/StockSentiment.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener/classes/WorkflowManager.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/entry_points.txt
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/not-zip-safe
RENAMED
File without changes
|
{pkscreener-0.46.20250214.717 → pkscreener-0.46.20250218.719}/pkscreener.egg-info/top_level.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|