Compare commits
	
		
			7 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 715e4559aa | |||
| d42c245c9d | |||
| ff840299d6 | |||
| f69c93ba91 | |||
| c0f2430590 | |||
| c999a500f8 | |||
| c668bb83f5 | 
| @@ -1,20 +1,9 @@ | ||||
| FROM oven/bun:1.0.25-slim as builder | ||||
| WORKDIR /app | ||||
|  | ||||
| # Copy package files | ||||
| COPY package*.json ./ | ||||
| COPY bun.lockb ./ | ||||
| COPY dist dist | ||||
| COPY nginx.conf /etc/nginx/conf.d/default.conf | ||||
|  | ||||
| # Install dependencies | ||||
| RUN bun install | ||||
|  | ||||
| # Copy source files | ||||
| COPY . . | ||||
|  | ||||
| # Build the application | ||||
| RUN bun run build | ||||
|  | ||||
| # Production stage | ||||
| FROM nginx:alpine | ||||
| COPY --from=builder /app/dist /usr/share/nginx/html | ||||
| COPY nginx.conf /etc/nginx/conf.d/default.conf | ||||
|   | ||||
| @@ -74,6 +74,13 @@ export const SignatureCard = ({ signature, onDelete, onUpdate }: SignatureCardPr | ||||
|               <h3 className="text-white font-medium text-lg"> | ||||
|                 {signature.signame || 'Unnamed Signature'} | ||||
|               </h3> | ||||
|               {signature.note && ( | ||||
|                 <div className="mt-2"> | ||||
|                   <Badge variant="outline" className="bg-blue-900/50 text-blue-200 border-blue-500 px-3 py-1 text-sm font-semibold"> | ||||
|                     {signature.note} | ||||
|                   </Badge> | ||||
|                 </div> | ||||
|               )} | ||||
|             </div> | ||||
|              | ||||
|             {/* Additional Info */} | ||||
|   | ||||
| @@ -30,7 +30,8 @@ export const SignatureEditModal = ({ signature, isOpen, onClose, onSave }: Signa | ||||
| 		signame: signature.signame || "", | ||||
| 		dangerous: signature.dangerous || false, | ||||
| 		scanned: signature.scanned || "", | ||||
| 		identifier: signature.identifier || "" | ||||
| 		identifier: signature.identifier || "", | ||||
| 		note: signature.note || "" | ||||
| 	}); | ||||
| 	const [isLoading, setIsLoading] = useState(false); | ||||
|  | ||||
| @@ -45,7 +46,8 @@ export const SignatureEditModal = ({ signature, isOpen, onClose, onSave }: Signa | ||||
| 				type: formData.type === "unknown" ? undefined : formData.type, | ||||
| 				signame: formData.signame || undefined, | ||||
| 				dangerous: formData.dangerous, | ||||
| 				scanned: formData.scanned || undefined | ||||
| 				scanned: formData.scanned || undefined, | ||||
| 				note: formData.note || undefined | ||||
| 			}); | ||||
| 			onClose(); | ||||
| 			toast({ | ||||
| @@ -71,7 +73,8 @@ export const SignatureEditModal = ({ signature, isOpen, onClose, onSave }: Signa | ||||
| 			signame: signature.signame || "", | ||||
| 			dangerous: signature.dangerous || false, | ||||
| 			scanned: signature.scanned || "", | ||||
| 			identifier: signature.identifier || "" | ||||
| 			identifier: signature.identifier || "", | ||||
| 			note: signature.note || "" | ||||
| 		}); | ||||
| 		onClose(); | ||||
| 	}; | ||||
| @@ -152,6 +155,18 @@ export const SignatureEditModal = ({ signature, isOpen, onClose, onSave }: Signa | ||||
| 						/> | ||||
| 					</div> | ||||
|  | ||||
| 					{/* Note Field - Add before the Dangerous Flag */} | ||||
| 					<div className="space-y-2"> | ||||
| 						<Label htmlFor="note" className="text-slate-200">Important Note</Label> | ||||
| 						<Input | ||||
| 							id="note" | ||||
| 							value={formData.note} | ||||
| 							onChange={(e) => setFormData(prev => ({ ...prev, note: e.target.value }))} | ||||
| 							placeholder="Add important information about this signature" | ||||
| 							className="bg-slate-700 border-slate-600 text-slate-200" | ||||
| 						/> | ||||
| 					</div> | ||||
|  | ||||
| 					{/* Dangerous Flag */} | ||||
| 					<div className="flex items-center justify-between"> | ||||
| 						<Label htmlFor="dangerous" className="text-slate-200">Dangerous</Label> | ||||
|   | ||||
| @@ -117,6 +117,11 @@ export const SignatureListItem = ({ signature, onDelete, onUpdate }: SignatureLi | ||||
| 									</Badge> | ||||
| 								)} | ||||
| 							</h3> | ||||
| 							{signature.note && ( | ||||
| 								<Badge variant="outline" className="bg-blue-900/50 text-blue-200 border-blue-500 px-2 py-0.5 text-sm font-semibold ml-2"> | ||||
| 									{signature.note} | ||||
| 								</Badge> | ||||
| 							)} | ||||
| 						</div> | ||||
| 					</div> | ||||
|  | ||||
|   | ||||
| @@ -107,6 +107,7 @@ export type SignatureRecord = { | ||||
| 	id: string | ||||
| 	identifier: string | ||||
| 	name?: string | ||||
| 	note?: string | ||||
| 	scanned?: string | ||||
| 	system: RecordIdString | ||||
| 	type?: string | ||||
| @@ -118,6 +119,7 @@ export type SigviewRecord = { | ||||
| 	dangerous?: boolean | ||||
| 	id: string | ||||
| 	identifier: string | ||||
| 	note?: string | ||||
| 	scanned?: string | ||||
| 	signame?: string | ||||
| 	sysid?: RecordIdString | ||||
|   | ||||
| @@ -22,6 +22,7 @@ export const SystemView = () => { | ||||
|   } | ||||
|  | ||||
|   const saveSignature = async (signature: Signature): Promise<void> => { | ||||
|     console.log(signature); | ||||
|     try { | ||||
|       // Check if signature already exists | ||||
|       let existingRecord: SignatureRecord | null = null; | ||||
| @@ -34,7 +35,7 @@ export const SystemView = () => { | ||||
|       const newScannedPercentage = parseScannedPercentage(signature.scanned); | ||||
|  | ||||
|       if (existingRecord) { | ||||
|         const updatedSignature: Pick<SignatureRecord, 'updated' | 'type' | 'name' | 'scanned'> = { | ||||
|         const updatedSignature: Pick<SignatureRecord, 'updated' | 'type' | 'name' | 'scanned' | 'note'> = { | ||||
|           updated: new Date().toISOString() | ||||
|         } | ||||
|         // Existing record has no type and our new signature has a type | ||||
| @@ -47,6 +48,8 @@ export const SystemView = () => { | ||||
|         const existingScannedPercentage = parseScannedPercentage(existingRecord.scanned); | ||||
|         if (newScannedPercentage >= existingScannedPercentage) | ||||
|           updatedSignature.scanned = signature.scanned; | ||||
|         if (!!!existingRecord.note && !!signature.note) | ||||
|           updatedSignature.note = signature.note; | ||||
|         await pb.collection('signature').update(existingRecord.id, updatedSignature); | ||||
|         console.log(`Updated signature ${signature.identifier}: ${existingScannedPercentage}% -> ${newScannedPercentage}%`); | ||||
|       } else { | ||||
| @@ -57,7 +60,8 @@ export const SystemView = () => { | ||||
|           name: signature.signame, | ||||
|           type: signature.type, | ||||
|           dangerous: signature.dangerous, | ||||
|           scanned: signature.scanned | ||||
|           scanned: signature.scanned, | ||||
|           note: signature.note | ||||
|         }); | ||||
|         console.log(`Created new signature ${signature.identifier} with ${newScannedPercentage}% scan`); | ||||
|       } | ||||
| @@ -70,10 +74,10 @@ export const SystemView = () => { | ||||
|   const deleteSignature = async (signatureId: string): Promise<void> => { | ||||
|     try { | ||||
|       await pb.collection('signature').delete(signatureId); | ||||
|        | ||||
|  | ||||
|       // Invalidate queries to refresh the data | ||||
|       queryClient.invalidateQueries({ queryKey: ['signatures', system] }); | ||||
|        | ||||
|  | ||||
|       toast({ | ||||
|         title: "Signature Deleted", | ||||
|         description: "The signature has been successfully deleted.", | ||||
| @@ -93,14 +97,14 @@ export const SystemView = () => { | ||||
|     try { | ||||
|       // Get the system ID for the current system | ||||
|       const systemId = await getSystemId(system); | ||||
|        | ||||
|  | ||||
|       console.log('Updating signature:', { | ||||
|         identifier: updatedSignature.identifier, | ||||
|         systemId, | ||||
|         system, | ||||
|         updatedSignature | ||||
|       }); | ||||
|        | ||||
|  | ||||
|       // Find the signature by identifier and system | ||||
|       const existingRecord = await pb.collection('signature').getFirstListItem( | ||||
|         `identifier='${updatedSignature.identifier}' && system='${systemId}'` | ||||
| @@ -125,14 +129,17 @@ export const SystemView = () => { | ||||
|       if (updatedSignature.scanned !== undefined) { | ||||
|         updateData.scanned = updatedSignature.scanned; | ||||
|       } | ||||
|       if (updatedSignature.note !== undefined) { | ||||
|         updateData.note = updatedSignature.note; | ||||
|       } | ||||
|  | ||||
|       console.log('Update data:', updateData); | ||||
|  | ||||
|       await pb.collection('signature').update(existingRecord.id, updateData); | ||||
|        | ||||
|  | ||||
|       // Invalidate queries to refresh the data | ||||
|       queryClient.invalidateQueries({ queryKey: ['signatures', system] }); | ||||
|        | ||||
|  | ||||
|       toast({ | ||||
|         title: "Signature Updated", | ||||
|         description: "The signature has been successfully updated.", | ||||
| @@ -199,7 +206,7 @@ export const SystemView = () => { | ||||
|         } | ||||
|  | ||||
|         // Turn off clean mode after use | ||||
|         setCleanMode(false); | ||||
|         // setCleanMode(false); | ||||
|       } | ||||
|  | ||||
|       // Save all new/updated signatures | ||||
|   | ||||
| @@ -1,5 +1,28 @@ | ||||
| import { SigviewRecord as Signature } from "@/lib/pbtypes"; | ||||
|  | ||||
| const fourOutOfTen = [ | ||||
|   "Angel Cartel Occupied Mining Colony", | ||||
|   "Mul-Zatah Monastery", | ||||
|   "Guristas Scout Outpost", | ||||
|   "Sansha's Nation Occupied Mining Colony", | ||||
|   "Serpentis Phi-Outpost", | ||||
|   "Drone Infested Mine", | ||||
| ]; | ||||
| const fiveOutOfTen = [ | ||||
|   "Angel's Red Light District", | ||||
|   "Blood Raider Psychotropics Depot", | ||||
|   "Guristas Hallucinogen Supply Waypoint", | ||||
|   "Sansha's Nation Neural Paralytic Facility", | ||||
|   "Serpentis Corporation Hydroponics Site", | ||||
|   "Outgrowth Rogue Drone Hive", | ||||
| ]; | ||||
| function isFourOutOfTen(signature: string): boolean { | ||||
|   return fourOutOfTen.some((s) => signature.includes(s)); | ||||
| } | ||||
| function isFiveOutOfTen(signature: string): boolean { | ||||
|   return fiveOutOfTen.some((s) => signature.includes(s)); | ||||
| } | ||||
|  | ||||
| export const parseSignature = (text: string): Omit<Signature, 'system' | 'id' | 'sysid'> | null => { | ||||
|   const parts = text.split('\t'); | ||||
|   if (parts.length < 4) return null; | ||||
| @@ -10,12 +33,23 @@ export const parseSignature = (text: string): Omit<Signature, 'system' | 'id' | | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   let note = ""; | ||||
|   const isFour = isFourOutOfTen(parts[3]); | ||||
|   if (isFour) { | ||||
|     note = "4/10"; | ||||
|   } | ||||
|   const isFive = isFiveOutOfTen(parts[3]); | ||||
|   if (isFive) { | ||||
|     note = "5/10"; | ||||
|   } | ||||
|  | ||||
|   return { | ||||
|     identifier: parts[0], | ||||
|     type: parts[2], | ||||
|     signame: parts[3], | ||||
|     scanned: parts.length > 4 ? parts[4] : undefined, | ||||
|     dangerous: false // TODO: Implement dangerous signature detection | ||||
|     dangerous: false, // TODO: Implement dangerous signature detection | ||||
|     note: note, | ||||
|   }; | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										15
									
								
								release.sh
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								release.sh
									
									
									
									
									
								
							| @@ -41,17 +41,8 @@ RELEASE_ID=$(echo $RELEASE_RESPONSE | awk -F'"id":' '{print $2+0; exit}') | ||||
| echo "Release ID: $RELEASE_ID" | ||||
|  | ||||
| echo "Uploading the things..." | ||||
| WINRELEASE="./build/windows/x64/runner/Release/" | ||||
| 7z a $WINRELEASE/$ZIP $WINRELEASE/* | ||||
| WINRELEASE="build/bin/signalerr.exe" | ||||
| curl -X POST \ | ||||
|   -H "Authorization: token $TOKEN" \ | ||||
|   -F "attachment=@$WINRELEASE/$ZIP" \ | ||||
|   "$GITEA/api/v1/repos/$REPO/releases/${RELEASE_ID}/assets?name=$ZIP" | ||||
| rm $WINRELEASE/$ZIP | ||||
|  | ||||
| ANDROIDRELEASE="./build/app/outputs/flutter-apk/" | ||||
| mv $ANDROIDRELEASE/app-release.apk $ANDROIDRELEASE/$APK | ||||
| curl -X POST \ | ||||
|   -H "Authorization: token $TOKEN" \ | ||||
|   -F "attachment=@$ANDROIDRELEASE/$APK" \ | ||||
|   "$GITEA/api/v1/repos/$REPO/releases/${RELEASE_ID}/assets?name=$APK" | ||||
|   -F "attachment=@$WINRELEASE" \ | ||||
|   "$GITEA/api/v1/repos/$REPO/releases/${RELEASE_ID}/assets?name=signalerr.exe" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user