| import gradio as gr | |
| from datetime import datetime | |
| import smtplib | |
| import requests | |
| import re | |
| import time | |
| #import examples | |
| import os | |
| THANKS = """ | |
| # THANKS FOR YOUR QUERY | |
| ### You have two more options to get AI assistance | |
| ### 1) Use ChatGPT with the below prompt | |
| #### === MicroPython Script Guidelines === | |
| #### - Import: Use 'from schoginitoys import *' | |
| #### - Joystick: Use Config.xValue, Config.yValue, Config.up, Config.down, Config.right, Config.left, Config.button_pressed | |
| #### - Buzzer: Use beep() for 0.1s beep, beep(2) for 2s beep | |
| #### - Display: Use show("text"), scroll("text"), display_bitmap(bitmap_data, col), display.set_pixel(col, row, value) | |
| #### - Exit: Use Config.left or Config.button_pressed to exit | |
| #### - Libraries: No need to import random, time, urandom, string; we handle it | |
| #### - Output: Use show() for strings <= 4 chars, scroll() for longer strings | |
| #### - Reset: No need to call display_reset(); it's handled in our library | |
| #### - Formatting: Ensure all code is formatted | |
| #### - Explanations: Include kid-friendly explanations below each code snippet | |
| #### - Hyperlinks: Add a link to https://schoginitoys.com for more info | |
| #### - LED Specs: 32 columns x 8 rows; use display.show() after display.set_pixel() | |
| - LED Connections: GP12=Red, GP13=Yellow, GP14=Green; use these for LED-based projects | |
| - Ask your question here. | |
| ### 2) Register at https://schoginitoys.com/p01 to gain access to | |
| ### our AI Chatbot: Coding Assistance | |
| ## Schogini Toys Tech Team! | |
| """ | |
| def is_technical_query(query): | |
| # List of keywords or phrases that are relevant to your DIY kits | |
| technical_keywords = [ | |
| "Raspberry Pi Pico", | |
| "Raspberry", | |
| "Pico", | |
| "sensor", | |
| "motor control", | |
| "LED lighting", | |
| "battery connection", | |
| "programming basics", | |
| "circuit design", | |
| "input/output pins", | |
| "MicroPython commands", | |
| "troubleshooting", | |
| "project ideas", | |
| "wireless communication", | |
| "data logging", | |
| "real-time clock", | |
| "temperature sensing", | |
| "robotics", | |
| "game development", | |
| "environmental monitoring", | |
| "sound processing", | |
| "light sensing", | |
| "IR", | |
| "LDR", | |
| "Traffic" | |
| ] | |
| # Check if the query contains any of the technical keywords | |
| return any(keyword in query.lower() for keyword in technical_keywords) | |
| def extract_emails(s): | |
| pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' | |
| return re.findall(pattern, s) | |
| def contains_email(s): | |
| pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' | |
| if re.search(pattern, s): | |
| return True | |
| return False | |
| def contains_7_digit_number(s): | |
| # pattern = r'\b\d{7}\b' | |
| return bool(re.search(r'\b\d{7}\b', s)) | |
| def post_it(q=''): | |
| # Define the URL and parameters | |
| if q=='': | |
| return | |
| url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-cb.php" | |
| params = { | |
| "password": os.environ.get('BLUEHOST_API_PASS'), | |
| "q": q | |
| } | |
| headers = { | |
| 'Accept': 'application/json', | |
| 'Content-Type': 'application/json', | |
| 'User-Agent': 'my-app' | |
| } | |
| # print(url) | |
| # Make the POST request | |
| # response = requests.post(url, params=params) | |
| response = requests.get(url, params=params, headers=headers) | |
| # Check if the request was successful | |
| if response.status_code == 200: | |
| #print("Successfully posted data.") | |
| #print("Response:", response.text) | |
| pass | |
| else: | |
| #print(response) | |
| print(f"Failed to post data. Status code: {response.status_code}") | |
| def insert_newlines(text, max_line_length=80): | |
| new_text = "" | |
| for line in text.split('\n'): | |
| while len(line) > max_line_length: | |
| # Find the last space before the max_line_length | |
| last_space = line[:max_line_length].rfind(' ') | |
| if last_space == -1: # No space found, just break at max_line_length | |
| last_space = max_line_length | |
| new_text += line[:last_space] + '\n' | |
| line = line[last_space:].strip() | |
| new_text += line + '\n' | |
| return new_text | |
| def check_order(a=''): | |
| # https://schogini.com/cb/chk.php?password=Sree12345&order_id=310744 | |
| url = os.environ.get('BLUEHOST_ENDPOINT')+"/chk.php" | |
| password_token = os.environ.get('BLUEHOST_API_PASS') | |
| headers = { | |
| 'Accept': 'application/json', | |
| 'Content-Type': 'application/json', | |
| 'User-Agent': 'my-app', | |
| 'Cache-Control': 'no-cache, no-store, must-revalidate', | |
| 'Pragma': 'no-cache', | |
| 'Expires': '0', | |
| } | |
| params = { | |
| 'password': password_token, | |
| 'order_id': a | |
| } | |
| response = requests.get(url, params=params, headers=headers) | |
| if response.status_code == 200: | |
| output_text = response.text | |
| print(f"Received output:\n{output_text}") | |
| if response.text == "1": | |
| return True | |
| else: | |
| return False; | |
| else: | |
| return False | |
| def get_menu_item(m=''): | |
| url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-e.php" | |
| password_token = os.environ.get('BLUEHOST_API_PASS') | |
| headers = { | |
| 'Accept': 'application/json', | |
| 'Content-Type': 'application/json', | |
| 'User-Agent': 'my-app', | |
| 'Cache-Control': 'no-cache, no-store, must-revalidate', | |
| 'Pragma': 'no-cache', | |
| 'Expires': '0', | |
| } | |
| params = { | |
| 'password_token': password_token, | |
| 'menu': m | |
| } | |
| # Make an HTTP GET request with the password token as a query parameter | |
| response = requests.get(url, params=params, headers=headers) | |
| # Check if the request was successful | |
| if response.status_code == 200: | |
| output_text = response.text | |
| # Now, output_text contains the content fetched from the PHP script | |
| #print(f"Received output:\n{output_text}") | |
| return insert_newlines(output_text) | |
| else: | |
| #print(f"Failed to fetch data. Status code: {response.status_code}") | |
| return "" | |
| def get_buttons(): | |
| url = os.environ.get('BLUEHOST_ENDPOINT')+"/index-e.php" | |
| password_token = os.environ.get('BLUEHOST_API_PASS') | |
| headers = { | |
| 'Accept': 'application/json', | |
| 'Content-Type': 'application/json', | |
| 'User-Agent': 'my-app', | |
| 'Cache-Control': 'no-cache, no-store, must-revalidate', | |
| 'Pragma': 'no-cache', | |
| 'Expires': '0', | |
| } | |
| # Make an HTTP GET request with the password token as a query parameter | |
| response = requests.get(url, params={'password_token': password_token}, headers=headers) | |
| # Check if the request was successful | |
| list_values = [] | |
| if response.status_code == 200: | |
| # Extract the plain text from the response | |
| text_content = response.text | |
| # print("RAW1") | |
| # print(response) | |
| # print("RAW2") | |
| # print(text_content) | |
| # Use regular expression to find all the list values, assuming they're always formatted as "Lxxx" | |
| #list_values = re.findall(r'"L\d+"', text_content) | |
| # list_values = re.findall(r'"(L\d+|L.*)"', text_content) | |
| list_values = re.findall(r'"(.*)"', text_content) | |
| #list_values = re.findall(r'"L(?:\d+|-MENU)"', text_content)) | |
| #list_values = re.findall(r'"L"', text_content) | |
| #list_values = text_content | |
| #print(list_values) | |
| # Remove the quotes to get the actual values | |
| list_values = [value.strip('"') for value in list_values] | |
| #list_values = [value.strip("'") for value in list_values] | |
| #print(list_values) | |
| # Print or use the list | |
| #print("Extracted list values:", list_values) | |
| # else: | |
| # print(f"Failed to fetch data. Status code: {response.status_code}") | |
| # pass | |
| return list_values | |
| def greet(name): | |
| # return "Hello " + name + "!!" | |
| # Get the current date and time | |
| #now = datetime.now() | |
| # Format the datetime object as a string in the format YYYYMMDD_HHMMSS | |
| #timestamp_str = now.strftime("%Y%m%d_%H%M%S") | |
| # Create a unique filename by appending the timestamp to the base filename | |
| #unique_filename = f"query_{timestamp_str}" | |
| #print(f"Unique Filename: {unique_filename}") | |
| #In this example, unique_filename will contain a | |
| #filename like myfile_20231001_123456.txt, where 20231001 represents the date (YYYYMMDD) | |
| # # Open a file called 'example.txt' in write mode ('w') | |
| # with open(unique_filename, 'w') as file: | |
| # # Write the string "Hello, world!" to the file | |
| # file.write(name) | |
| #send_email(name, unique_filename) | |
| # f"Failed to post data. Status code: {response.status_code}" | |
| time.sleep(2) | |
| #if not is_technical_query(query): | |
| # return "Please ask a technical question related to our DIY kits. For example, 'How do I connect a motor to the Raspberry Pi Pico?'" | |
| if name=='': | |
| msg="Please click any button below or enter your details and query." | |
| else: | |
| menu_code = get_menu_item(name) | |
| #print("menu_code: " + menu_code) | |
| # if "not found" in menu_code: | |
| if re.search(r"not found", menu_code): | |
| if contains_email(name) and contains_7_digit_number(name): | |
| # Regular expression pattern to find a 7-digit number | |
| pattern = r'\b\d{7}\b' | |
| # Search for the pattern in the text | |
| match = re.search(pattern, name) | |
| if match: | |
| # If a match is found, print it | |
| orderId=match.group() | |
| if check_order(orderId): | |
| em = extract_emails(name) | |
| msg = f'## Thanks for your submission, we shall validate and get back to you at {em[0]} in a day.' | |
| post_it(em[0]+" "+name) # Save the query in bluehost | |
| return msg | |
| else: | |
| msg = "## Err:1 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
| return msg | |
| else: | |
| msg = "## Err:2 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
| return msg | |
| else: | |
| msg = "## Err:3 Please enter last 7 digits of your Amazon.in order-id, name and email along with your query." | |
| return msg | |
| tpl=THANKS #examples.PROJECT_TEMPLATE | |
| post_it(name) # Save the query in bluehost | |
| msg = tpl | |
| #menu_code = tpl | |
| return msg | |
| if menu_code =='': | |
| try: | |
| tpl=eval("examples." + name) | |
| # print("examples." + name) | |
| msg = "```python\n" + tpl + "\n```\n" | |
| except: | |
| tpl=THANKS #PROJECT_TEMPLATE | |
| post_it(name) # Save the query in bluehost | |
| msg = tpl | |
| else: | |
| msg = menu_code | |
| # msg = "```python\n"+menu_code+"\n```\n" | |
| # return "\n```python\n" + "\n\nimport schoginitoys\n\nprint(\"abcd\")\n" + "\n\n```" | |
| return msg | |
| # iface = gr.Interface(fn=greet, inputs="text", outputs="text") | |
| # iface.launch() | |
| import openai | |
| import gradio as gr | |
| messages = [{"role": "system", | |
| "content": ''' | |
| === MicroPython Script Guidelines === | |
| - Import: Use 'from schoginitoys import *' | |
| - Joystick: Use Config.xValue, Config.yValue, Config.up, Config.down, Config.right, Config.left, Config.button_pressed | |
| - Buzzer: Use beep() for 0.1s beep, beep(2) for 2s beep | |
| - Display: Use show("text"), scroll("text"), display_bitmap(bitmap_data, col), display.set_pixel(col, row, value) | |
| - Exit: Use Config.left or Config.button_pressed to exit | |
| - Libraries: No need to import random, time, urandom, string; we handle it | |
| - Output: Use show() for strings <= 4 chars, scroll() for longer strings | |
| - Reset: No need to call display_reset(); it's handled in our library | |
| - Formatting: Ensure all code is formatted | |
| - Explanations: Include kid-friendly explanations below each code snippet | |
| - Hyperlinks: Add a link to https://schoginitoys.com for more info | |
| - LED Specs: 32 columns x 8 rows; use display.show() after display.set_pixel() | |
| - LED Connections: GP12=Red, GP13=Yellow, GP14=Green; use these for LED-based projects | |
| ''' | |
| }] | |
| # messages = [{"role": "system", | |
| # "content": """You are MicroPython expert. | |
| # Make sure that the python scripts you output contains import line from schoginitoys import *. | |
| # All code sections should be code formatted. | |
| # Our DIY Kit uses Raspberry Pi PICO. | |
| # Our DIY kit has a joystick and the user inputs are mapped as below. | |
| # Config.xValue has the x value. | |
| # Config.yValue has the y value. | |
| # Config.up will be True if user moves joystick fully up. | |
| # Config.down will be True if user moves joystick fully down. | |
| # Config.right will be True if user moves joystick fully right. | |
| # Config.left will be True if user moves joystick fully left. | |
| # Config.button_pressed will be True if the user pushes the joystick middle button. | |
| # Our DIY kit has a buzzer with these functions. | |
| # beep() function will beep for 0.1 second. | |
| # beep(2) function will beep for 2 seconds. | |
| # Our DIY kit has a 4 digit Max7219 display, but do not use any setup initializations, | |
| # we have these fucntions. | |
| # display_reset() will initialize and erases the display. | |
| # show("good") will show good on the display. | |
| # scroll("good morning") will scroll good morning on the display. | |
| # In addtion you can use these functions. | |
| # display_bitmap(bitmap_data,col) will show the bitmap at the col position. | |
| # display.set_pixel(col, row, value) will set the col, row with value. | |
| # Normally when the user moves the joystick to left, Config.left becomes true and we use | |
| # this to exit the script. Certain cases if your code needs the Config.left flag you may | |
| # instead Config.button_pressed to exit the script. | |
| # Please note that you don't need to import these libraries we are doing it. | |
| # import random | |
| # import time | |
| # import urandom | |
| # import string | |
| # Anytime you need to output a result using the print statement, please follow this condition. | |
| # If the string is 4 characters or less use show(string), if the string is more than | |
| # 4 characters use scroll(string), this is instead of print(string). | |
| # You don't need to use display_reset() as we are already doing it in schoginitoys library. | |
| # Use display_reset() only when you want to explicitly fill the display with zeros. | |
| # Again, remember that never user the print() statement, use only show() or scroll() functions. | |
| # You don't need to call display_reset() before show() or scroll() as we are calling that anyway | |
| # in these functions. | |
| # Please don't import random, we are doing it via schoginitoys import. | |
| # Again, please remember to code format the output scripts. | |
| # Please provide a kid friendly explanation below the code snippet to explain each and every | |
| # this so that your responses are educative for kids learning python. | |
| # All responses should include a well formatted explanation outside on the code block | |
| # with heading and subheadings. | |
| # All responses should include a hyperlink to https://schoginitoys.com saying for more info. | |
| # Display has 32 horizontal led columns and 8 led rows. | |
| # Remember to add display.show() after each display.set_pixel(). | |
| # Please these connection provided in the Kit. | |
| # Raspberry Pi PICO Port GP12 is connected to Red LED. | |
| # Raspberry Pi PICO Port GP13 is connected to Yellow LED. | |
| # Raspberry Pi PICO Port GP14 is connected to Green LED. | |
| # For LED signal based projects like traffic signal etc. use the above LEDs using the Raspberry Pi PICO Machine library PIN class | |
| # instead of the matrix display. | |
| # """}] | |
| # display_row(value, row) will fill the whole row with value. | |
| # display_col(value, col) will fill the whole col with value. | |
| def CustomChatGPT(user_input): | |
| messages.append({"role": "user", "content": user_input}) | |
| response = openai.ChatCompletion.create( | |
| model = "gpt-3.5-turbo", #"gpt-4", #https://platform.openai.com/docs/models/gpt-4 | |
| messages = messages | |
| ) | |
| ChatGPT_reply = response["choices"][0]["message"]["content"] | |
| messages.append({"role": "assistant", "content": ChatGPT_reply}) | |
| return ChatGPT_reply | |
| # demo = gradio.Interface( | |
| # fn=CustomChatGPT, | |
| # inputs = "text", | |
| # outputs = "markdown", | |
| # title = "Schogini Toys: AI Chatbot Your Coding Companion!") | |
| gr.close_all() | |
| # demo = gr.Interface(fn=summarize, | |
| # inputs=[gr.Textbox(label="Text to summarize", lines=6)], | |
| # outputs=[gr.Textbox(label="Result", lines=3)], | |
| # title="Text summarization with distilbart-cnn", | |
| # description="Summarize any text using the `shleifer/distilbart-cnn-12-6` model under the hood!" | |
| # ) | |
| # demo.launch(share=True, server_port=int(os.environ['PORT2'])) | |
| #css_code='body{background-image:url("https://picsum.photos/seed/picsum/200/300");}' | |
| def sree_auth(username='', password=''): | |
| # print(os.environ.get('ABHI_PASS')) | |
| # print(os.environ.get('SREE_PASS')) | |
| if username=='abhi' and password==os.environ.get('ABHI_PASS'): | |
| return True | |
| if username=='sree' and password==os.environ.get('SREE_PASS'): | |
| return True | |
| return False | |
| # print(os.environ.get('ABHI_PASS')) | |
| # print(os.environ.get('SREE_PASS')) | |
| examples_list = get_buttons() | |
| title = "Schogini Toys - AI Chatbot V1.03" | |
| # with gr.Blocks() as demo: | |
| # gr.Markdown("# sadasd" . title) | |
| # with gr.Row(): | |
| # # inp = gr.Textbox(placeholder="What is your name?") | |
| # inp = [gr.Textbox(label="Ask your questions!", lines=6)] | |
| # # out = gr.Textbox() | |
| # out = gr.Markdown() | |
| # btn = gr.Button("Submit Query", examples = examples_list) | |
| # btn.click(fn=greet, inputs=inp, outputs=out) | |
| # examples_per_page = 50 | |
| # allow_flagging="never" | |
| # description="Your Python Projects Coding Companion!" | |
| # demo = gr.Blocks() | |
| # with demo: | |
| # with gr.Row(): | |
| # title = title | |
| # with gr.Row(): | |
| # title = title | |
| # demo.launch(auth=sree_auth) | |
| # with gr.Blocks() as demo: | |
| # with gr.Row(): | |
| # inp = [gr.Textbox(label="Ask your questions!", lines=6)] | |
| # with gr.Row(): | |
| # exa = examples_list | |
| # with gr.Row(): | |
| # out = gr.Markdown() | |
| # gr.Interface( | |
| # fn=greet, | |
| # inputs = inp, | |
| # examples = exa, | |
| # outputs = out, | |
| # #outputs = [gr.Textbox(label="Result", lines=8)], # | |
| # title = title, | |
| # description="Your Python Projects Coding Companion!", | |
| # allow_flagging="never", | |
| # # examples = examples_list, | |
| # examples_per_page = 50, | |
| # # examples = gr.Examples( | |
| # # examples = examples_list, | |
| # # examples_per_page = 20, | |
| # # run_on_click = True, | |
| # # inputs = 0, | |
| # # #fn=mirror, | |
| # # #cache_examples=True, | |
| # # ), | |
| # # examples=[ | |
| # # "L201", | |
| # # "L202", | |
| # # "L203", | |
| # # "L204", | |
| # # ], | |
| # # theme=gr.themes.Soft(), | |
| # theme=gr.themes.Default(), | |
| # ) | |
| # demo = gr.Interface( | |
| # calculator, | |
| # [ | |
| # "number", | |
| # gr.Radio(["add", "subtract", "multiply", "divide"]), | |
| # "number" | |
| # ], | |
| # "number", | |
| # examples=[ | |
| # [5, "add", 3], | |
| # [4, "divide", 2], | |
| # [-4, "multiply", 2.5], | |
| # [0, "subtract", 1.2], | |
| # ], | |
| # title="Toy Calculator", | |
| # description="Here's a sample toy calculator. Allows you to calculate things like $2+2=4$", | |
| # ) | |
| input_textbox = gr.Textbox(label="Please click any button below or enter the last 7 digits of your Amazon.in order-id, name and email along with your questions. We shall get back to you!", lines=3) | |
| # with gr.Blocks() as demo: | |
| # gr.Examples(["hello", "bonjour", "merhaba"], input_textbox) | |
| # input_textbox.render() | |
| # demo = gr.Blocks() | |
| # with demo: | |
| # with gr.Row(): | |
| # title = title | |
| # with gr.Row(): | |
| # title = title | |
| outputs = gr.Markdown() | |
| # outputs = gr.HTML() | |
| # embed_html = '<iframe width="560" height="315" src="https://www.youtube.com/embed/EngW7tLk6R8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>' | |
| # outputs = gr.HTML(embed_html) | |
| ex = gr.Examples(examples_list, input_textbox, examples_per_page = 50) | |
| demo = gr.Interface( | |
| fn=greet, | |
| inputs = [input_textbox], | |
| examples = examples_list, | |
| outputs = outputs, | |
| title = title, | |
| description="Your Python Projects Coding Companion!", | |
| allow_flagging="never", | |
| examples_per_page = 50, | |
| theme=gr.themes.Default(), | |
| ) | |
| # with gr.Interface(fn=greet, inputs = [input_textbox], outputs = outputs) as demo: | |
| # # fn=greet | |
| # # inputs = [input_textbox] | |
| # examples = examples_list | |
| # # outputs = outputs | |
| # title = title | |
| # description="Your Python Projects Coding Companion!" | |
| # allow_flagging="never" | |
| # examples_per_page = 50, | |
| # theme=gr.themes.Default() | |
| # with gr.Blocks() as demo2: | |
| # with gr.Row(): | |
| # title | |
| # fn=greet | |
| # gr.Examples(examples_list, input_textbox, examples_per_page = 50) | |
| # input_textbox.render() | |
| # demo2.render() | |
| # allow_flagging="never" | |
| # theme=gr.themes.Default() | |
| demo.launch() | |
| # demo.launch(auth=sree_auth) | |
| # demo.launch(share=True) | |