9// import { getActiveUsers, getBlockedUsers, getUserInfo } from "./users.tsx";
1011export default async function processOwnerCommand(message) {
12const text = message.text || "";
13150* Reply to a specific user
151*/
152async function replyToUser(userId, text) {
153// Send the message to the user
154const success = await sendTelegramMessage(userId, text);
180* Native reply to a specific user using Telegram's reply mechanism
181*/
182async function nativeReplyToUser(userId, originalMessage, text) {
183try {
184// Send the message as a reply to the original message
cf-uploadermain.tsx1 match
2`ZXhwb3J0IGRlZmF1bHQgewoJYXN5bmMgZmV0Y2gocmVxdWVzdCwgZW52LCBjdHgpIHsKCQljb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgPz8ge307CgkJY29uc3QgaW5wdXREYXRhID0gZGF0YS5kYXRhID8/IFtdOwoJCWNvbnN0IHJlc3BvbnNlID0geyBkYXRhOiBbXSB9OwoKCQkvLyBNYXAgaW5wdXREYXRhIHRvIGFuIGFycmF5IG9mIHVwbG9hZCBwcm9taXNlcwoJCWNvbnN0IHVwbG9hZFByb21pc2VzID0gaW5wdXREYXRhLm1hcChhc3luYyAoZWxlbWVudCwgaW5kZXgpID0+IHsKCQkJY29uc29sZS5sb2coYCR7aW5kZXggKyAxfS8ke2lucHV0RGF0YS5sZW5ndGh9YCk7CgkJCXRyeSB7CgkJCQljb25zdCB1cGxvYWRTZWdtZW50ID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYW5vbmRyb3AubmV0L3JlbW90ZXVwbG9hZHVybD9rZXk9MTM2Njc1ODg0ODA5Nzk0NzcyMyZ1cmw9JHtlbmNvZGVVUklDb21wb25lbnQoZWxlbWVudC51cmkpfSZzZXNzaW9uX2hhc2g9MTM2Njc1ODg0ODA5Nzk0NzcyMy0ke2VuY29kZVVSSUNvbXBvbmVudChlbGVtZW50LnVyaSl9YCwgewoJCQkJCW1ldGhvZDogIkdFVCIsCgkJCQkJaGVhZGVyczogewoJCQkJCQkiVXNlci1BZ2VudCI6ICJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjoxMzguMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8xMzguMCIsCgkJCQkJCSJBY2NlcHQiOiAiKi8qIiwKCQkJCQkJIkFjY2VwdC1MYW5ndWFnZSI6ICJlbi1VUyxlbjtxPTAuNSIsCgkJCQkJCSJBbHQtVXNlZCI6ICJhbm9uZHJvcC5uZXQiLAoJCQkJCQkiU2VjLUZldGNoLURlc3QiOiAiZW1wdHkiLAoJCQkJCQkiU2VjLUZldGNoLU1vZGUiOiAiY29ycyIsCgkJCQkJCSJTZWMtRmV0Y2gtU2l0ZSI6ICJzYW1lLW9yaWdpbiIsCgkJCQkJCSJQcmlvcml0eSI6ICJ1PTAiLAoJCQkJCQkiUHJhZ21hIjogIm5vLWNhY2hlIiwKCQkJCQkJIkNhY2hlLUNvbnRyb2wiOiAibm8tY2FjaGUiCgkJCQkJfQoJCQkJfSk7CgoJCQkJY29uc3QgdGV4dCA9IGF3YWl0IHVwbG9hZFNlZ21lbnQudGV4dCgpOwoJCQkJY29uc3QgbGlua1JlZ2V4ID0gL2h0dHBzOlwvXC9hbm9uZHJvcFwubmV0XC8oXGQrKS9nbTsKCQkJCWNvbnN0IG1hdGNoID0gbGlua1JlZ2V4LmV4ZWModGV4dCk7CgkJCQlpZiAoIW1hdGNoKSB0aHJvdyBuZXcgRXJyb3IoIk5vIGxpbmsgZm91bmQgaW4gcmVzcG9uc2UiKTsKCgkJCQljb25zdCBsYXN0U2xhc2ggPSBlbGVtZW50LnVyaS5sYXN0SW5kZXhPZignLycpOwoJCQkJY29uc3QgZmlsZSA9IGVsZW1lbnQudXJpLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKS5zcGxpdCgnPycpWzBdOwoKCQkJCXJldHVybiB7CgkJCQkJZHVyYXRpb246IGVsZW1lbnQuZHVyYXRpb24sCgkJCQkJdXJpOiBgaHR0cHM6Ly9hbm9uZHJvcC5uZXQvJHttYXRjaFsxXX0vJHtmaWxlfT9kb3dubG9hZD10cnVlYCwKCQkJCX07CgkJCX0gY2F0Y2ggKGVycm9yKSB7CgkJCQljb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBsb2FkIHNlZ21lbnQgJHtlbGVtZW50LnVyaX06YCwgZXJyb3IpOwoJCQkJLy8gU3RpbGwgcmV0dXJuIGEgcGxhY2Vob2xkZXIgdG8gcHJlc2VydmUgaW5kZXgKCQkJCXJldHVybiB7CgkJCQkJZHVyYXRpb246IGVsZW1lbnQuZHVyYXRpb24sCgkJCQkJdXJpOiBudWxsLAoJCQkJfTsKCQkJfQoJCX0pOwoKCQkvLyBXYWl0IGZvciBhbGwgcHJvbWlzZXMgaW4gb3JkZXIKCQlyZXNwb25zZS5kYXRhID0gYXdhaXQgUHJvbWlzZS5hbGwodXBsb2FkUHJvbWlzZXMpOwoKCQlyZXR1cm4gUmVzcG9uc2UuanNvbihyZXNwb25zZSk7Cgl9LAp9Owo=/JylbMF19P2Rvd25sb2FkPXRydWVgLAoJCQkJfSk7CgkJCX0gY2F0Y2ggKGVycm9yKSB7CgkJCQljb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBsb2FkIHNlZ21lbnQgJHtlbGVtZW50fTpgLCBlcnJvcik7CgkJCX0KCQl9CgkJcmV0dXJuIFJlc3BvbnNlLmpzb24ocmVzcG9uc2UpOwoJfSwKfTs=`;
3const text = "";
4export default async function(interval: Interval) {
5const key = "259ce0d6791172167d9e8fc5142f598835c321d9e64b725df947a293d23d53cd";
6const uuid = "3f34ee19-7f0a-4a45d-589e-0a19f2780e53";
telegramBotStartermessage.tsx3 matches
11* Retrieve messages for a specific user from blob storage
12*/
13async function getMessages(userId: string): Promise<Message[]> {
14try {
15const messages = await blob.getJSON(`messages:${userId}`) as Message[];
23* Store a message in the database using Val Town's blob storage
24*/
25export default async function storeMessage(
26userId: string,
27userName: string,
55}
5657// notify admin function
adportalcontinue.html8 matches
231const imageUploadLog = document.getElementById('imageUploadLog');
232
233// Helper function to log to UI
234function logToUI(message) {
235console.log(`[CLIENT] ${message}`);
236const logEntry = document.createElement('div');
241}
242
243// Helper function to format file size
244function formatFileSize(bytes) {
245if (bytes < 1024) return bytes + ' bytes';
246else if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' KB';
381
382// Reset image upload form
383function resetImageUpload() {
384imageUploadInput.value = '';
385selectedFileName.textContent = 'No file selected';
391
392// Load images for this submission
393async function loadImages() {
394logToUI(`Loading images for submission: ${submissionId}`);
395try {
447
448// Render images in the list
449function renderImages(images) {
450logToUI(`Rendering ${images.length} images in gallery`);
451imagesList.innerHTML = '';
493
494// Delete an image
495async function deleteImage(imageId) {
496if (!confirm('Are you sure you want to delete this image?')) {
497logToUI(`Deletion canceled for image: ${imageId}`);
163
164// Store the image
165console.log(`[SERVER] Calling storeImage function`);
166const metadata = await storeImage(
167uint8Array,
adportalimage-storage.ts8 matches
1516// Generate a unique ID for an image
17export function generateImageId(submissionId: string): string {
18const timestamp = Date.now().toString(36);
19const randomPart = Math.random().toString(36).substring(2, 8);
2223// Store an image in blob storage
24export async function storeImage(
25imageData: Uint8Array, // Raw image data
26fileName: string,
8586// Get an image from blob storage
87export async function getImage(imageId: string): Promise<Uint8Array | null> {
88try {
89console.log(`[BLOB STORAGE] Retrieving image with ID: ${imageId}`);
104105// Get image metadata
106export async function getImageMetadata(imageId: string): Promise<ImageMetadata | null> {
107try {
108console.log(`[BLOB STORAGE] Retrieving metadata for image: ${imageId}`);
123124// List all images for a submission
125export async function listSubmissionImages(submissionId: string): Promise<ImageMetadata[]> {
126try {
127console.log(`[BLOB STORAGE] Listing images for submission: ${submissionId}`);
160161// Delete an image and its metadata
162export async function deleteImage(imageId: string): Promise<boolean> {
163try {
164console.log(`[BLOB STORAGE] Deleting image with ID: ${imageId}`);
177}
178179// Test blob storage functionality
180export async function testBlobStorage(submissionId: string): Promise<{success: boolean, message: string, data: any}> {
181try {
182console.log(`[BLOB STORAGE TEST] Starting test for submission: ${submissionId}`);
telegramBotStarterindex.ts2 matches
1// ============================================================
2// CORE FUNCTIONALITY
3// ============================================================
411* Expose this as an HTTP endpoint in Val.town
12*/
13export default async function handleTelegramWebhook(req) {
14try {
15// Ensure the request is a POST request
blob_adminapp.tsx7 matches
10}
1112function Tooltip({ children, content }: TooltipProps) {
13const [isVisible, setIsVisible] = useState(false);
14const tooltipRef = useRef<HTMLDivElement>(null);
49}
5051function formatBytes(bytes: number, decimals = 2) {
52if (bytes === 0) return "0 Bytes";
53const k = 1024;
58}
5960function copyToClipboard(text: string) {
61navigator.clipboard.writeText(text).then(() => {
62console.log("Text copied to clipboard");
66}
6768function ActionMenu({ blob, onDownload, onRename, onDelete, onMoveToPublic, onMoveOutOfPublic }) {
69const [isOpen, setIsOpen] = useState(false);
70const menuRef = useRef(null);
7374useEffect(() => {
75function handleClickOutside(event) {
76if (menuRef.current && !menuRef.current.contains(event.target)) {
77event.stopPropagation();
155}
156157function BlobItem({ blob, onSelect, isSelected, onDownload, onRename, onDelete, onMoveToPublic, onMoveOutOfPublic }) {
158const [isLoading, setIsLoading] = useState(false);
159const decodedKey = decodeURIComponent(blob.key);
216}
217218function App({ initialEmail, initialProfile, sourceURL }) {
219const encodeKey = (key: string) => encodeURIComponent(key);
220const decodeKey = (key: string) => decodeURIComponent(key);
8- Form to collect company name and email
9- SQLite database storage for submissions
10- Email functionality to send users a unique link
11- Continuation page for adding more information
12- Image upload and storage functionality
1314## Project Structure
16- `index.ts` - Main HTTP endpoint and route handling
17- `database.ts` - SQLite database operations
18- `email.ts` - Email sending functionality
19- `utils.ts` - Helper functions
20- `landing.html` - Main landing page
21- `continue.html` - Page for adding additional information
22- `image-storage.ts` - Image storage and retrieval functionality
2324## Database Schema