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



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:
        self._help()
        self.reciver = reciver
        self.message = message
        print(self.message)
        if send_time == "":
            self.send_time = self._get_time()
        else:
            self.send_time = send_time
        self.sent = False
        self.WIDTH, self.HEIGHT = size()
        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")
            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")
            while True:
                if self._compareTime():
                    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")
        # Vars
        type_bar = self._waitCheckOnScreen("type.png")
        click(type_bar)
        count = 2
        # Spam
        for i in range(100):
            pc.copy(self.message)
            time.sleep(0.2)
            pyautogui.hotkey('ctrl', 'v')
            time.sleep(0.2)
            pyautogui.press("enter") 
        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):
        path = fr"C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\WhatSender\{filename}"
        printed = False
        while locateCenterOnScreen(path) == None:
            if not printed:
                print("Scan code if needed.")
                printed = True
        return locateCenterOnScreen(path)

    def _compareTime(self):
        current_time = self._get_time()
        return self.send_time == current_time

    def _get_time(self):
        now = datetime.now()
        current_time = now.strftime("%H:%M")
        return 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'))

