toys / app.py
schoginitoys's picture
Sree
23d2677
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)