from pyautogui import click, locateCenterOnScreen, size, moveTo, typewrite
import time
import webbrowser
from urllib.parse import quote
from datetime import datetime
import termcolor
import os
from sys import platform



class SendMessage():
    '''Send Whatsapp messages with one line of code!\n
    The class takes this params: reciver, message, send_time -> all of them required.\n
    You can call the class like a function, you don't need to make an object out of it becaues its
    executing on the __init__ function.\n
    New Feture: SPAM send 100 messages to a given number.
    \n
    Make sure you have all the dependecise before running!\n
    The App has been created by Ido Barel, and it's free to use.'''
    def __init__(self, reciver, message, send_time, spam=False, download=True) -> None:
        if not spam:
            if download:
                send_png_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00"\x00\x00\x00-\x08\x06\x00\x00\x00\xcb\x11\xb9\x17\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x01 IDATXG\xed\x97\xcd\r\x82@\x10FW{`\xb9y\xf2`"\x16\x81\x14\xa1\xb1@\xa3E E\x08E\x00E(\x83K\xa2\x13\xdc\xdfA9\xccK6.\\|3\xdf\x0e\x81\xc5j\xbdy\x88\x19\xb0T\xbf\x7f\x87E0,\x82a\x11\x0c\x8b`X\x04\xc3"\x18\xa3\xc8.\xd9\xaa\xdd\xb4\x18_\x03N\xc7\x83\xda\tq\xbe\\\xd5\x8e\x1e\xa7h@\nV\x1cKu\x87\x0e\xaf3\x92\xa5i/D\x19\x9bS4:Bc#\x9b\x9a\xd0\xd8\xc8\xc7\xd776\xb2ht\xd8\xc4f\xf5\x16\x0f\xed\x96Q\xd4U\x99\xa8;~\xe4E!\xea\xbaQW\x9f\x90|N@\x0cRJ\x11w\xcb\x86{Yv\xabRW/\x82\xcf\x08t\xabi\xdb~_7\xe3\xd5b@\x1a\xe3\x14\x8dK\xd5\x18\x90,\xab\xca?\x9a\xd0\xc3j\x12\x18 \x1f\xdf\x01\x10\x80i\xc9o\xdf\x0f\xe8;\xa4\x1d\xb1\xad~\x0c\x92\x8e\x80\x00\x8c\xa6m\xf5c\x04\x89\xb8\xb6_\x87s4!\xed\xd7a\xdd\x11\x8a\xf6\xeb0v$\xdb\xa7\xfd\x9fO\x8d\xd5\x03\xed\x17L\xf6\x1cq\x85E0,\x82a\x11\x0c\x8b`f""\xc4\x13Z\x90\x84Bf-Gk\x00\x00\x00\x00IEND\xaeB`\x82'
                close_png_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00!\x00\x00\x00\x1c\x08\x06\x00\x00\x00\xef\x00\xd6\x1c\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x00\xc8IDATHKc\xe4\xe1\x11\xff\xcf0\xc0\x80\tJ\x0f(\x18u\x04\x0c\x8c:\x02\x06F\x1d\x01\x03D;\xe2\xf3\xe7\x17\x0c\xd1\xd1\xe1P\x1e&\x00\xc9\x81\xd4\x90\x03\x88vDFF>\xc3\x8c\x19\x13\xb1:\x04$\x06\x92\x03\xa9!\x070\xb3\xb1\xf14@\xd9x\xc1\xe5\xcbW\x19\x1e=z\x0c\xb6\x0cD\x83\xf8 \x80\xec\x80\xa5KW\x82\xc5H\x05D;\x02\x04\xd0\x1d\xa2\xa7\xa7C\xb1\x03@\x80\xac\xba\x03\xe6{\x10\xa0\xd4\x01 04\xb3(r\x1a\x00a\x10\x1b[b%\x05\x90\x94&\xd0\x13!\xae\xc4J* \xda\x11\xb8r\x015\x1cBt\xc2\x04\x15D\xf8\x12!\xcc\x91\xbc\xbc\x12P\x11\xe2\xc1h\xcb\n\x06F\x1d\x01\x03\xa3\x8e\x80\x81QG\xc0\xc0\xa8# \x80\x81\x01\x00\x05wsO$\x07\x07\x1f\x00\x00\x00\x00IEND\xaeB`\x82'
                self._download_Image(send_png_bytes, "send.png")
                self._download_Image(close_png_bytes, "close.png")
            self._help()
            self.reciver = reciver
            self.message = message
            self.send_time = send_time
            self.sent = False
            self.WIDTH, self.HEIGHT = size()
            while True:
                if self._compareTime():
                    self.send_message()
        else:
            if download:
                send_png_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00"\x00\x00\x00-\x08\x06\x00\x00\x00\xcb\x11\xb9\x17\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x01 IDATXG\xed\x97\xcd\r\x82@\x10FW{`\xb9y\xf2`"\x16\x81\x14\xa1\xb1@\xa3E E\x08E\x00E(\x83K\xa2\x13\xdc\xdfA9\xccK6.\\|3\xdf\x0e\x81\xc5j\xbdy\x88\x19\xb0T\xbf\x7f\x87E0,\x82a\x11\x0c\x8b`X\x04\xc3"\x18\xa3\xc8.\xd9\xaa\xdd\xb4\x18_\x03N\xc7\x83\xda\tq\xbe\\\xd5\x8e\x1e\xa7h@\nV\x1cKu\x87\x0e\xaf3\x92\xa5i/D\x19\x9bS4:Bc#\x9b\x9a\xd0\xd8\xc8\xc7\xd776\xb2ht\xd8\xc4f\xf5\x16\x0f\xed\x96Q\xd4U\x99\xa8;~\xe4E!\xea\xbaQW\x9f\x90|N@\x0cRJ\x11w\xcb\x86{Yv\xabRW/\x82\xcf\x08t\xabi\xdb~_7\xe3\xd5b@\x1a\xe3\x14\x8dK\xd5\x18\x90,\xab\xca?\x9a\xd0\xc3j\x12\x18 \x1f\xdf\x01\x10\x80i\xc9o\xdf\x0f\xe8;\xa4\x1d\xb1\xad~\x0c\x92\x8e\x80\x00\x8c\xa6m\xf5c\x04\x89\xb8\xb6_\x87s4!\xed\xd7a\xdd\x11\x8a\xf6\xeb0v$\xdb\xa7\xfd\x9fO\x8d\xd5\x03\xed\x17L\xf6\x1cq\x85E0,\x82a\x11\x0c\x8b`f""\xc4\x13Z\x90\x84Bf-Gk\x00\x00\x00\x00IEND\xaeB`\x82'
                type_png_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x11\x00\x00\x00(\x08\x06\x00\x00\x00\xd9\x96\xce_\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x06HIDATx^\xed\x9c\x8bS\x1bU\x14\xc6\x0f\xe1\xfdJ\xca\xb3\x10 i\x0b\xa1\x94\xd6\xbeg\xc4\xd6\xda\x19\x1du\x1c\x1du\xfc\x8b\xfc\x8f\x1c\xc7q\xd4\xa9v\xac}\x0cbKiQ\x81\x96\x16)\x16y\x05\x08\x04B\xcb\xcb\xfb\x1dr\xe3f\x9b\x12\xc8\xea43~?\x1a\xb2\x8f\xcb\xdd\xb3;9\xdf=\xdf\xddt\x0bB\x1d]\xdb\xc5\xc5ER^V&%%\xa5"\xb2-R\x80\x7f\xe6\x17!\x84d\xc1w \xe0\x97\x80\xdf/\xa5\xa5\xa5R\x00\xf10\xbf( \x84\x90\xbd\xe2+..V\xe1 \x84\x90\\\xf0%\xdf\t!$\'("\x84\x10OPD\x08!\x9e\xa0\x88\x10B<A\x11!\x84x\x82"B\x08\xf1\x04E\x84\x10\xe2\t\x8a\x08!\xc4\x13\x14\x11B\x88\'("\x84\x10OPD\x08!\x9e(8\xd7sq;\xb9\x9c\xa2\xa1\xa1A\xce\x9f=#\xe5\xe5\xe5\xc9-\xe9\x8c\x8f\x8f\xcb\x9d\xbb\x03\xc95B\xc8\xff\x99\x8c"\xe2\xc4\n\xca\xcc\xcc\x0c\x85\x83\x10\xf2\x02\xb43\x84\x10O\xec\xbb\x12\xb1\xeb\xf1x\\\xae\xdf\xbc\x95l%r\xee\xcciill\x941cu\x0e\x87\xc3\xba\xbf\xac\xacL\xaa\xab\xabu\xff\xf2\xf2\xb2\\\xf9\xe1\xaa.[\xde}\xe7\xed\xd4\xfe\x8d\x8d\r\x19\xb8w_\x9eLL\xe8\xba\x1b\xf4\x1f6\xfdZfgg\xd3\x8e\xef\x04m[ZZdnnN\x9a\x9a\x9at\x1b\x8e?p\x7f0\xcd\xa6\xb9mY\xf7\xb1.9\xda\x19\x91\x82\x82\x1dmu\x1e\xc3m\xf1\x12\x89\x84\xdc\xee\xbf\xabm.]\xbc\xa0\xfb\xc1\xf6\xf6\x96\x8c<x(\xbf\x0f\r\xbf\xd0\x9f\xfb\x1a\xb8\xfb\x8cF\xa3RQQ\x91V\xf5\xed\x16\x13!\xf9@a\xb05\xf4yr9#\x95\x95\x95\x12ln\x96\x95\x95\x15\xf9kjJVWW\xa5\xb9\xe9\xa0TUUIliI\xd7\xc1\x89\xe3\xdd\xba<\xf1\xe7Sm\x1f\x08\x04d\xca\xb4\xbf\xfa\xe35\x99\x8b\xceK\xabI\xea\xc3\x87\xc2\xf2xlL\xdbC@\xc0\xd7\xdf|+C\xc3#\xd2h\x12\nm\x9c}:\xe9\x8cthb\xf6\xf6\xf5\xe9\xf3OZ\x82A),,\x94Y#\x14n\x82\xcdMR[[k\x12z[\xfbG{l\x0b\x87B299\xa91\xd5\xd7\xd5\xa9\xe8%\x12kzL$kG{\xbb<\x1c\x1d\x95\x9fn\xdc4\xe7\xbbj\xe2=$U\xe6\xfcq\xde\x17\xdf\xe8\x91\xad\xad-G\xbc\xf52\xbf\xb0 \xc7\x8evj?\xfd&\xe9\x11[iI\xa9\xb6C\\\x91\x8evyj\x8eg\xfbkkmM\xf5g\x05\x04\xe2i\xfb\x0c\xb5\xb5\xeau\x8b\xc5b\xda&[L\x84\xe4\x039\xd9\x99\xe8\xfc\xbc\xe0aF\r\xf5u\xba\x1ejk\xd3\'\xa3a\xbb\x05\xa3\xae\x1dM1zbt\xc5\x88\x8b\xb6H\x0e\xb4\xc7\x88m\x19\x7f2\xa1\xa2`\xfbts\xed\xfa\x8dT\x952;\x17\x95\xf5\xf5u}\xa4\xe3\xcb@r\xda\xfe!>\xf1\xf8JZL8\x1e\x92\xbd\xaa\xaaR\xd7!J\x0bF\x14\xd0\x16\xe0XX\x87\x18Y\xd6\xd6\xd6\x92K"\xb7z\x7f\xd6\xf3\x02\x88%\x91\xdcwop0\xd5\x07\xda8\xfbC\xf5\x82J\x03\x84Z[\xf4\x1a:\xaf\xc1\xb0YF\x1b\xcb^b"\xe4U\x93\x93\x88\xd8$\xaeK~\x98\xc3\xa16y\xf6\xecY\xea\xc3\x0e\x9c\t\x07\x90dHZ\xb0\xf3<\xd7\x129\x7f\xee\xac|\xf6\xe9\'\xfa\xc22\xb6\xbdL\x180r\x7f\xf0\xfe{\xda\x16\xf6\xe1ew\x8ev\xc3\x1d\x93\x05}\x17\x15\x15\xe9\xbb\x8d\x07/\xe7\xf6y#\x90x\xff\xf8\xa3\x0fU\x08-\xb8\x16\x10\x03\xc4\x04\x1b\xe5\x06\x15\x97\xed\xcfZ7\x001q\x8a\x8f\x9b\xbd\xc4DH>\xb0o;\x03`7\x02\xfejM\x8a\xe5x\\\x0e\x85\xc3:\xff\x80\xfd\xb6\xfd\xf3\xe7\xcf\xd3\xe67\x1aL\xf9_SS#\xd3\xa6"\xa94\t\x04;d-\x00Jy\xfb\xcaT\xa6\xa3r9{\xfa\x94,.\xc6\xe4\xbb+\xdf\xab=\x82\x9dp\xc6\xe4\x04\xd6\xc5\xef\xf7\xcb\xd4\xf4\xb4Z\x15\xd0~\xe4\xb0V\'6&\xd8\x86\x83\x07\x1beaq\xd1\x9cOBc^4\xcb\xe8\xdf\x19\xcf\xe8\xa3Gz\xbe8\x0e\xd6a\xbb"\x1d\x1dj\xbd`\xcd\xd0?\xaa\tX&\x1c\xa33\x12Q\x8b\x84\xfe/\xbfu)\xcd\xae\xe0ol\x0c\x10^\x9f\xcf\'\x83\xbf\xfe\xa6\xf1\x00\xe7\xb5\x8e--g\x8d\x89\x90| \xa7J\x04`\x04\xc6\x88\x88\xb2|gn"\x9a\xdc\x93\x19T\x18\x9b\x9b\x9b:\xf2\xda\xd1\xd7Z\x89l\xa0\xe2\x81\x1d\xf9\xaf&\x14aK\x90\xdc\x98\x08\xce\x06b\xb8}\xa7_\xed\x18\xc4\xcd\x82*\xec\x8b/\xbfR;\x02\x81\x80-C\xa5\x81\xc9\xdcL@\x04\xac\xbd\xb3\xe0\x1a\xa1\xaa\x01\xfb\x89\x89\x90WI\xce"\x82\xd1\x14\x1f\xf2f3\xea\xc3\xca8\xab\x0ePo\x92\xc8&\x19\x12\x05wK0/\x82\xe4@\xc2\xed$[(U\x96\xe3\xfd\xf2\xa573\x96\xe9\xee\x84\xeb\xea\x8c\xe4dgv\x03\x13\xa0\x105\xa7%\xc12^\xee\xd8\xd0\x0eU\x04\xb8\xd0\xf3z\xea<\xb1\x1f\xc2\n \x94\xcey#\xf4\xe3\xb43Vt!8\x16\xdc\x85\xb1\x7f\x0fv\x8b\x89\x90|!\';c\xa99\x10\x90\xda\xda\x1a\x19\xfbc\xdc$\xc5\xce]\x12\xdb~\xc9\x94\xe3\r\xf5\xf5r\xf2\xb5\x13\x12\x0c6\xeb\xed\xcb\xde\xbe_\xb4\r\x80\rB\xbb\xf6#G\xe4XW\x97&\x13\x04f\xf4\xd1\xe3d\x8b\x7f\xc0q! \xb83\x81\xb6\x98\xdb\x80}\xf8\xb7\xec\x0cb\xc7\x0b6\x0b\xb7\x91q\x0c\xbcPm\x0c\x8d<\xd0\xb8pw\x086\x06\xdb\xeb\xeaj\xf5\x8e\t\xc4\x10\xf6\x06wP\xec9\xc0~\xa0ZA\x7f\xd8\x07\xa1\xc4>Tk\xb0x6\x06\xc4\x05\xdb\x83s:\xde\xdd\xadmp\x1c\x08\x8f=\xaf\xddb\xa2\x9d!\xf9B\xd6\xef\x89\xec\x06FD\xdc\xde\xb4\xdf\x97\x00\x18\x8d3}\x8f\x84d\x07B\t\xd1\xc5\\\x8bs\x92\x9a\x90|&g;c-\n\xc4\xc2\n\x08\xf1\x06\xec\x0c\xe6\x8d\xb2\xcd/\x11\x92O\xec\xbb\x12\xb1\x95\x06\xe6$ \x1e\xeej\x83\x95\xc8\xde\x80\x08\x9f>u2m\x0e$\xd3\xb7z\t\xc9w<\xd9\x19B\x08\xc9\xd9\xce\x10B\x08\xa0\x88\x10B<A\x11!\x84x\x82"B\x08\xf1\x04E\x84\x10\xe2\t\x8a\x08!\xc4\x13\x14\x11B\x88\'("\x84\x10OPD\x08!\x9e\xf0\xe1\x99\x17x\x16)!\x84\xe4\x82o1\xb6\xa4\xff-\x1d\xcf\x04\x81\x96@P\xf0C\x08!\xd9\x11\xf9\x1b\xd3\x89y\x0b6\x0fs\xf6\x00\x00\x00\x00IEND\xaeB`\x82'
                close_png_bytes = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00!\x00\x00\x00\x1c\x08\x06\x00\x00\x00\xef\x00\xd6\x1c\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x00\xc8IDATHKc\xe4\xe1\x11\xff\xcf0\xc0\x80\tJ\x0f(\x18u\x04\x0c\x8c:\x02\x06F\x1d\x01\x03D;\xe2\xf3\xe7\x17\x0c\xd1\xd1\xe1P\x1e&\x00\xc9\x81\xd4\x90\x03\x88vDFF>\xc3\x8c\x19\x13\xb1:\x04$\x06\x92\x03\xa9!\x070\xb3\xb1\xf14@\xd9x\xc1\xe5\xcbW\x19\x1e=z\x0c\xb6\x0cD\x83\xf8 \x80\xec\x80\xa5KW\x82\xc5H\x05D;\x02\x04\xd0\x1d\xa2\xa7\xa7C\xb1\x03@\x80\xac\xba\x03\xe6{\x10\xa0\xd4\x01 04\xb3(r\x1a\x00a\x10\x1b[b%\x05\x90\x94&\xd0\x13!\xae\xc4J* \xda\x11\xb8r\x015\x1cBt\xc2\x04\x15D\xf8\x12!\xcc\x91\xbc\xbc\x12P\x11\xe2\xc1h\xcb\n\x06F\x1d\x01\x03\xa3\x8e\x80\x81QG\xc0\xc0\xa8# \x80\x81\x01\x00\x05wsO$\x07\x07\x1f\x00\x00\x00\x00IEND\xaeB`\x82'
                self._download_Image(close_png_bytes, "close.png")
                self._download_Image(send_png_bytes, "send.png")
                self._download_Image(type_png_bytes, "type.png")
            self._help()
            self.reciver = reciver
            self.message = message
            self.send_time = send_time
            self.sent = False
            self.WIDTH, self.HEIGHT = size()
            self.spam()

    def _web(self, receiver: str, message: str) -> None:
        """Opens WhatsApp Web based on the Receiver"""
        webbrowser.open(
            "https://web.whatsapp.com/send?phone="
            + receiver
            + "&text="
            + quote(message)
        )

    def spam(self):
        # First message
        self._web(receiver=self.reciver, message=self.message)
        time.sleep(2)
        send_icon = self._waitCheckOnScreen("send.png")
        time.sleep(1)
        click(send_icon)
        print("Sent 1 message")
        type_bar = self._waitCheckOnScreen("type.png")
        count = 2
        # Spam
        for i in range(100):
            click(type_bar)
            time.sleep(1)
            typewrite(self.message)
            time.sleep(1)
            click(send_icon)
            print(f"Sent {count} messages")
            count += 1
        print(termcolor.colored("All done!","green"))
        self.sent = True
        time.sleep(3)
        self._close(0)

    def send_message(self):
        self._web(receiver=self.reciver, message=self.message)
        time.sleep(2)
        send_icon = self._waitCheckOnScreen("send.png")
        time.sleep(1)
        click(send_icon)
        print(termcolor.colored("All done!","green"))
        self.sent = True
        time.sleep(3)
        self._close(0)

    def _waitCheckOnScreen(self, filename):
        printed = False
        while locateCenterOnScreen(filename) == None:
            if not printed:
                print("Scan code if needed.")
                printed = True
        return locateCenterOnScreen(filename)

    def _compareTime(self):
        now = datetime.now()
        current_time = now.strftime("%H:%M")
        return self.send_time == current_time

    def _close(self, code:int):
        close_btn = self._waitCheckOnScreen("close.png")
        click(close_btn)
        print("Closed.")
        moveTo(self.WIDTH // 2, self.HEIGHT // 2, 0.2)
        exit(code)

    def __str__(self) -> str:
        if self.sent:
            return f"Sent {self.message} TO {self.reciver}"
        else:
            return f"Hasent sent yet."

    def _download_Image(self, bytes, filename):
        path = fr"C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\WhatSender\{filename}"
        open(path, "wb").write(bytes)
    
    def _clear(self):
        if platform == "win32":
            os.system("cls")
        else:
            os.system("clear")

    def _help(self):
        print(termcolor.colored("Make sure you are not closing the app!".upper(), "red"))
        print(termcolor.colored("IT WILL SHUTDOWN AUTOMATICLY AFTER SENDING THE MESSAGE!", "blue"))
        print(termcolor.colored("MAKE SURE YOURE PHONE IS CHARGED AND HAVE A WIFI CONNECTION!", "green"))
        print(termcolor.colored("TO CLOSE CTRL + C", 'red'))


if __name__ == "__main__":
    try:
        SendMessage("+972544985275", "TEST", "12:39")
    except KeyboardInterrupt:
        print("Closed..")
        exit(0)

